영속 컨텍스트에서 flush가 발생하는 위치 혹은 순서
362
작성한 질문수 3
3강 영속성 관리를 공부하다가 flush에 관해 궁금한게있어 질문남깁니다.
3강 강의자료에서 21페이지를 보시면 트랜잭션이 커밋될 때, flush가 발생하는것을 설명하면서 '2.flush'가 영속 컨텍스트에서 DB를 향하고있습니다.
그런데 23페이지 변경감지에서 flush가 발생하는것을 설명할때 그림을 보면, '1.flush()'가 바깥에서 영속 컨텍스트를 향하고있고, '4.flush'가 쓰기 지연 SQL 저장소에서 DB를 향하고있습니다.
Q1. 전자(21페이지)는 flush가 한 번 발생하는데, 후자(23페이지)는 두 번 발생합니다. 둘 다 커밋할 때 발생하는건데 왜 차이가있는지 궁금합니다. 사실상 후자처럼 두 번 발생하는게 맞다고 보면 되나요?
Q2. 변경감지 설명에서의 '1.flush()'가 바깥에서 영속 컨텍스트를 향하고있습니다. 이는 변경감지에서 가장 먼저 flush()가 발생한것인데, flush는 쿼리를 날리며 "영속성 컨텍스트의 변경내용을 데이터 베이스에 반영"하는것이라고 배웠습니다. 그럼 결국 더티체킹이 일어나기 전, 쿼리가 처음부터 날라가는건가요? 그렇다면 사실상 쿼리가 두 번 날라가는 건가요?
아니라면 이 '1.flush()'는 뭔가요?
답변 1
0
안녕하세요, 인프런 AI 인턴이에요.
Q1. 둘 다 커밋할 때 flush가 발생하는 것이지만, 23페이지에서 언급된 flush는 쓰기 지연 SQL 저장소에 있는 내용들을 DB에 반영하는 작업입니다. 이 작업은 엔티티 영속성 컨텍스트와는 조금 다른 개념이기 때문에 두 번 발생한다고 생각하시면 됩니다.
Q2. 변경감지에서의 ‘1.flush()‘는 더티 체킹을 수행하기 위해, 즉 엔티티와 DB의 상태를 동기화하기 위해 실행됩니다. 이 때 쿼리를 실행하며 영속성 컨텍스트의 변경내용을 데이터베이스에 반영합니다. 따라서 처음부터 쿼리가 날라가는 것은 아니며, 일반적으로는 더티 체킹을 수행하는 flush가 한 번 발생합니다.
답변이 도움이 되었길 바랍니다. 감사합니다.
벌크연산에서 member.getAge 호출 시 영속성 컨텍스트에서 데이터를 가져오는건가요?
0
24
2
inheritance startegy 선택시 고려사항
0
22
1
Entity 동등성 비교
0
18
1
실무 조언 관련 질문입니다.
0
46
1
H2데이터베이스 파일 생성
0
56
2
서브쿼리 강의에서 ALL 예시 관련 질문드립니다.
0
52
2
수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?
0
52
1
JPQL 메소드와 락
0
55
1
Delivery @OneToOne
0
60
1
17강 4~5분대 테이블 값 조회가 안됩니다.
0
93
2
UnsupportedOperationException 발생
0
86
3
H2 Database 연결이 안됩니다.
0
92
2
연관관계 매핑 질문드립니다.
0
85
2
h2데이터베이스 실행오류
0
107
2
persistence.xml
0
106
2
양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?
0
80
1
영속성 컨텍스트
0
65
1
JPA 프록시
0
95
1
Native Query와 MyBatis
0
68
1
영속성 컨텍스트는 어떤 메모리에 저장되는건가요?
0
85
1
임베디드 타입 예시 코드 관련 질문
0
114
3
명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요
0
94
3
인텔리제이 패키지 커서 단축키 질문
0
108
2
혹시 현재는 ID 데이터 타입이 String이면 안되나요?
0
144
1





