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

Jhs님의 프로필 이미지
Jhs

작성한 질문수

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

회원 수정 API

쿼리 로그 출력 관련 질문

해결된 질문

작성

·

24

·

수정됨

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오) 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예

[질문 내용]

  • MemberApiController.java

image.png
  • MemberService.java

image.png

 

쿼리 실행이 select - update - select가 로그에 출력될꺼라고 예상 했는데 실제 로그는 select - update 까지만 출력되는데 이유를 알 수 있을까요?

답변 1

0

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

JPA와 관련된 쿼리 로그 출력에 관해 질문 주셨네요. 주어진 상황에서는 첫 번째 memberService.update(id, request.getName()) 부분에서 SELECTUPDATE 쿼리가 발생하지만, 이후의 findOne(id) 메서드 호출 시 추가적인 SELECT 쿼리가 발생하지 않는 문제로 보입니다.

이 문제의 주된 이유는 JPA의 영속성 컨텍스트 때문입니다. JPA는 1차 캐시를 사용하여, 특정 엔티티가 영속성 컨텍스트에 존재하는 경우 데이터베이스 쿼리를 수행하지 않고 메모리에서 데이터를 가져옵니다. 이에 따라 데이터 클라이언트로부터 수신된 데이터를 직접 수정했다면 또는 해당 데이터가 이미 영속성 컨텍스트에 로드된 상태라면, 추가적인 SELECT 쿼리가 실행되지 않습니다.

추가적으로, OSIV(Open Session In View) 설정이 true인 경우 트랜잭션 범위를 넘어선 후에도 영속성 컨텍스트가 살아있어 데이터베이스와의 추가적인 통신을 발생시키지 않도록 동작할 수 있습니다.

다음의 유사한 사례들을 통해 더 많은 정보를 얻으실 수 있습니다:

  1. 트랜잭션 범위에 대한 이해: 트랜잭션에 의해 결정된 영속성 컨텍스트 범위에 관한 내용입니다.
  2. OSIV 설정과 관련된 문제들: OSIV로 인해 발생할 수 있는 문제에 관한 설명과 해결 방법.

이러한 설명들로 JPA 활용 중 겪는 캐시와 트랜잭션 관련 특성에 대한 이해를 돕기를 바랍니다.

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

Jhs님의 프로필 이미지
Jhs

작성한 질문수

질문하기