SpringBoot
🍃 SpringBoot

배포시 spring-boot-devtools 비활성화

build.gradleplugins { id 'java' id 'org.springframework.boot' version '3.4.3' id 'io.spring.dependency-management' version '1.1.7'}group = 'com.yurapp'version = '0.0.1-SNAPSHOT'java { toolchain { languageVersion = JavaLanguageVersion.of(17) }}configurations { compileOnly { extendsFrom annotationProcessor }}repositories { mavenCentral()}dependencies { // S..

🍃 SpringBoot

Spring Boot | 패키지 구조(계층형 vs 도메인형)

🤔 계층형? 도메인형? 어떤 구조가 더 좋을까요?규모 있는 프로젝트를 진행하다 보면 하나의 문제에 자주 부딪히게 됩니다. 바로 내가 맡은 기능의 코드를 찾기 어려워진다는 점입니다. 수많은 Service 중에서 UserService를 찾고, Domain 패키지 안에서 User 클래스를 다시 찾는 과정은 꽤 번거롭습니다.이러한 불편함은 대부분 계층형 구조만 사용하는 데서 비롯된 문제입니다.프로젝트의 디렉터리 구조는 개발 생산성과 유지보수성에 큰 영향을 미칩니다.일반적으로 많이 사용되는 구조는 크게 두 가지로 나뉘는데, 바로 계층형 구조(Layered Architecture)와 도메인형 구조(Domain-Driven Design, DDD)입니다.🗂️ 계층형 구조 (Layered Architecture)계층..

🍃 SpringBoot

findAll()에서 Optional>를 쓰지 않아도 되는 이유

🔍 findAll()에서 Optional>를 쓰지 않아도 되는 이유Spring 또는 MyBatis 기반 프로젝트를 개발하다 보면 Repository에서 데이터를 조회할 때 어떤 반환 타입을 써야 할지 고민할 수 있습니다. 특히, Optional>를 사용할까? List로 충분할까? 하는 문제는 많은 개발자들이 한 번쯤 마주하는 주제입니다.이번 글에서는 왜 findAll() 같은 목록 조회 메서드에서는 Optional>를 굳이 쓰지 않아도 되는지를 설명해 보겠습니다.✅ 단일 조회와 다중 조회의 차이 목적메서드 예시변환타입단일 조회findById(Long id)Optional다중 조회findAll()List 단일 조회에서는 해당 ID에 해당하는 데이터가 존재하지 않을 수 있기 때문에, Optional를 사용..

포트폴리오
✍🏻 기록

식권관리 키오스크 만들기(1) - 웹페이지 제작

https://jwinjection.tistory.com/5 주차감면 키오스크(PyQT,Selenium)| 주차감면 키오스크내가 오자 마자 맡았던 업무 주차권 교부처음에는 주차권에 도장찍어서 교부하는 방식이었는데 그런데 몇달 지나서야주차권 없어지고  사이트를 하나 만들어서 온라인jwinjection.tistory.com사회복무요원 당시 주차감면 키오스크에 이어...| 식권관리시스템우리회사는 식권을 수기로 관리한다... 했다식권관리사이트를 하나 만들어야겠다 생각이 들었다.스프링 부트로 웹을 만들어 아이패드에서 접속했다.골때리는게 아이패드미니 1세대는 JS가 es5 까지밖에 안돼서 api요청시 xhr을 사용해야했다.이번에 회사에서 준 2025년 다이어리의 포장박스와 2024년도 국민은행 달력을 좀 곁들여서 ..

🐍 Python

주차감면 키오스크(PyQT,Selenium)

| 주차감면 키오스크내가 오자 마자 맡았던 업무 주차권 교부처음에는 주차권에 도장찍어서 교부하는 방식이었는데 그런데 몇달 지나서야주차권 없어지고  사이트를 하나 만들어서 온라인으로 할수있게 바꾼다고 했다좀 편해지는건가 싶었다.하지만옆자리 다른 공익형이 맘에 안드셨던 담당자는 나랑 그형의 업무를 바꾸셨고  나는 그렇게 등기를 맡게 됐다 그런데 종종 그형은 병가를 아끼지 말아야 한다며 연가 병가를 자주 쓰셨고 안오는날 마다 나 혼자 주차감면도 하고 등기 접수도 받고 바쁜날이 많았다. 온라인으로 시스템이 바꼈다지만 도장찍는 게 그냥 컴퓨터로 옮겨간 느낌이다 사람이 오면 내가 직접 주차관리서버에 들어가 감면신청을 눌러줘야했기때문이다 그리고 주차감면을 받으로 오는 사람들에 대한 코로나 감염위험도 있었기에 직접 키..

🐍 Python

우편업무 자동화(Excel Visual Basic, pyautogui)

내가 복무중인 곳에서 이전 까지의 사회복무요원들은 일일이 수작업으로 업무를 해왔다 나는 이게 너무 시간이 아깝다는 생각이 들었다. 이 프로그램을 통해 매일 아침 데이터를 불러와서 엑셀로 열기를 누르고 이렇게 원본폴더에 저장하고 저 엑셀에 각각의 열을 하나하나 복사해서 이 양식에다가 하나씩 붙여놓고 수령대장이라는 폴더에 오늘날짜로 이름변경해서 저장한 후 수취인명에 있는 이름을 교직원한글파일에서 검색해 학과명을 찾아내서 해당 학과명으로 변경하고 확인이 끝난 행은 저렇게 ㅇ 동그라미를 넣어준후 학과를 그룹으로 노란색 그룹서식을 일일이 넣어주고 복사해주면 끝이다 등기가 2~30개면 할만했는데 입시기간이나 자격증신청기간 뭐 별별 이유로 100~200개가 들어온다..... 점심까지는 그냥 등기만 하다가 끝난다 이당..

🐍 Python

[pytube] 유튜브영상을 mp3파일로 다운로드

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 에는 노래를 저장할 폴더..

🐍 Python

웹캠을 이용한 바코드리더기

지금까지 등기번호 뒤에 4자리 혹은 6자리로 검색해서 체크를 했는데 이게 등기가 많을때에는 다른 등기번호의 중간부분과 겹치는 경우도 있어서 찾기를 여러번 눌러야 제대로 찾는 경우가 있었다 그리고 무엇보다 등기번호보고 숫자 키보드로 검색하는게 은근 귀찮고 비효율적이다 마침 안쓰는 웹캠이 생겨서 모든 등기우편에는 등기번호바코드가 존재한다! 그래서 웹캠을 바코드리더기로 사용하면 매우 편할것같았다 playsound는 에러가 계속떠서 그냥 winsound 이용했다 그리고 웹캠이 연결되어있지 않으면 실행이 되지 않는다 import cv2 import pyzbar.pyzbar as pyzbar import clipboard import pyautogui import winsound as ws #from playsou..

최신 글
🚨 Error Log

리액트 npm start시 Invalid options object문제

문제npm start> react-scripts startInvalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options.allowedHosts[0] should be a non-empty string. 원인webpack-dev-server의 호스트 검증 로직 때문 해결.env.development.local 생성 후 아래 작성DANGEROUSLY_DISABLE_HOST_CHECK=true 후 npm start 하면 정상작동 원리react-scripts start → 내부에서 webpack-dev-server 실행webpack-dev-serve..

🤪 forfun

해피캠퍼스 첫 수익 후기!

해피캠퍼스 첫 수익 후기해피캠퍼스 판매 과정에 대해 먼저 말씀드리겠습니다.판매 자료 작성 정보처리기사도 그렇고 정보통신기사도 그렇고 단답형 문제들이 참 많습니다. 저는 항상 위와같이 엑셀을 만들어서 공부했는데요, 회사동료도 같은 자격증을 공부하길래 공유해줬는데 너무 편하다고 해주셔서 이 엑셀을 판매해봐야겠다는 생각을 했습니다. 자료의 상품성을 위해 엑셀을 조금 꾸미는 작업을 해줬습니다. 카테고리도 단답인지 다답인지 서술인지 약어인지 적었습니다. 빈칸을 입력하면 정답이 표시되게하는 기능을 넣는다거나 다양한 기능도 넣어줬습니다. 해피캠퍼스 판매자료 등록해피캠퍼스에 자료를 등록합니다. 여러 사이트가 많았는데 그냥 구글에 레포트 판매? 뭐 이런식으로 검색했을때 저에게 먼저 클릭됐던 사이트가 해피 캠퍼스였습니..

🐍 Python

Airflow를 활용한 postgresql 자동 파티션 생성 스케줄링

1. 함수생성postgre에서 먼저 파티션 생성 함수를 만들어야합니다.CREATE OR REPLACE FUNCTION "MEASURE".create_monthly_partition(target_date date) RETURNS void LANGUAGE plpgsqlAS $function$DECLARE start_date date := date_trunc('month', target_date); end_date date := start_date + interval '1 month'; partition_name text := format('meas_data_%s', to_char(start_date, 'YYYYMM'));BEGIN IF NOT EXISTS ( SELECT 1 FROM pg..

🐍 Python

Python 타입 힌트에서 tuple, list, dict

Python 타입 힌트에서 tuple, list, dict Python에서 타입 힌트(Type Hint)는 코드의 가독성과 안정성을 높여주는 도구입니다.특히 tuple, list, dict처럼 자료형 컨테이너의 타입 힌트를 쓸 때는 갯수 제약이 어떻게 적용되는지를 정확히 아는 게 중요합니다.이번 글에서는 아래 세 가지를 기준으로 비교해보겠습니다:tuple[타입1, 타입2, ...]list[타입]dict[KeyType, ValueType]✅ 1. tuple: 갯수 중요def get_user() -> tuple[str, int]: return ("Alice", 30)이 함수는 두 개의 값을 반환합니다.첫 번째는 str, 두 번째는 int갯수까지 정확히 맞아야 합니다❌ 예외 발생 예시get_user() ..

🐍 Python

Python 자주 쓰는 예외 클래스

자주 쓰는 예외 클래스예외 클래스설명ValueError값이 잘못된 경우TypeError타입이 잘못된 경우KeyError딕셔너리 키가 없을 때IndexError리스트 인덱스 범위 초과ZeroDivisionError0으로 나눴을 때RuntimeError일반적인 실행 오류 예외 발생시키기raise를 사용하면 됩니다. java의 throw같은 역할을 합니다. raise ValueError(f"지원하지 않는 주소: {address}")

이재원
깃든블로그