본문 바로가기
회고/TIL

[TIL] 2025.12.10

by 세류오 2025. 12. 10.

@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = true)에 대한 정리

1. @Transactional — 트랜잭션의 시작점

Spring이 이 메서드를 만나는 순간:
트랜잭션을 시작할지
기존 트랜잭션을 이어 받을지
새 트랜잭션을 만들지
읽기 전용으로 동작할지
커밋/롤백 조건은 무엇인지 를 경정하는 설정파일 같은 것

2. propagation = Propagation.REQUIRES_NEW — 무조건 새로운 트랜잭션을 만들어라

✔ REQUIRES_NEW = 기존 트랜잭션이 있어도 끊고, 새로운 트랜잭션을 반드시 만든다.

REQUIRES_NEW를 언제 쓰나?
-> 1) 결제/주문 후 알림, 로그, 이력은 무조건 남겨야 할 때
메인 비즈니스(order)가 실패해도 로그/이력/메시지는 저장해야 하는 경우
-> 2) 외부 시스템 호출 기록을 반드시 저장해야 할 때
메인 트랜잭션 실패해도 “요청했던 기록” 자체는 남아야할 때

3. readOnly = true — 이 메서드는 조회만 하니까 DB가 최적화할 수 있도록 힌트를 준다

✔ readOnly = true 하면?
Hibernate(영속성 컨텍스트)가 dirty checking을 하지 않음
즉, 엔티티 변경 감지를 하지 않음
flush 작업이 사라짐 → 성능 좋아짐
데이터베이스에 따라 “read-only transaction” 힌트를 줄 수 있음
일부 DB에서는 락이 완화됨
성능 최적화가 가능함

언제 쓰나?

  • 조회 전용 서비스 (readQuery)
  • 통계 조회
  • 정합성과 상관없는 캐시 조회
  • 리스트 화면

정리: 두 옵션을 같이 쓰는 이유

  • 이 메서드는 “조회만 하는데”
  • “기존 트랜잭션의 영향을 받지 않아야 하고”
  • “독자적인 트랜잭션으로 실행되어야 하는 경우”

'회고 > TIL' 카테고리의 다른 글

[TIL] 2025.12.25 TDD에 대한 학습  (0) 2025.12.26
[TIL] 2025.12.19  (0) 2025.12.20
[TIL] 2025.12.18  (0) 2025.12.18
[TIL] 2025.09.30 화요일  (0) 2025.10.01