전체 글 114

[SPRING] @EventListener

1️⃣ EventListener란?@EventListener는 특정 이벤트가 발생했을 때 해당 이벤트를 처리할 메서드를 선언하는 애너테이션 Spring 내부에서는 Observer 패턴을 기반으로 동작하며, ApplicationEventPublisher를 통해 이벤트를 발행하고, 등록된 리스너에서 해당 이벤트를 처리 2️⃣ 구조이벤트 정의 – 단순 POJO 객체로 정의 가능이벤트 발행 – ApplicationEventPublisher로 이벤트 전파이벤트 리스너 등록 – @EventListener로 이벤트 처리 메서드 선언 3️⃣ 사용 예시1. 이벤트 클래스public class UserRegisteredEvent { private final Long userId; public UserRegist..

SPRING 2025.05.14

[SPRING] @TransactionalEventListener

1️⃣ TransactionalEventListener란?@TransactionalEventListener는 Spring의 이벤트 기반 프로그래밍에서,트랜잭션 커밋 이후에 이벤트를 처리하고자 할 때 사용@EventListner의 기능을 확장한 것 주문이 저장된 후 이메일을 보내는 작업을 하고 싶다면, 단순 @EventListener는 트랜잭션이 커밋되기 전에이벤트를 처리할 수 있어 위험, 이때 @TransactionalEventListener를 사용하면트랜잭션이 정상적으로 커밋된 이후에 이벤트를 처리 2️⃣ 사용 예시 1. 이벤트 클래스 public class OrderCompletedEvent { private final Long orderId; public OrderCompletedEve..

SPRING 2025.05.13

[SPRING] 트랜잭션(Transaction)

1️⃣ 트랜잭션이란?트랜잭션은 데이터베이스에서 여러 작업을 하나의 단위로 묶어 처리하는 것이때 여러 작업이 하나의 트랜잭션으로 처리되어야 하며,모두 성공하거나 모두 실패해야 함 ✅ 트랜잭션의 특징원자성(Atomicity): 트랜잭션은 하나의 단위로 처리되며, 모든 작업이 성공하거나 모두 실패일관성(Consistency): 트랜잭션의 실행 전후로 데이터베이스는 일관성 있는 상태를 유지격리성(Isolation): 동시에 실행되는 다른 트랜잭션의 영향을 받지 않고 독립적으로 실행지속성(Durability): 트랜잭션이 완료되면 그 결과는 영구적으로 반영 2️⃣ 트랜잭션 전파 속성(Propagation)트랜잭션 전파 속성은 트랜잭션이 다른 트랜잭션을 호출할 때 어떻게 동작할지를 정의 ✅ 전파 속성 종류1. ..

SPRING 2025.05.09

[250507 TIL] 플러스 주차 개인 과제 회고

🔍 LV.1 1.코드 개선 퀴즈 - @Transactional의 이해 : 에러로그를 확인하고 코드를 확인하니 트랜잭션이 readOnly= true로 되어있어서 saveTodo에 따로트랜잭션을 검사 2. 코드 추가퀴즈 - JWT의 이해 : 토큰에 닉네임 정보를 추가(claim) 3. 코드 개선 퀴즈 - JPA의 이해 : 날씨도 검색에 활용할 수 있도록 jpql로 리팩토링 4. 테스트 코드 퀴즈 - 컨트롤러 테스트의 이해 : 반환 상태메시지가 달러서 기대에 맞는 반환타입으로 결과를 변경 5. 코드 개선 퀴즈 - AOP의 이해 : 조건에 맞도록 Before 어노테이션을 활용해 changeUserRole전으로 순서 변경 🔍 LV.2 6. JPA Cascade : cascade ..

TIL 2025.05.07

[SPRING] 조건 검색 개선 (인덱싱, 파티셔닝, 분리 조회)

📝 실험 배경아래 포스트에서 최적 복합 인덱스로 성능 개선을 느낀적이 있었다. 이번에는 그걸 넘어서 파티셔닝으로 성능 개선을 느끼는게 목적이다.https://sukh115.tistory.com/84 [SPRING] 뉴스피드 인덱스 실전 테스트🔗 실험 배경 이전 포스트에서 updated_at, created_at, title 기준으로 인덱스를 생성하여 단일 조건 기반 조회 성능을 개선한 바 있습니다. 이번에는 실전에서 사용하는 쿼리를 사용해서 실험해보려sukh115.tistory.com 실전 호출 api : GET localhost:8080/todos-partitioned/search?title=할 일&nickname=seokhyeon1&startDate=2025-05-01T00:00:00&endDat..

SPRING 2025.05.02

[SPRING] 파티셔닝(Partitioning)

1️⃣ 파티셔닝이란?하나의 테이블을 여러 개의 논리적/물리적 파티션으로 나누는 기술즉, users라는 하나의 테이블을 내부적으로 파티션1, 파티션2, 파티션3 등으로 나눠서 저장하게 하는 MySQL의 기능2️⃣ 왜 쓰는가?목적설명쿼리 성능 향상조건에 맞는 파티션만 읽고 나머지는 무시 → partition pruning데이터 관리파티션 단위로 삭제, 백업, 유지관리 가능대용량에 강함1억 건 이상에서도 병목 완화 가능3️⃣ 사용 가능한 파티셔닝 종류유형설명예시RANGE값의 범위에 따라 나눔YEAR(created_at)LIST명시된 값에 따라 나눔user_role IN ('USER', 'ADMIN')HASH해시 함수로 균등 분산MOD(user_id, 4)KEY자동 해시 분산MySQL 내부 해시 사용4️⃣ 예시..

SPRING 2025.05.02

[SPRING] JPA로 테이블 객체 다루기

1️⃣ 테이블 객체 다루는 법 Cascade (영속성 전이)사용 위치→ 연관관계의 주인 반대편, 즉 @OneToMany, @OneToOne에서 사용→ 예: 게시글 - 첨부파일 → 게시글에 설정사용 조건엔티티 생명주기가 비슷하거나 동일해야 함다른 주체에서 동일 자식 객체에 전이 설정 금지종류옵션설명ALL전체 상태 전이PERSIST저장REMOVE삭제MERGE병합REFRESH갱신DETACH준영속추천 조합orphanRemoval = true + cascade = CascadeType.ALL→ 자식의 생명주기를 부모와 완전히 일치시킬 수 있음. Repository 없어도 삭제·저장 자동처리!orphanRemoval (고아 객체 제거)사용 위치@OneToMany, @OneToOne에서 사용설명리스트에서 자식 객체 ..

SPRING 2025.04.30

[250429 TIL] 배달 어플 아웃소싱 프로젝트 회고

1️⃣ 목표회원가입, 로그인, 토큰 재발급, 로그아웃, 회원탈퇴 기능을 구현소셜 로그인(Kakao, Naver)을 구현서버샌트이벤트(SSE)를 이용해 실시간 알림 기능을 구현2️⃣ 주요 구현 기능회원 기능일반 회원가입/로그인/탈퇴 처리.비밀번호 암호화, 이메일/닉네임 중복검사.소셜 로그인Kakao, Naver OAuth2 로그인 지원.소셜 타입별 이메일 중복검증 적용.JWT 인증 및 Redis RefreshToken 관리AccessToken/RefreshToken 발급 및 저장.토큰 재발급과 로그아웃 기능 지원.실시간 알림 기능주문 상태 변경 시 서버센트이벤트(SSE)를 통해 클라이언트에 알림 전송3️⃣ 배운 점JWT 인증과 Redis를 함께 사용해 안정적인 인증 시스템을 만들 수 있었다.OAuth2 기..

TIL 2025.04.29

[250425] 배달어플 알림(SSE) + 토큰 쿠키 리팩토링

1️⃣ 주문 상태 변경 시 알림(SSE) 기능 구현OrderService.patchOrderStatus() 내에서 NotificationService.sendOrderStatusNotification() 호출주문 상태 변경이 성공적으로 이뤄지면, 해당 사용자에게 SSE 알림 전송알림은 Notification 테이블에 저장되며, 이후 SSE 구독자에게 전송됨2️⃣ SseEmitter 기반 실시간 알림 구독 API/api/v1/notification/subscribe 엔드포인트 생성로그인 사용자만 접근 가능하도록 .authenticated() 설정 적용구독 성공 시 "SSE 연결 완료" 메시지 전송 (프론트 확인용)3️⃣ AccessToken을 쿠키에 저장하여 웹에서도 사용 가능하도록 개선Signin, Re..

TIL 2025.04.25