• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

트랜잭션 어노테이션 위치

22.06.25 00:56 작성 조회수 267

0

안녕하세요. 영한님. 항상 강의 잘 듣고 있습니다.
 
트랜잭션(@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 에서 조회를 하고 있습니다.)
 
감사합니다.
 

답변 1

답변을 작성해보세요.

1

안녕하세요. Moon Stephen님

JPA에서도 단순히 데이터를 읽기용도로만 사용할 때는 트랜잭션 없이 읽기가 가능합니다.

(참고로 JPA책 15.4.2 읽기 전용 쿼리와 성능 최적화 부분을 보시면 트랜잭션 밖에서 읽기라는 부분이 도움이 될 수 있습니다.)

따라서 말씀하신 것 처럼 최적화가 될 것 같아요. 그런데 DB 종류와 버전에 따라서 다를 수 있기 때문에 성능테스트를 먼저 수행하고 결정하시는 것을 권장합니다.

감사합니다.