인프런 커뮤니티 질문&답변

11 1님의 프로필 이미지
11 1

작성한 질문수

스프링 DB 2편 - 데이터 접근 활용 기술

JPA 적용2 - 리포지토리 분석

테스트 메서드 save()와 쓰기 지연 관련해서

작성

·

17

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
ItemRepositoryTest를 실행하면 updateItem()는 update 쿼리가 실행되지 않지만 save()는 insert 쿼리가 로그로 보이더라고요.

 

JPA PPT에 나와 있는 트랜잭션을 지원하는 쓰기 지연 - INSERT

이 내용대로라면 save()를 해도 insert 쿼리가 안 보여야 할 것 같은데, 이건 관련 옵션을 켜야만 적용되는 건가요?

쓰기 지연이 안 되는 것이 디폴트이고, 옵션을 켜면 save()도 updateItem()과 마찬가지로 insert 쿼리가 안 보이게 되는 건가요?

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. 11 1님!

JPA에서의 “쓰기 지연”은 트랜잭션이 커밋될 때까지 INSERT나 UPDATE 같은 쿼리가 실제로 데이터베이스에 전달되지 않고, 영속성 컨텍스트에 저장되었다가 커밋 시점에 한꺼번에 처리되는 기능을 의미합니다.

하지만 여기서 헷갈리실 수 있는 부분은, JPA에서 엔티티의 ID 생성 전략에 따라 INSERT 쿼리가 실행되는 시점이 달라질 수 있다는 점입니다. 예를 들어:

  • IDENTITY 전략: 데이터베이스에 INSERT해야 자동 생성된 ID 값을 알 수 있으므로, 영속성 컨텍스트에 엔티티를 추가할 때 바로 INSERT 쿼리가 실행됩니다.
  • SEQUENCETABLE 전략: 영속성 컨텍스트에만 엔티티가 추가되고, 실제 INSERT 쿼리는 커밋 시점에 실행됩니다.

따라서 save()에서 INSERT 쿼리가 로그에 보이는 이유는 주로 IDENTITY 전략 때문입니다. 관련 옵션 없이도 기본적으로 이러한 동작을 가집니다. 반면 updateItem()의 경우, 변경 내역을 유지하고 있는 상태에서 트랜잭션 커밋 시점에 반영될 수 있습니다.

더 이해를 돕기 위해 유사한 질문을 찾았습니다:
- 쓰기 지연 질문입니다
- 안녕하세요 쓰기지연 -insert 장표의 설명에 관해 질문이 있습니다.

위 질문에 대한 답변과 게시물들도 참고하면 JPA의 쓰기 지연 메커니즘에 대한 이해에 도움이 될 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

11 1님의 프로필 이미지
11 1

작성한 질문수

질문하기