🤔 계층형? 도메인형? 어떤 구조가 더 좋을까요?규모 있는 프로젝트를 진행하다 보면 하나의 문제에 자주 부딪히게 됩니다. 바로 내가 맡은 기능의 코드를 찾기 어려워진다는 점입니다. 수많은 Service 중에서 UserService를 찾고, Domain 패키지 안에서 User 클래스를 다시 찾는 과정은 꽤 번거롭습니다.이러한 불편함은 대부분 계층형 구조만 사용하는 데서 비롯된 문제입니다.프로젝트의 디렉터리 구조는 개발 생산성과 유지보수성에 큰 영향을 미칩니다.일반적으로 많이 사용되는 구조는 크게 두 가지로 나뉘는데, 바로 계층형 구조(Layered Architecture)와 도메인형 구조(Domain-Driven Design, DDD)입니다.🗂️ 계층형 구조 (Layered Architecture)계층..
🔍 findAll()에서 Optional>를 쓰지 않아도 되는 이유Spring 또는 MyBatis 기반 프로젝트를 개발하다 보면 Repository에서 데이터를 조회할 때 어떤 반환 타입을 써야 할지 고민할 수 있습니다. 특히, Optional>를 사용할까? List로 충분할까? 하는 문제는 많은 개발자들이 한 번쯤 마주하는 주제입니다.이번 글에서는 왜 findAll() 같은 목록 조회 메서드에서는 Optional>를 굳이 쓰지 않아도 되는지를 설명해 보겠습니다.✅ 단일 조회와 다중 조회의 차이 목적메서드 예시변환타입단일 조회findById(Long id)Optional다중 조회findAll()List 단일 조회에서는 해당 ID에 해당하는 데이터가 존재하지 않을 수 있기 때문에, Optional를 사용..
https://jwinjection.tistory.com/5 주차감면 키오스크(PyQT,Selenium)| 주차감면 키오스크내가 오자 마자 맡았던 업무 주차권 교부처음에는 주차권에 도장찍어서 교부하는 방식이었는데 그런데 몇달 지나서야주차권 없어지고 사이트를 하나 만들어서 온라인jwinjection.tistory.com사회복무요원 당시 주차감면 키오스크에 이어...| 식권관리시스템우리회사는 식권을 수기로 관리한다... 했다식권관리사이트를 하나 만들어야겠다 생각이 들었다.스프링 부트로 웹을 만들어 아이패드에서 접속했다.골때리는게 아이패드미니 1세대는 JS가 es5 까지밖에 안돼서 api요청시 xhr을 사용해야했다.이번에 회사에서 준 2025년 다이어리의 포장박스와 2024년도 국민은행 달력을 좀 곁들여서 ..
| 주차감면 키오스크내가 오자 마자 맡았던 업무 주차권 교부처음에는 주차권에 도장찍어서 교부하는 방식이었는데 그런데 몇달 지나서야주차권 없어지고 사이트를 하나 만들어서 온라인으로 할수있게 바꾼다고 했다좀 편해지는건가 싶었다.하지만옆자리 다른 공익형이 맘에 안드셨던 담당자는 나랑 그형의 업무를 바꾸셨고 나는 그렇게 등기를 맡게 됐다 그런데 종종 그형은 병가를 아끼지 말아야 한다며 연가 병가를 자주 쓰셨고 안오는날 마다 나 혼자 주차감면도 하고 등기 접수도 받고 바쁜날이 많았다. 온라인으로 시스템이 바꼈다지만 도장찍는 게 그냥 컴퓨터로 옮겨간 느낌이다 사람이 오면 내가 직접 주차관리서버에 들어가 감면신청을 눌러줘야했기때문이다 그리고 주차감면을 받으로 오는 사람들에 대한 코로나 감염위험도 있었기에 직접 키..
내가 복무중인 곳에서 이전 까지의 사회복무요원들은 일일이 수작업으로 업무를 해왔다 나는 이게 너무 시간이 아깝다는 생각이 들었다. 이 프로그램을 통해 매일 아침 데이터를 불러와서 엑셀로 열기를 누르고 이렇게 원본폴더에 저장하고 저 엑셀에 각각의 열을 하나하나 복사해서 이 양식에다가 하나씩 붙여놓고 수령대장이라는 폴더에 오늘날짜로 이름변경해서 저장한 후 수취인명에 있는 이름을 교직원한글파일에서 검색해 학과명을 찾아내서 해당 학과명으로 변경하고 확인이 끝난 행은 저렇게 ㅇ 동그라미를 넣어준후 학과를 그룹으로 노란색 그룹서식을 일일이 넣어주고 복사해주면 끝이다 등기가 2~30개면 할만했는데 입시기간이나 자격증신청기간 뭐 별별 이유로 100~200개가 들어온다..... 점심까지는 그냥 등기만 하다가 끝난다 이당..
1. 멜론어플과 작별인사를 한다 2. 원하는 노래를 재생목록에 저장한다 재생목록 없으면 새로하나 만든다. 3. 내 채널 - 재생목록에 들어간다 4. 재생목록의 제목을 눌러서 재생목록 페이지로 들어간다 5.이게 재생목목록 페이지이다 6.재생목록페이지의 링크를 복사한다 링크형식은 https://www.youtube.com/playlist?list=playlist?list=샬라샬라샬라샬라 이런식으로 되어있다 복사한후 파이썬을 켜주자 7.pip install pytube 로 pytube라이브러리를 설치한다 pip install pyautogui pip install moviepy 등등 필요한거 설치해준다 8. Playlist안에 복사했던 재생목록링크를 넣고 DOWNLOAD\_FOLDER 에는 노래를 저장할 폴더..
지금까지 등기번호 뒤에 4자리 혹은 6자리로 검색해서 체크를 했는데 이게 등기가 많을때에는 다른 등기번호의 중간부분과 겹치는 경우도 있어서 찾기를 여러번 눌러야 제대로 찾는 경우가 있었다 그리고 무엇보다 등기번호보고 숫자 키보드로 검색하는게 은근 귀찮고 비효율적이다 마침 안쓰는 웹캠이 생겨서 모든 등기우편에는 등기번호바코드가 존재한다! 그래서 웹캠을 바코드리더기로 사용하면 매우 편할것같았다 playsound는 에러가 계속떠서 그냥 winsound 이용했다 그리고 웹캠이 연결되어있지 않으면 실행이 되지 않는다 import cv2 import pyzbar.pyzbar as pyzbar import clipboard import pyautogui import winsound as ws #from playsou..
https://school.programmers.co.kr/learn/courses/30/lessons/120808 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 정답class Solution { public int[] solution(int numer1, int denom1, int numer2, int denom2) { int a = (numer1 * denom2) + (numer2 * denom1); int b = denom1 * denom2; int focus = 0; if(a>=b){ focus=b; //focus..
Java 컬렉션 프레임워크Java 컬렉션 프레임워크(Java Collections Framework, JCF)는 데이터를 효율적으로 저장, 관리, 검색하는 표준화된 방법을 제공하는 클래스와 인터페이스의 집합입니다. 이 프레임워크는 크게 Collection 계층과 Map 계층이라는 두 가지 메인 루트로 나뉩니다. 1.Collection 계층(단일 요소 저장)Collection 인터페이스는 단일 요소(데이터 값)의 그룹을 다루는 최상위 부모입니다. 이 계층은 데이터를 저장하는 방식과 규칙에 따라 List, Set, Queue 세 가지 주요 인터페이스로 분화됩니다.인터페이스특징중복허용순서 보장주요 구현 클래스List순서대로 저장되며, 인덱스를 통해 접근 가능OO(삽입 순서)ArrayList, LinkedLis..
Web Storage 완벽 정리: localStorage vs sessionStorage 차이점 분석프론트엔드 개발에서 사용자 데이터를 클라이언트에 저장하고 관리하는 것은 매우 중요합니다. 이때 활용되는 것이 바로 Web Storage API이며, 그 중심에는 localStorage와 sessionStorage가 있습니다. 이 둘은 비슷해 보이지만, 데이터의 영속성(Persistence)과 접근 범위에 결정적인 차이가 있습니다.이 포스팅에서는 localStorage와 sessionStorage의 공통점과 차이점을 명확히 비교하여, 어떤 상황에 어떤 스토리지를 사용해야 할지 확실히 이해할 수 있도록 정리했습니다.🔍 공통점: Web Storage의 특징localStorage와 sessionStorage는 ..
next()공백(스페이스/탭/개행)을 기준으로 다음 토큰 하나만 읽습니다.앞쪽 공백은 건너뜁니다.띄어쓰기가 있는 문자열은 중간에서 끊깁니다.import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); // 예시 입력(한 줄 또는 여러 줄 가능): // Hello world 123 System.out.print("토큰 3개를 읽습니다: "); String t1 = sc.next(); // "Hello" String t2 = sc.next(); // "world" ..
SELECT inet_server_addr() AS server_ip, inet_client_addr() AS client_ip, inet_server_port() AS port, version() AS pg_version, current_setting('TimeZone') AS tz, pg_postmaster_start_time() AS postgres_started_at, current_timestamp AS current_ts, clock_timestamp() AS wall_clock;