Skip to the content.

스프링 프레임워크 기반 백엔드 애플리케이션 개발 시 조회 전용 서비스 메서드에 @Transactional(readOnly = true) 옵션을 부여하는 것은 보편적인 관례(Best Practice)입니다.

단순히 “조회 성능이 좋아진다”를 넘어, 계층별(스프링, JPA/Hibernate, JDBC, DB)로 어떤 메커니즘을 통해 최적화가 이루어지는지 계층 구조별로 정밀 분석해보겠습니다.


1. ORM (JPA / Hibernate) 레이어 최적화

JPA를 사용하는 경우 @Transactional(readOnly = true)의 가장 큰 이점은 엔티티 스냅샷 미생성과 변경 감지(Dirty Checking) 비활성화입니다.

1) FlushMode.MANUAL 설정

2) 메모리 절약 (Snapshot 미저장)


2. Spring Framework & Transaction Manager 레이어

1) 트랜잭션 동기화 및 롤백 유무 판별 절차 간소화

2) Master-Replica 데이터베이스 동적 라우팅


3. JDBC Driver & Database 레이어 최적화

1) Connection.setReadOnly(true) 힌트 전송

2) DB 엔진 레벨의 락(Lock) 및 트랜잭션 ID 최소화


💡 결론 및 정리 표

계층 주요 최적화 메커니즘 성과
ORM (JPA) FlushMode.MANUAL 전환, Snapshot 미생성 Dirty Checking 차단, GC 부하 감소
Spring AbstractRoutingDataSource 연동 Replica DB로 읽기 쿼리 자동 분산
JDBC Connection.setReadOnly(true) 전달 드라이버 및 DB 커넥션 힌트 제공
Database Read-Only Transaction 지정 (trx_id 미발급) Undo Log 할당 및 락 오버헤드 제거