1. 먼저 엔티티의 변경 감지를 알아보자
- JPA에서 엔티티의 변경 감지는 "실시간"으로 이루어지는 것이 아니라, 트랜잭션 커밋 시점에 이루어집니다. 이는 JPA의 변경 감지(Dirty Checking) 메커니즘이 작동하는 방식 때문입니다. 자세히 설명하겠습니다.
변경 감지 메커니즘
- 영속성 컨텍스트:
- JPA에서 엔티티가
find
메서드로 조회되면, 그 엔티티는 영속성 컨텍스트의 관리하에 놓이게 됩니다. 이 엔티티는 영속 상태(Persistent State)에 있게 됩니다.
- 엔티티의 변경:
- 영속성 컨텍스트에 있는 엔티티의 필드를
setter
등을 통해 변경하더라도, JPA는 이 변경을 즉시 데이터베이스에 반영하지 않습니다.
- 변경 감지는 트랜잭션이 커밋되기 전, 플러시(Flush) 시점에 이루어집니다.
- 플러시(Flush) 시점:
- 트랜잭션이 커밋되기 직전, JPA는 영속성 컨텍스트에 있는 엔티티들의 현재 상태와 처음 조회되었을 때의 상태(스냅샷)를 비교합니다.
- 변경된 엔티티가 감지되면, JPA는 이 변경 사항을 데이터베이스에 반영하기 위한
UPDATE
쿼리를 생성합니다.