본 내용은 인프런 김영한 강사님 JPA 기본 편 강의를 듣고 정리한 내용입니다.
https://www.inflearn.com/course/ORM-JPA-Basic
자바 ORM 표준 JPA 프로그래밍 - 기본편 강의 - 인프런
현업에서 실제로 JPA로 개발을 하고 있습니다. 그런 입장에서보면 지금 작성하고 있는 코드들이 어떻게 작동하는지 이해하는데 큰 도움을 주는 강의입니다. 다음은 제가 느낀 이 강의의 장점들
www.inflearn.com
지난 글에서 영속성 컨텍스트에서 1차 캐시에 대한 이점을 다뤄봤다 이제 나머지 이점에 대해서 다뤄볼 예정이다.
동일성 보장
말 그대로 동일성을 보장해주는 것이다. 이때 데이터베이스가 아닌 애필리케이션 차원에서 제공을 해준다.
위 코드에서 동일한 객체가 연산으로 동일하게 나오는지 확인을 하는 테스트 코드이다. 아래 실행결과처럼 쿼리문 전에 1차 캐시에서 가져와 두 객체가 동일하다는 것이 출력되는 것을 알 수 있다.
트랜잭션을 지원하는 쓰기 지연
persist()를 했을때 바로 디비에 가는 것이 아닌, 쓰기 지연 SQL 저장소에 쿼리문을 저장했다가 commit()을 하는 순간에 데이터베이스에 쿼리문이 날아간다.
결과에서 보이는 것처럼 em.persist()를 했다고 쿼리문이 날아가지 않는다. 이때 쓰기 지연 SQL 저장소에 저장이 되었다가 commit()을 하는 순간 디비에 쿼리문이 가고 저장이 된다.
변경 감지
update코드가 없어도 영속 컨텍스트에서 자동으로 변경을 감지해서 update 쿼리문이 날아간다.
위처럼 객체를 생성하고 em.flush()로 commit() 하기 전에 쿼리를 날려 디비에 저장하고 해당 값을 가져와서 조회한다. 그 후 1차 캐시를 비우고 나서 객체를 가져와서 테스트를 진행한다.
위 결과를 보면 알겠지만 update 쿼리가 발생한다.
update 쿼리가 생기는 이유에 대해 위 그림과 같이 설명하자면, 영속 컨텍스트에서 스냅샷이라는게 있다. 이건 1차 캐시에 저장할 때 맨 처음 가져올 때 모양을 스냅샷에 저장해 두는데 객체를 가져와 변경을 하고 나서 commit()을 날리게 되면, 영속 컨텍스트에서는 스냅샷과 1차 캐시를 비교해 값이 바뀌면 자동으로 update 쿼리를 날려주게 된다.
지연 로딩은 어려운 내용이므로 다음에 설명하도록 하겠다.
플러시
플러시란 쓰기 지연 SQL 저장소에 있는 쿼리를 데이터베이스에 전송하는 역할 (위에서 살펴본 em.flush() 를 말함)
영속성 컨텍스트를 비우지 않고 영속성 컨텍스트의 변경내용을 데이터베이스 동기화
'JAVA & SPRING > JPA' 카테고리의 다른 글
JPA 기본편0(연관관계 매핑 기초, 연관관계가 필요한 이유 & 연관관계 매핑) (0) | 2024.02.23 |
---|---|
JPA 기본편0 (기본키 매핑) (0) | 2024.02.20 |
JPA 기본편0 (엔티티 매핑) (0) | 2024.02.20 |
JPA 기본편0 (영속성 관리, 영속성 컨텍스트 이점(1)) (0) | 2024.02.15 |
JPA 기본편0 (JPA 소개) (1) | 2024.02.15 |