inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

자바 ORM 표준 JPA 프로그래밍 - 기본편

플러시

안녕하세요 좋은 강의 감사합니다!

273

이충만

작성한 질문수 9

13

JPQL쿼리 실행 시 플러시가 자동으로 되는데 그렇다면 JPQL은 1차 캐시를 먼저 조회하지 않는 건가요?

java JPA

답변 1

18

김영한

안녕하세요. 충만님

질문하신 것 처럼 JPQL은 1차 캐시를 먼저 조회하지 않습니다. JPQL을 실행하면 항상 1차 캐시를 무시하고, 데이터베이스에 직접 SQL을 실행합니다.

그리고 실행 결과를 1차 캐시에 보관하고, 최종적으로 1차 캐시에 보관된 결과를 반환합니다.

이런 방식으로 동작하는 이유는 em.find(식별자) 처럼 단순하게 식별자를 조회하는 경우는 1차 캐시에 있는지 없는지 판별하기가 쉬운데, JPQL은 광범위하게 데이터를 찾기 때문에 이런 방식의 구현이 어렵습니다. 그래서 우선 데이터베이스에서 조회부터 하는 것이지요.

추가로 JPQL을 실행해서, 데이터베이스에서 결과를 가져 왔는데, 이미 1차 캐시에 동일한 식별자를 가진 엔티티가 있으면, 데이터베이스에서 가져온 엔티티를 버리고 1차 캐시에 있는 엔티티를 유지합니다. 이런방식 덕분에 JPQL을 사용해도 엔티티 동일성을 유지합니다.

궁금하신 내용이 있으면 언제든지 편하게 질문 주세요^^ 고맙습니다.

0

조태준

이미 1차 캐시에 동일한 식별자를 가진 엔티티가 있으면 말씀해주신 이 부분에서

단순히 식별자만 같은지를 확인하나요?

엔티티끼리도 서로 같은지는 확인 안하나요?

 

jpql때문에 flush()가 동작하게 되면서 1차 캐시 내용과 db랑 동기화를 시키기 때문에

1차 캐시에 있는 엔티티와 db에서 가져온 엔티티랑 같을 수 밖에 없을거 같은데 맞나요?

1

김영한

안녕하세요. 조태준님

영속성 컨텍스트(1차 캐시)에는 동일한 식별자를 가진 엔티티가 단 하나만 존재할 수 있습니다. 따라서 엔티티끼리 서로 같은지 비교하는 것은 크게 의미가 없습니다.

 

"jpql때문에 flush()가 동작하게 되면서 1차 캐시 내용과 db랑 동기화를 시키기 때문에 1차 캐시에 있는 엔티티와 db에서 가져온 엔티티랑 같을 수 밖에 없을거 같은데 맞나요?"

-> 네 맞습니다.

 

감사합니다.

inheritance startegy 선택시 고려사항

0

6

0

Entity 동등성 비교

0

14

1

실무 조언 관련 질문입니다.

0

41

1

H2데이터베이스 파일 생성

0

51

2

서브쿼리 강의에서 ALL 예시 관련 질문드립니다.

0

49

2

수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?

0

48

1

JPQL 메소드와 락

0

52

1

Delivery @OneToOne

0

57

1

17강 4~5분대 테이블 값 조회가 안됩니다.

0

89

2

UnsupportedOperationException 발생

0

82

3

H2 Database 연결이 안됩니다.

0

89

2

연관관계 매핑 질문드립니다.

0

82

2

h2데이터베이스 실행오류

0

105

2

persistence.xml

0

103

2

양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?

0

77

1

영속성 컨텍스트

0

62

1

JPA 프록시

0

90

1

Native Query와 MyBatis

0

63

1

영속성 컨텍스트는 어떤 메모리에 저장되는건가요?

0

83

1

임베디드 타입 예시 코드 관련 질문

0

112

3

명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요

0

91

3

인텔리제이 패키지 커서 단축키 질문

0

106

2

혹시 현재는 ID 데이터 타입이 String이면 안되나요?

0

137

1

양방향 연관관계 시 연관관계 주인을 설정하는 이유

0

68

1