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..

최신 글
🐍 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}")

🐍 Python

Python 정규표현식 re.match 사용법

파이썬 re.match() 완전 정복파이썬에서 문자열을 분석하거나 필터링할 때 정규표현식(Regex)은 매우 유용한 도구입니다.그중에서도 re.match()는 문자열이 특정 형식으로 시작하는지 검사할 때 사용하는 함수입니다.이 글에서는 re.match()의 기본 개념부터 다양한 정규표현식 구성 요소, 실전 예제까지 하나하나 쉽게 설명해드리겠습니다.✅ re.match()란?re.match(pattern, string) 형태로 사용하며,문자열의 시작부터 pattern이 일치하는지 확인합니다.일치하면 Match 객체를 반환일치하지 않으면 None을 반환import rem = re.match(r'abc', 'abcdef')if m: print(m.group()) # 출력: 'abc'→ 문자열이 'abc'..

🐍 Python

Python 타입 힌트

1. 타입힌트란?타입 힌트(Type Hint)는 파이썬 3.5부터 도입된 문법으로,함수의 매개변수와 반환값에 자료형 정보를 명시하는 기능입니다.def greet(name: str) -> str: return "Hello, " + name name: str => 파라미터 name은 문자열(str)이어야 한다. -> str => 함수는 문자열을 반환한다. 2. 왜 타입 힌트를 써야할까요?이유설명✅ 코드 가독성협업 시 함수의 의도를 쉽게 파악할 수 있음✅ 코드 자동완성 향상VSCode, PyCharm에서 IDE가 똑똑하게 자동완성 제공✅ 정적 분석 가능mypy, pyright 등으로 오류 사전 탐지 가능✅ 대규모 프로젝트에 적합규모가 커질수록 타입 명시가 유지보수에 유리함 3. 기본 문..

이재원
깃든블로그