Programming/JPA
[JPA] 변경감지
Jisung Hwang
2022. 12. 2. 01:22
서론
Spring을 공부하면서 데이터 변경은 어떻게 일어나는지 바로 이해가 되지 않았다. Entity에 update 함수가 정의되어 있고 이를 통해, 조회한 Entity의 값을 변경해주는 것인데 어떻게 DB의 데이터가 바뀌는 것인가? 라는 의문이 생겼고 찾아보니 JPA의 변경감지를 통한 데이터 변경이라는 내용을 볼 수 있었다. 기존에 쿼리를 통해 DB 작업을 하던 나에겐 상당히 신기한 부분이었기에 이에 대해 정리해보고자 한다.
데이터 변경을 위한 기본 로직
변경감지는 트랜잭션 커밋(Commit)시 영속화된 Entity에서 가지고 있었던 최초 정보(스냅샷)와 바뀐 Entity 정보를 비교해서 바뀐 부분을 update 해주는 기능이다.
이를 조금 더 상세히 살펴보자.
- 트랜잭션 커밋시
JPA는 트랜잭션 커밋시 EntityManager에서 flush를 자동 호출해준다. flush는 영속성 컨텍스트의 변경 내용을 DB에 반영하는 것이라고 생각하면 된다. 트랜잭션 커밋할 때 DB에 변경 내용을 update하지않고 커밋하게되면 아무것도 변경되지 않기 때문에 JPA에서 커밋할 때 이를 자동으로 수행해준다. - 스냅샷과 바뀐 정보
flush를 호출하게 되면 스냅샷과 Entity의 바뀐 정보를 서로 비교하게 된다. 스냅샷은 DB에서 데이터를 가져와 영속성 컨텍스트에 저장해 Entity를 영속화할 때의 최초 정보들이다. 가져온 Entity 최초 정보를 가지고 로직 중간에 수정한 데이터들과 비교를 하는 것이다. - update 처리
스냅샷 정보와 Entity 바뀐 정보를 비교해 최초 정보에서 바뀐 부분들을 기준으로 udpate 쿼리를 작성하게 된다. update 쿼리는 잠시 특정 저장소에 담겨져있다가 마지막에 한꺼번에 DB로 요청을 보내게 된다.
(JPA 쓰기지연)
References
[JPA] 변경감지 개념과 @Transactional 위치에 따른 변경감지 사용 (tistory.com)