아는 내용이지만 분명하게 알지 알지못해서 문제가 발생할 때마다 혼란스러워서 정리하는 시간을 갖기로 한다!
영속성 컨텍스트 라는 공간에 최초로 조회된 값이 들어있다.
@Id
식별자를 키로 엔터티를 데이터로 Map 과 유사한 상태로 저장된다.
트랜잭션 단위로 영속성 컨텍스트가 존재한다.
jpa 에서 식별자로 값을 조회하면 영속성 컨텍스트에 저장된 값이 있으면 그 값을 반환하고, 없으면 db 에서 조회한다.
최초로 db 에 조회한 경우 영속성 컨텍스트에 저장한 후 그 값을 반환한다.
이렇게 저장된 값을 스냅샷이라고도 한다.
1차 캐시를 통해서 db 조회횟수를 줄일수 있으나, 트랜잭션 안에서만 가능한 기능임으로 실제 이점을 얻기는 어렵다.
헷갈리는 내용
userRepository.findByName("ha");
식별자가 아닌 name으로 조회한 경우는 영속성 컨텍스트 내 캐싱된 데이터를 반환하지 않고, db 조회를 한다.
트랜잭션 커밋 직전에 발생한다.
dirty checking 에서 확인된 변경사항들은 쓰기지연 sql 저장소에 insert, update, delete 쿼리가 쌓인다. flush시점에 sql 저장소의 쿼리들을 날려 엔터티와 db 데이터를 동기화한다.
플러시가 발생해도 영속성컨텍스트를 비우진 않는다.
트랜잭션 범위로 이루어지는 변경 감지 기능으로 엔터티와 스냅샷 사이의 변경을 flush 시점에 감지한다.