• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

QueryHint readonly 와 영속성 컨텍스트 질문

23.08.14 17:25 작성 조회수 197

0

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

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

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

[질문 내용]

MemberRepository

	/**
	 * JPA Hint
	 */
	@QueryHints(value = @QueryHint(name = "org.hibernate.readOnly", value = "true"))
	Member findReadOnlyByUsername(String username);

 

test

	@Test
	@Rollback(false)
	void findReadOnlyByUsername() {
		// given
		memberRepository.save(new Member("member1", 10));
		em.flush();
		em.clear();

		// when
		Member member = memberRepository.findReadOnlyByUsername("member1"); // 쿼리힌트로 readonly 설정
		member.setUsername("member2");

		em.flush(); // update 쿼리가 나가지 않음
		em.clear();

		System.out.println("member.getUsername() = " + member.getUsername());
	}

영한님이 설명해주신대로 update 쿼리가 나가지 않아서 실제 DB 상에는 member2 가 아닌 member1 이 들어가있음을 확인했습니다

그리고 em.clear() 로 영속성컨텍스트를 초기화 한 후, member 의 username 을 찍어봤는데 member2 가 찍히더라구요

저는 영속성 컨텍스트를 초기화했으므로, member 조회 시 DB 에서 가져오므로 member1 이 찍힐 것이라고 생각했는데 제 생각이 틀린 건가요?

 

아래는 출력로그 입니다

 

2023-08-14 17:17:17.797  INFO 15063 --- [           main] p6spy                                    : 23.08.14 17:17:17 | OperationTime 4 ms | statement | connection 3 

    select
        member0_.member_id as member_i1_0_,
        member0_.age as age2_0_,
        member0_.team_id as team_id4_0_,
        member0_.username as username3_0_ 
    from
        member member0_ 
    where
        member0_.username='member1'

member.getUsername() = member2

 

 

 

답변 1

답변을 작성해보세요.

0

y2gcoder님의 프로필

y2gcoder

2023.08.14

안녕하세요. HSC님, 공식 서포터즈 y2gcoder입니다.

HSC님께서 제가 모르는 테스트를 더 진행하셨을 수도 있지만, 지금 테스트 코드만 보고 말씀드리겠습니다.

em.clear() 후에 준영속 상태일 member 객체의 username을 조회하면 "member2"가 나오는게 맞다고 생각합니다. 자바 객체로는 값을 바꿨지만 db로 update 쿼리가 나가지 않은 상황이기 때문입니다.

제 생각에는 다시 db로부터 member를 조회해서 값을 비교해보는 것이 맞지 않나 생각합니다.

감사합니다.

HSC님의 프로필

HSC

질문자

2023.08.15

이해가 되었습니다 감사합니다!

y2gcoder님의 프로필

y2gcoder

2023.08.15

파이팅입니다!