읽기 전용 트랜잭션

한 줄 설정이 스프링, ORM, DB 엔진까지 내려가며 조회 경로를 가볍게 만든다

핵심은 "읽기만 한다"는 선언이 각 계층에서 쓰기 준비를 줄이거나 막는다는 점입니다.

@Transactional(readOnly = true) public List<Order> getOrdersByUser(Long userId)
공통 효과
쓰기 대비용 작업을 덜 한다

변경 추적, flush 준비, Undo 생성, DML 허용 여부가 모두 읽기 전용 기준으로 바뀝니다.

계층
무엇이 바뀌나
왜 체감되나
1
Spring Data JPA 읽기 전용 의도를 아래 계층으로 전달
Hibernate 쪽으로 읽기 힌트를 넘깁니다

@QueryHints 같은 최적화 힌트로 연결되고, 구성에 따라 읽기 레플리카로 라우팅할 수도 있습니다.

조회 요청이 처음부터 읽기 경로로 분기됩니다

서비스 메서드의 의도가 인프라까지 이어져 불필요한 쓰기 준비를 줄입니다.

2
JPA / Hibernate 영속성 컨텍스트를 더 가볍게 유지
Dirty Checking, 스냅샷, flush 부담을 줄입니다

엔티티 변경 여부를 적극적으로 추적하지 않아 메모리 사용과 flush 비용이 함께 낮아집니다.

조회 트랜잭션이 더 가볍게 끝납니다

읽기만 하는 메서드에서 변경 추적 오버헤드를 줄여 응답 경로를 단순화합니다.

3
DB 엔진 실제 읽기 전용 실행 규칙을 적용
엔진마다 쓰기 관련 작업을 최소화하거나 차단합니다

읽기 일관성은 유지하되, 쓰기 복구 준비나 DML 허용 여부를 읽기 전용 정책에 맞게 조정합니다.

운영 의미가 분명해집니다
InnoDB: Undo Log 부담 최소화
Oracle: DML 시도 시 즉시 오류