em.find(), select문 질문
308
작성한 질문수 92
em.find(Member.class, 1L);
System.out.println("========================");
tx.commit();위 코드를 수행한 결과 select문 이후에 '========================'가 출력되었습니다.
em.find()를 하면 우선 1차 캐시에서 엔티티를 찾은 후, 없으면 바로 select문을 DB에 날리는 것이 맞을까요?
tx.commit()하는 시점과 관계없이 1차 캐시에 엔티티가 없으면 바로 select 쿼리를 날리는 것이 맞을까요?
답변 1
0
안녕하세요, 도토리님. 공식 서포터즈 y2gcoder 입니다.
먼저 테스트해주신 전체 코드가 있으면 제가 좀 더 정확하게 대답할 수 있을 것 같습니다.
보여주신 코드와 제가 해당 테스트 코드에 대해 약간의 추측을 한 상태에서 답변을 드려야 할 것 같습니다.
기본적으로 em.find()는 말씀하신대로 영속성 컨텍스트의 1차 캐시에서 먼저 엔티티를 조회하고, 해당 엔티티가 존재하지 않으면 DB에서 조회하는 것이 맞습니다.
위의 코드에서 영속성 컨텍스트를 아예 비운 후에 em.find()를 호출했다고 가정한다면, 말씀드린 절차에 따라 먼저 1차 캐시에서 해당 id를 가진 엔티티를 조회하고, 1차 캐시에 해당 id를 가진 엔티티가 존재하지 않기 때문에 테스트해보신 것처럼 먼저 select 문을 통해 DB에서 해당 엔티티를 조회합니다. 그래서 println() 전에 select 문에 대한 로그가 찍혔을 것으로 보입니다 :)
감사합니다.
0
em.persist(), em.remove(), 엔티티 업데이트는 tx.commit()하는 시점에 DB에 각각 insert, delete, update 쿼리가 전달된다고 알고 있습니다. 이들과 다르게 em.find()는 tx.commit()하는 시점이 아니라, em.find()하는 시점에 + 1차 캐시에 해당 엔티티가 없는 경우에 select 쿼리가 전달되는 것이 맞을까요??
0
맞습니다. EntityManager의 em.persist(), em.remove(), 그리고 엔티티 업데이트는 트랜잭션 커밋(tx.commit())하는 시점에 각각 insert, delete, update 쿼리가 DB로 전달됩니다. 이러한 동작은 변경을 묶어서 한 번에 데이터베이스에 적용하기 위한 것입니다.
반면에 em.find() 메서드는 트랜잭션 커밋 시점과 무관하게 호출되는 즉시 실행됩니다. 다음과 같은 순서로 동작합니다:
em.find()를 호출하면 먼저 1차 캐시에서 해당 엔티티를 찾습니다.1차 캐시에 엔티티가 없으면 데이터베이스에서 select 쿼리를 통해 엔티티를 찾습니다.
이러한 동작은 조회 작업을 즉시 수행하여 결과를 제공하기 위한 것입니다.
벌크연산에서 member.getAge 호출 시 영속성 컨텍스트에서 데이터를 가져오는건가요?
0
28
2
inheritance startegy 선택시 고려사항
0
22
1
Entity 동등성 비교
0
21
1
실무 조언 관련 질문입니다.
0
47
1
H2데이터베이스 파일 생성
0
56
2
서브쿼리 강의에서 ALL 예시 관련 질문드립니다.
0
53
2
수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?
0
52
1
JPQL 메소드와 락
0
55
1
Delivery @OneToOne
0
60
1
17강 4~5분대 테이블 값 조회가 안됩니다.
0
94
2
UnsupportedOperationException 발생
0
86
3
H2 Database 연결이 안됩니다.
0
95
2
연관관계 매핑 질문드립니다.
0
85
2
h2데이터베이스 실행오류
0
108
2
persistence.xml
0
108
2
양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?
0
80
1
영속성 컨텍스트
0
66
1
JPA 프록시
0
96
1
Native Query와 MyBatis
0
70
1
영속성 컨텍스트는 어떤 메모리에 저장되는건가요?
0
87
1
임베디드 타입 예시 코드 관련 질문
0
115
3
명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요
0
95
3
인텔리제이 패키지 커서 단축키 질문
0
108
2
혹시 현재는 ID 데이터 타입이 String이면 안되나요?
0
145
1





