본문 바로가기

전체 글49

트랜잭션 전파 속성 & 격리 수준 1. 전파 속성전파 속성은 이미 트랜잭션이 있을 때, 새로 호출된 메서드가 그 트랜잭션에 어떻게 참여할지를 결정하는 옵션이다.이걸 이해 못하면 서비스 계층을 여러 개로 나눴을 때 동작을 설명 못 한다.1-1. REQUIRED가장 기본값이다.의미:현재 트랜잭션이 있으면 참여없으면 새로 시작즉 대부분의 서비스 메서드는 이 설정으로 충분하다.예:OrderService.createOrder()내부에서 PaymentService.pay() 호출둘 다 REQUIRED면 같은 트랜잭션으로 묶일 수 있다.1-2. REQUIRES_NEW의미:기존 트랜잭션이 있어도 잠시 중단새로운 독립 트랜잭션 시작예를 들어 주문 처리 중 로그를 반드시 남기고 싶을 때 쓸 수 있다.주문 트랜잭션은 실패해도, 감사 로그는 별도 트랜잭션으로.. 2026. 3. 26.
@Transactional의 동작 원리 스프링이 프록시 객체를 만들어서 메서드 호출 전후에 트랜잭션 시작/커밋/롤백 로직을 끼워 넣는 방식으로 동작한다.1. 동작 흐름예를 들어 서비스 메서드가 있다고 하자.OrderService.createOrder()이 메서드에 @Transactional이 붙어 있으면 실제 호출 구조는 이런 식으로 생각하면 된다.컨트롤러가 orderService.createOrder() 호출실제로는 OrderService 원본이 아니라 프록시 객체가 호출됨프록시가 트랜잭션 매니저를 통해 트랜잭션 시작원본 메서드 실행예외가 없으면 커밋특정 예외가 발생하면 롤백결과 반환즉 @Transactional은 마법이 아니라, 프록시가 부가 기능을 삽입한 것이다.2. 프록시 기반 AOP2-1. AOP란AOP는 관점 지향 프로그래밍이다.핵.. 2026. 3. 26.
외래키 기반 조회 모델로의 리팩토링 요약 (TL;DR)증상캐싱·페이징 적용이 까다로운 구조로 변하고 있었다.플레이리스트·음악 조회 API가 복잡해질수록 성능 예측이 어려워지고,원인조회 시점에 불필요한 연관 객체 로딩, N+1 문제 가능성, SQL 제어력 저하가 발생했다.JPA @OneToMany / @ManyToOne 중심의 관계 매핑 설계로 인해조치조회는 Repository의 명시적인 쿼리(Native Query / Projection)로 처리했다.객체 연관관계를 제거하고, 외래키(FK) 기반 조회 모델로 전환했다.결과캐싱·페이징·대량 조회 확장에 유리한 구조를 확보했다.조회 쿼리가 단순해지고 예측 가능해졌으며,문제 정의MusicPlace 프로젝트에서 플레이리스트(Playlist)와 음악(Music)은 처음에는 전형적인 JPA 관계 매핑.. 2025. 12. 20.
[2025] 회고록 졸업 후 느낌초·중·고를 거쳐 대학까지 다니는 동안 늘 “학생입니다”라고 자기소개를 해왔는데, 올해는 “취업 준비 중입니다”라고 말하게 되었다. 취업 준비하고 있다고 말하니 조금 어색하고, 괜히 뻘쭘하게 느껴지기도 했다.취업 준비를 하면서는 정해진 틀이 없고, 무엇을 할지 전부 스스로 결정해야 한다는 점이 이전과는 다르게 느껴졌다. 누군가가 정해준 일정이나 방향 없이, 온전히 내 선택에 따라 움직이는 시간이 색다르게 다가왔다.처음에는 혼자 공부하는 게 힘들어서 스터디에도 참여했지만, 시간이 지나면서 점점 혼자 필요한 것을 판단하고 준비하는 방식이 더 편하게 느껴지기 시작했다.면접> 처음 받았던 면접비 (아직 안 쓰고 기념으로 놔뒀습니다) 올해 가장 큰 성과를 하나 꼽자면, 실제 면접을 경험해봤다는 점인 .. 2025. 12. 18.
영상 일별 요약 API — 쿼리 성능 트러블슈팅 요약 (TL;DR)증상영상 일별 요약 API 호출 시 응답 지연(초기 관찰: TTFB ≈ 49ms → 최종 안정값 ≈ 26–30ms). 원인원래 쿼리가 ROW_NUMBER() OVER (...) 윈도우 함수 + 서브쿼리 구조로 인해 MySQL에서 Using filesort, Using temporary 를 유발했고, projection 타입/순서 불일치 문제도 있었음. 이로 인해 쿼리/매핑 오류(Argument type mismatch) 및 구조적 성능 저하 발생. 조치(1) projection 타입/순서 정렬 및 java.sql.Date 사용으로 매핑 오류 해결,(2) 윈도우 함수 제거 → GROUP BY + MAX(created_at) 패턴으로 리팩토링한 native query 적용,(3) 복합 인덱.. 2025. 12. 14.
Prometheus + Grafana 설정 시 사용한 주소 정리 Spring Boot, Prometheus, Grafana를 연동하면서 여러 URL을 다뤘다.특히 macOS·Linux·Windows·Docker Desktop 환경 차이 때문에처음에는 localhost 주소로 접근이 안 되는 문제가 있었고,해결 과정에서 왜 특정 주소를 써야만 하는지 자연스럽게 알게 되었다.이 글에서는 프로젝트 구축 과정에서 실제로 사용한 주소들을 정리한다.1. Spring Boot Actuator 주소✔ http://localhost:8081/actuator/prometheusSpring Boot가 Prometheus에게 제공하는 메트릭 엔드포인트.Prometheus는 push 방식이 아니라 pull 방식즉, Prometheus가 이 URL로 직접 접근해서 메트릭을 가져감actuato.. 2025. 11. 15.