• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

트랜잭션 readonly 질문 드립니다.

20.07.04 01:03 작성 조회수 437

1

기선님 안녕하세요.

강의를 보던 중 트랜잭션 readonly 속성에 대해서 궁금증이 생겨서 질문 남겨 봅니다.

조회성 메소드에 @Transaction(readonly = true) 속성을 선언하면

내부적으로 플러시가 발생하지 않게 되고, 이로인해 더티체킹을 하지 않아 성능상 이점이 있다고 설명을 해주셨는데요.

제가 이해도가 부족해서 그런지 아래와 같은 궁금증이 생겼습니다.

- 단순 조회성인데 트랜잭션을 안걸면 안되나요?

- 트랜잭션을 걸지 않으면 플러시도 발생하지 않아서 위의 이점을 누릴 수 있지는 않나요?

- 영속 컨텍스트는 트랙잭션 별로 생성 되는 것이기 때문에 영속 컨텍스트의 이점을 누릴려면 트랜잭션을 사용 해야 되는 건가요?

    - 1차 캐시 등...

- 트랜잭션을 선언 하지 않으면 쿼리 조회시 영속화가 되지 않나요?

- 강의과 연관된 내용은 아니지만 트랜잭션 readonly 옵션을 알아보다가 블로그 글을 보고 잘 모르는 부분이 있어서 JPA 특성인지 궁금하여 질문 남겨 봅니다. 블로그에 (https://kwonnam.pe.kr/wiki/springframework/transaction) 아래와 같은 내용이 작성되어 있는데요. 이부분이 JPA 특성인 것인지... 어떤 상황에서 아래와 같이 동작이 되는지 궁금합니다.

단, 읽기 작업만 하더라도 트랜잭션을 걸어주는 것이 좋다. 트랜잭션을 걸지 않으면 모든 SELECT 쿼리마다 commit을 하기 때문에 성능이 떨어진다. 명시적으로 트랜잭션을 걸어주면 마지막에 명시적으로 commit을 해주면 되며, commit 횟수가 줄어서 성능이 좋아진다.

이해도가 부족한 상태라 질문이 일관성이 없이 질문을 드렸네요.

항상 좋은 강의 만들어 주셔서 감사합니다.

답변 2

·

답변을 작성해보세요.

0

박원영님의 프로필

박원영

질문자

2020.07.04

기선님 답변 감사 합니다. 덕분에 궁금했던 지점들이 해소되었습니다.

항상 좋은 강의 만들어 주셔서 감사합니다.

0

- 단순 조회성인데 트랜잭션을 안걸면 안되나요?

단순 조회 한건이면 트랜잭션 걸지 않아도 상관없습니다.

- 트랜잭션을 걸지 않으면 플러시도 발생하지 않아서 위의 이점을 누릴 수 있지는 않나요?

플러쉬라는게 객체의 상태 변화를 DB에 싱크를 맞추는건데요. 트랜잭션이 안걸려 있으면 DB 오퍼레이션 실행할 때 마다 바로바로 쿼리가 실행되니까 단순 조회 오퍼레이션에서는 크게 차이가 없습니다.

- 영속 컨텍스트는 트랙잭션 별로 생성 되는 것이기 때문에 영속 컨텍스트의 이점을 누릴려면 트랜잭션을 사용 해야 되는 건가요?

네 트랜잭션이 있어야 영속성 컨텍스트의 장점(1차 캐시, 더티 체킹, Write Behind 등)을 누릴 수 있습니다.

- 트랜잭션을 선언 하지 않으면 쿼리 조회시 영속화가 되지 않나요?

트랜잭션 바운더리 밖으로 나가면 Persistent 상태가 더이상 유지 되지 않습니다. JPA 사용해서 어떤 객체를 DB에서 가져왔을 때 아주 잠깐 해당 DB 오퍼레이션 실행한 동안만 Persistent 상태이고 해당 DB 오퍼레이션을 실행한 서비스나 컨트롤러의 메소드에서는 더이상 영속화 상태가 아닙니다.

- 강의과 연관된 내용은 아니지만 트랜잭션 readonly...

서비스에 있는 어떤 메소드에서 똑같은 쿼리를 두번한다고 가정해보죠. 댓글 목록을 전부 가져온 다음에 무슨 작업을 하고 그 다음에 또 댓글 목록을 가져오는데..만약에 그 중에 있는 작업 때문에 두번째 쿼리가 처음에 쿼리했던 내용하고 달라질 수도 있고 같을 수도 있는 상황이라면, 트랜잭션으로 묶지 않았으면 무조건 두번의 select 쿼리가 발생하겠지만, 트랜잭션으로 묶고 JPA가 영속성을 관리하게 한다면 두번쨰 쿼리가 첫번째 쿼리와 같은걸 조회하는지 판단한 이후에 쿼리를 발생시키기 때문에 경우에 따라서는 최초 한번의 select만 발생하는 최적화를 할 수 있습니다. (JPA의 기능인거죠)