CUD
메소드가 아닌 Get
메소드는 @Transactional 어노테이션을 사용하지 않으면 되는데 @Transactional(readOnly=true)를 왜 사용하는지 궁금해졌습니다.
@Transactional(readOnly=true) 예제 코드
@Transactional(readOnly = true)
public TaskInfo getTask(Long taskId) {
Task foundTask = taskRepository.findById(taskId)
.orElseThrow(EntityNotFoundException::new);
return taskMapper.mapTaskEntityToTaskInfo(foundTask);
}
그래서 왜 쓰는데?
- 조회한 데이터를 return 한다고 해도 의도치 않게 데이터가 변경되는 일을 사전에 방지
- 스냅샷 저장, 변경 감지(dirty check)의 작업을 수행하지 않아 성능이 향상
- MySQL을 사용할 때 데이터가 날아가는 것을 방지하기 위해서 이중화 구성(master - Slave)을 하는 경우가 있는데 DB가 master와 slave로 나누어져 있다면 readOnly = true로 있는 경우에는 읽기 전용으로 master가 아닌 slave를 호출
- @Transactional(readOnly=true)가 있으면 READ에 대한 동작만 수행한다고 인지 → flush를 생략해서 성능 향상
참고
https://resilient-923.tistory.com/391