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

준영속 상태에 대하여....

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

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

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

 

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

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

www.inflearn.com

 

 

entity 가 영속 상태가 될 수 있는 방법은 persist 메소드를 호출하는 것 말고 다른 하나가 더 존재한다.

find() 메소드를 통해 데이터베이스에서 데이터를 가져왔는데, 해당 데이터가 영속성 컨텍스트에 존재하지 않는 경우, 즉 1차 캐시에 찾아온 데이터가 존재하지 않는 경우 해당 데이터를 1차 캐시에 올림으로서 영속 상태로 만들 수 있다.

(1차 캐시에 올라간 상태가 바로 영속 상태이다. -> JPA 가 관리하고 있는 상태)

 

-> persist() 메소드를 호출해도 entity 를 영속상태로 만들 수 있지만, find() 메소드를 통해 entity 를 데이터베이스에 조회하여 해당 entity 를 반환받아도 해당 데이터가 영속성 컨텍스트에 없으면 데이터를 영속성 컨텍스트(1차 캐시)에 올리면서 영속 상태로 만들 수 있다.

 

 

그렇다면 준영속 상태는 무엇일까?

준영속 상태는 영속 상태의 entity 가 영속성 컨텍스트 에서 분리(detached)되는 것으로(1차 캐시에서 빠져나가는 것)

영속성 컨텍스트가 제공하는 기능, 즉 entity 변경과 같은 Dirty Checking 기능 등을 사용할 수 없게 된다.

 

- entity 를 준영속 상태로 만드는 방법

영속성 컨텍스트에 올라와 있는 객체에 대하여 실행 할 수 있다.

em.detach(entity) 메소드 : 특정 entity 만 준영속 상태로 전환한다.

-> 객체를 영속성 컨텍스트에서 분리시킨다. 해당 트랜잭션에서 영속성 컨텍스트에 올라와 있는 객체에 대해 변경작업이 있었다고 해도 커밋하기 전에 detach 메소드를 통해 해당 객체를 준영속 상태로 만들어버리면 해당 객체는 더 이상 JPA 가 관리하지 않게 되므로 Dirty Checking 과 같은 기능이 실행 될 수 없다. 

즉, 데이터의 변경이 일어나지 않는다.

// 준영속 상태로 만들기
Member member = em.find(Member.class, 150L); // 영속성 컨텍스트에 값을 올림
member.setName("AAAA"); // Dirty Checking 을 통한 변경

em.detach(member); // 영속성 컨텍스트에서 빼버림으로서 준영속 상태로 전환
// JPA 가 더 이상 해당 객체를 관리하지 않음
// 커밋을 해도 update query 가 나오지 않는다.(즉, 데이터의 변경이 일어나지 않는다.)

 

그외 entity 를 준영속 상태로 만드는 방법

em.clear() 메소드 : 영속성 컨텍스트를 완전히 초기화 시킨다.(1차 캐시에 올라와 있는 entity 들을 모두 날려버린다.)

em.close() 메소드 : 영속성 컨텍스트를 종료시킨다.