https://www.youtube.com/watch?v=mj7mOMqHM68&list=PLOSNUO27qFbvzGd3yWbHISxHctPRKkctO&index=6


영속성 컨테이너(컨텍스트)가 곧 1차 캐시이고 이 1차 캐시(영속성 컨텍스트)에 객체를 등록해 주는 방법이 persist(customer)인 것이다.
persis하면 1차캐시에 등록이 된 것이지 아직은 DB에 반영이 된것은 아니다. commit되는 시점에 실제로 DB에 insert되는 것이다.
아직 DB에는 반영되지 않은 데이터를 대상으로 find메서드를 호출하면 insert쿼리가 생성되지 않고 1차 캐쉬에서 해당 객체를 find하고 반환해준다. 즉 영속성 컨테이너부터 먼저 뒤지고 그 후에 쿼리를 생성하여 날리는 것이다


하나의 트랜잭션단위로 영속성 컨텍스트가 생성되는 것이다. 따라서 만약 하나의 트랜젝션내에서 persist를 해주지 않았다고 하고 find를 한다면 DB에 가서 찾기 위해 select쿼리가 만들어지는 것이다.

https://www.youtube.com/watch?v=QBISxH_KHog&list=PLOSNUO27qFbvzGd3yWbHISxHctPRKkctO&index=7

persist를 하는 시점에는 1차 캐쉬(영속성 컨텍스트)에 해당 쿼리가 SQL저장소에 저장되고 commit되는 시점에 DB로 SQL저장소에 있던 쿼리가 실제로 보내지게 된다.


동기화라는 것은 꼭 2개의 것이 같다는 것을 의미하는 것이 아니다. 다만 흐름을 같이 할뿐이다.
정리: flush를 하면 동기화는 되지만 둘(영속성 컨테이너와 DB)의 상태가 완전히 같은 것은 아니다. 즉, 동기화란 완전히 같음을 의미하는 것이 아닌 흐름을 같이 한다는 의미이다.
위에서 flush가 필요한 경우로 JPQL쿼리실행전을 예로 들었는데 왜 이때 flush가 필요한건가? 아래와 같이 JPQL(createQuery, getResultList())과 관련된 함수를 사용할려고 하면 하나의 트랜잭션에서 JPQL이전에 있었던 persist는 아직 DB에 반영이 되지 않은 상황이다. 이때 flush를 하지 않고 getResultList()를 한다면 오직 DB에 있는 내용만 가지고 오겠지만 flush를 하고 getResultList()를 한다면 SQL저장소에 있는 쿼리까지 모두 적용되어 모든 객체를 가져오게 되는 것이다.

https://www.youtube.com/watch?v=vMdpdui4VkA&list=PLOSNUO27qFbvzGd3yWbHISxHctPRKkctO&index=8

'Spring&IntelliJ' 카테고리의 다른 글
| JPA 지연로딩과 프록시객체 (0) | 2026.06.02 |
|---|---|
| 1. 쓰기 지연과 지연 로딩에 대해서, 2.로우(ROW)락과 쓰기지연에 대해서 (0) | 2026.06.02 |
| 1-1강 영속성의 이해, 1-2강 객체의 세상과 테이블의 세상 (0) | 2026.05.27 |
| 정확한 JPA와 Spring의 관계에 대해 알려줘 (0) | 2026.05.27 |
| 사용자 정의 어노테이션을 만들때 아래와 같은 방식으로 만드는 것으로 알고 있어. 그런데 궁금한게 왜 어노테이션이름이 @interface야? 어노테이션을 새로 정의한다면 그 이름을 @annotation으로 하는 게 적절한거 아니야? (0) | 2026.05.27 |