참고 강의 인프런 ORM 표준 JPA 프로그래밍 - 기본편
📨 flush, commit
flush : 영속성 컨텍스트의 변경내용(쓰기지연 저장소)의 내용을
즉시 DB에 적용하는 것, transaction commit을 하지않고 내용을 반영 할 수 있습니다.
commit : transaction을 종료시키고 쓰기 쓰기지연 저장소의 내용을 DB에 적용, 이때 flush도 함께 적용
1. MemberA가 새로운 영속 객체로 들어옴(persist), 쓰기 지연 저장소에 쿼리저장
2. MemberB가 새로운 영속 객체로 들어옴(persist), 쓰기 지연 저장소에 쿼리저장
3. commit하여 쓰기 지연 저장소의 쿼리를 DB에 반영
4. flush를 조금 더 자세하게 살펴보면 변경 감지(Dirty checking)을 수행합니다.
Entity의 상태와 마지막 스냅샷을 비교하여 차이가 존재한다면 Update 쿼리를 생성합니다.
flush는 쓰기 지연 저장소의 내용을 반영하는 것입니다.
1차 캐시의 내용은 여전히 살아있음
영속성 컨텍스트가 종료되기 이전까지 사용할 수 있습니다.
flush, commit, find를 transaction 안과 밖에서 혼용
변경 감지와 병합
준영속 엔티티
한번 데이터베이스에 저장을 한 엔티티
동일성(id)에 부합하는 엔티티
영속성 컨텐스트에서 관리를 하지않는 엔티티를 준영속 엔티티라고 합니다.
기술적으로 동일 트랜잭션에서 분리가 된 것만을 말하지 않으며
외부 환경에서 ID(DB에 존재하는)를 받아와 만들어진 인스턴스도 준영속 엔티티라고 표현합니다.
준영속 엔티티를 수정하는 방법
병합(merge) 사용
📗 동작 방식
1. merge() 실행
2. 파라미터로 넘어온 준영속 엔티티의 식별자 값으로 1차 캐시에서 엔티티 조회(없다면 DB에서 조회하고, 1차 캐시에 저장)
3. 조회한 영속 엔티티에 merge한 엔티티의 값을 채워 넣는다.
4. 새로운 값으로 업데이트된 1차 캐시의 엔티티를 반환
merge()에 파라미터로 넘긴 인스턴스가 아니라 반환 한 인스턴스가 영속성 컨텍스트에서 관리됩니다.
병합을 사용하면 모든 속성이 변경됩니다.
(사용하지 말고 직접 조회해서 직접 변경 값 넣어서 '변경 감지' 사용 추천👍)