inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 데이터 JPA

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

해결된 질문

827

박원영

작성한 질문수 1

1

기선님 안녕하세요.

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

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

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

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

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

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

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

    - 1차 캐시 등...

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

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

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

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

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

java JPA spring

답변 2

0

박원영

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

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

0

백기선

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

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

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

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

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

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

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

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

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

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

spring boot 2.7.13-SNAPSHOT trace 소문자 로그 안나옴

0

533

1

<스프링 데이터 Common: 기본 리포지토리 커스터마이징> 에 대한 질문

0

392

1

comment table에서 저장될떄 왜 id값이 2부터저장이되는건가요?

0

407

1

@EnableJpaRepositories 설정을 스프링부트가 어디에서 자동설정하나요?

0

450

0

PersistenceContext 관련 질문드립니다.

0

335

1

지금(Eager), 나중에(Lazy)의 의미를 모르겠습니다

0

338

1

transaction 구간이 길어질 경우의 처리방법 문의드립니다.

0

905

1

docker postgres

0

292

1

Multiple DataSource 사용 시 transaction 관련 질문 드립니다.

0

2908

1

entity 중 null이 아닌 필드만 update 할 방법이 있을까요?

0

1190

1

Eager 모드일 경우, join을 inner join으로 바꾸는 법이 있을까요?

0

385

1

엔티티를 상속받는 DTO가 일반적인가요?

1

1847

1

커스텀 타입 클래스를 String 타입 처럼 이용해 쿼리하는 방법에 대해 질문하고 싶습니다.

0

339

1

연관관계 매핑 어떤식으로 해야될지 감이 안잡힙니다.

0

566

4

EntityManager 주입시 Annotation관련 질문드립니다.

0

565

1

클래스 기반 프로젝션 사용 관련 질문

0

560

1

save 메서드 질문드립니다.

0

258

1

복잡한 통계쿼리도 JPA로 가능한가요?

2

5592

1

find 와 get의 차이가 무엇인가요?

0

890

1

실무에서 JPA 할 때 FK로 개발할때 연관관계를 꼭 맺어주어야 하나요?

0

998

1

\dt Did not find any relations.

0

481

1

소스코드는 어디서 볼 수 있을까요?

1

287

1

table 생성과 select 문에 대한 질문

0

174

1

스프링 데이터 RepositoryTest 관련 질문

0

2173

2