장바구니 Service를 개발하다가 @Transactional의 readOnly 속성에 대해 궁금해졌다.
현재 코드에서는 readOnly 속성을 사용하고 있다
@Transactional(readOnly=true) 하는 이유는? 장점?
@Override
@Transactional(readOnly = true)
public CartResponseDto getCart(UserAuth userAuth) {
User user = userService.findByUser(userAuth);
Cart cart = cartRepository.findByUserId(user.getId())
.orElseThrow(CartNotFoundException::new);
return CartResponseDto.from(cart);
}
기본적으로 @Transactional을 붙이면
- 트랜잭션을 시작하고
- 메서드가 끝나면 commit 또는 rollback을 수행한다.
즉, 읽기 + 쓰기가 가능하다.
데이터 변경(INSERT, UPDATE, DELETE)이 있으면 실제 DB에 반영한다.
그렇다면 readOnly = true를 속성으로 주는 이유는 무엇일까?
readOnly = true는 말 그대로 읽기 전용 트랜잭션으로 설정한다는 뜻이다.
보통 데이터를 조회할 때 사용한다.
💡 내부적으로 어떤 효과가 있는가?
- JPA / Hibernate에서는
- Flush(쓰기 작업 동기화)를 생략한다. → 성능 향상
- 1차 캐시를 최소화한다. (엔티티 변경 감지 안 함)
- 변경 감지(dirty checking)가 비활성화된다. → save() 같은 작업이 무시될 수 있다.
- DB 레벨에서는
- 일부 데이터베이스는 “읽기 전용 트랜잭션” 힌트를 전달받아 쓰기 명령(INSERT, UPDATE 등)을 차단하거나 최적화한다.
'Spring' 카테고리의 다른 글
| DB 동시성 문제 어떤 경우에 발생할까요? DB Lock의 종류 (0) | 2025.11.21 |
|---|---|
| 자주 사용하는 Lombok 생성자 어노테이션 (0) | 2025.10.23 |
| Dto와 @Builder에 대하여 (0) | 2025.10.06 |
| @ModelAttribute 언제 사용할까? (0) | 2025.03.24 |
| HTTP 상태코드에 대해 설명해주세요. (0) | 2024.08.29 |