본문 바로가기
  • 개발공부 및 일상적인 내용을 작성하는 블로그 입니다.
JPA

영속성 컨텍스트의 이점 - 변경 감지, 엔티티 삭제

by 방구석 대학생 2020. 9. 9.

"인프런 - 자바 ORM 표준 JPA 프로그래밍 강의를 보고 작성한 글 입니다."

www.inflearn.com/course/ORM-JPA-Basic#

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다. 초급 웹 개발 프로그

www.inflearn.com

 

4. 변경 감지(Entity 수정)

JPA 의 목적은 자바 컬렉션을 다루듯이 자바 객체를 다루는 것이다.

컬렉션은 값을 꺼내서 변경했을 경우 해당 데이터를 다시 컬렉션에 집어넣거나 하지 않는다.

(단순하게 찾아온 다음에 변경만 해주면 그만이다.)

어째서 이게 가능한 것일까?

Member member = em.find(Member.class, 150L);
member.setName("ZZZZ");
// em.persist(member); -> 데이터 수정 시에는 persist 메소드를 활용할 필요가 없다.

 

JPA 는 Dirty Checking(더티 체킹 - 변경 감지) 기능으로 entity 를 변경할 수 있는 기능이 제공된다.

JPA 는 데이터베이스에 트랜잭션을 커밋할 때 flush() 를 호출하는데, 이 메소드가 호출되면 Entity 와 스냅샷을 비교하게 된다. (1차 캐시에는 데이터의 값과 해당 데이터의 키 값, 그리고 스냅샷이라는 것이 존재한다.)

여기서 스냅샷이란 1차 캐시에 삽입된 entity 의 value 값을 그대로 복사해놓은 데이터이다.

 

여기서 1차 캐시 안에 들어있는 값에 변경이 있을 경우, 트랜잭션이 데이터베이스로 커밋되어 flush() 가 호출되는 시점에 JPA 가 1차 캐시안에 있는 값들을 비교하기 시작한다.

-> 현재 1차 캐시안에 들어있는 entity 의 값과 스냅샷 간의 비교

 

비교 결과 변경사항이 있는 경우 update query 를 쓰기 지연 SQL 저장소에 쌓아둔 후 해당 쿼리를 데이터베이스에 반영한 후 커밋한다.

즉, persist() 메소드를 호출하지 않아도 마치 자바 컬렉션에서 데이터를 변경하는 것처럼, 1차 캐시에 있는 스냅샷을 통한 비교 결과 변경점이 있을 경우 JPA 에서 스스로 update query 를 생성하게 되고 이를 데이터베이스에 전달하게 되는 것이다.

 

어떻게 보면 이미 find 메소드를 통해 변경하고자 하는 값의 정보를 1차 캐시에 올려둠으로서 해당 entity 를 이미 영속화 해둔 상태에서 Dirty Checking 기능을 통해 데이터를 변경하는 것이기 때문에 굳이 persist 메소드를 호출하여 entity  를 영속화할 필요가 없는것 인지도 모르겠다.

 

5. Entity 삭제 

find 메소드를 통해 찾아온 객체를 EntityManager 클래스의 메소드 remove() 를 호출하여 entity 를 제거한다.

삭제는 위의 Dirty Checking 과 매커니즘이 동일하다.(트랜잭션 커밋 시점에 delete query 가 데이터베이스에 전달된다.)

Member memberA = em.find(Member.class, "memberA");
em.remove(memberA); // entity 삭제