트러블 슈팅 양식
[ 문제 원인 ]@Transactional(readOnly = true) 에서 cannot resolve methon 오류
[ 해결 방안 ]
1. org.springframework.transaction.annotation.Transactional --> 옵션을 허용(readonly=true? false) 가능
2. javax.transaction.Transactional --> 옵션을 허용하지 않음..
[ 참고 자료 ]
Transactional이 Dao 가 아닌 Service와 provider에 있는 이유?
(db를 직접 다루는 Dao가 트랜잭션에 더 적합하다고 생각했는데,,,)
성능적인 이점
해당 옵션인 경우 스프링 프레임워크가 하이버네이트 세션 플러시 모드를 MANUAL로 설정하기 때문에 강제로 플러시를 호출하지 않은 한 플러시가 일어나지 않아, CUD 작업이 동작하지 않고, 앞에 언급한대로 스냅샷 저장. 변경감지등의 작업을 수행하지 않아 성능이 향상된다.
또한, DB가 master와 slave로 나누어져 있다면 ReadOnly가 있는 경우 읽기전용으로 slave를 호출하게 된다. 즉, 상황에 따라 DB 서버의 부하를 줄일 수 있다.
해당 어노테이션이 있다면 우리는 해당 메서드는 READ에 대한 동작만 수행할 것이라고 예상하고 그리고 이루어진다. 여기서 난 객체지향으로 작업할때 가능한 경우 final을 두어 객체의 신뢰성을 보장하는것이 떠올랐다. 그리고 난 이 점이 중요하다고 느껴졌기에 해당 옵션에서 아무런 성능적 이점을 갖지 못한 경우라도 명시적으로 두어 계속 사용할 것 같다.