안녕하세요. 영한님. 항상 강의 잘 듣고 있습니다.
트랜잭션(@Transactional)의 위치를 소개해주실때, 클래스에 둘지 메소드에 둘지 인터페이스쪽에 둘지를 설명해주셨는데요.
만약에 단순 조회 쿼리에 대해 @Transactional 를 아예 쓰지 않는다면 권장할 만한 방법이 아닐까요?
기본적인 CRUD는 SimpleJpaRepository 구현에 의해 @Transactional이 이미 달려있지만 우리가 생성하는 query method에 @Transactional 을 달지 않으면, 명시적인 트랜잭션이 시작되지 않고 쿼리가 수행되는 것으로 확인했는데요(MySQL 경우 쿼리 앞뒤로 set autocommit 수행 X)
일반적으로 커넥션의 기본 autocommit 설정이 true 라서, 굳이 트랜잭션을 열지 않아도 MySQL은 autocommit이 켜져있다면 조회 쿼리 하나를 read-only 트랜잭션으로 간주하므로 데이터베이스 상의 최적화는 여전히 적용될 것으로 생각되고(1), 트랜잭션 여부에 따른 MySQL 벤치마크 상으로도 명시적으로 트랜잭션을 열지 않았을때가 열었을 때보다 두배 가까이 빠르다는 결과도 있는데요.(2)
JPA 상에서는 readOnly 옵션을 쓰는 것 대신, @Transactional 없이 조회 쿼리를 사용해도 아무런 문제가 없을 지, 이렇게 사용하는 경우가 흔한지 궁금해서 질문 드립니다. (@Transactional(readOnly=true) 가 없으면 replica datasource를 사용하기 어려울 것 같지만, 복제지연 이슈를 피하고자 현재 master 에서 조회를 하고 있습니다.)
감사합니다.