본문 바로가기
JPA/자바 ORM 표준 JPA 프로그래밍 - 기본편

[JPA] 영속성 관리

by hk27 2022. 2. 2.

안녕하세요.

오늘은 JPA의 영속성 관리에 대해서 알아보겠습니다.

 

지난 게시글에서 JPA로 CRUD 작업을 어떻게 하는지 알아보았습니다. 

궁금하신 분은 아래 게시글을 참고해주세요.

JPA 기본 설정, JPA CRUD 기초

 

JPA의 수정은 신기하게 동작합니다. JPA에는 em.update()와 같은 기능이 없습니다. 

자바 코드에서 객체의 필드 값을 수정하기만 하면 DB에 자동으로 변경된 데이터가 반영됩니다.

이것이 가능한 이유는 JPA의 영속성 관리 때문입니다.

영속은 영속성 컨텍스트에서 관리되는 상태를 의미합니다. 

먼저 영속성 컨텍스트를 자세히 알아봅시다.

 

영속성 컨텍스트(Persistence Context)

영속성 컨텍스트는 JPA를 이해하는 데 가장 중요한 용어 중 하나입니다. 

한국어로 번역하자면 엔티티를 영구 저장하는 환경이라는 뜻입니다. 

엔티티 매니저로 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관합니다. 

엔티티 매니저와 영속성 컨텍스트가 1:1로 매핑될 수도 있고 N:1으로 매핑될 수도 있는데, N:1이라도 트랜잭션이 다르면 다른 영속성 컨텍스트가 사용됩니다. 

 

영속성 컨텍스트는 논리적인 개념으로, 눈에 보이지 않습니다. 

영속성 컨텍스트는 엔티티 매니저를 생성할 때 만들어지며 엔티티 매니저를 통해서 영속성 컨텍스트에 접근할 수 있습니다[1]. 즉, 엔티티 매니저가 하는 어떤 행위는 영속성 컨텍스트에 반영되고 이것이 최종적으로 DB에 반영됩니다.

엔티티의 생명 주기

엔티티에는 4가지 상태가 존재합니다.

1. 비영속(new/transient): 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태

2. 영속(managed): 영속성 컨텍스트에 관리되는 상태

3. 준영속(detached): 영속성 컨텍스트에 저장되었다가 분리된 상태

4. 삭제(removed): 삭제된 상태

 

한 개씩 알아봅시다. 

 

1. 비영속

// 객체를 생성한 상태(비영속)
Member member = new Member();
member.setId("member1");
member.setUsername("회원");

객체를 생성만 하고 persist 하지 않은 상태는 비영속입니다. 영속성 컨텍스트와 DB와는 전혀 관련이 없는 상태입니다. 

 

2. 영속

Member member = new Member();
member.setId("member1");
member.setUsername("회원");

// 영속성 컨텍스트에 등록 -> 영속
em.persist(member);

혹은 
Member member3 = em.find(Member.class, "member3")

em.persist로 객체를 영속성 컨텍스트에 등록하면 영속 상태가 됩니다. 

또한 em.find로 찾아온 객체도 영속성 컨텍스트에 등록됩니다. 

영속 상태인 객체는 영속성 컨텍스트가 관리하며, 객체의 필드 값이 변경되면 DB의 데이터가 변경됩니다. 

 

3. 준영속

em.detach(member) // member 엔티티만 준영속 상태로 전환
혹은
em.clear() // 영속성 컨텍스트를 완전히 초기화
혹은
em.close() // 영속성 컨텍스트 종료

영속 상태였던 엔티티를 영속성 컨텍스트가 관리하지 않으면 준영속 상태가 됩니다. 

em.detach로 특정 엔티티만 영속성 컨텍스트에서 제거(detach=분리) 할 수도 있고, clear로 영속성 컨텍스트를 초기화하거나 close로 영속성 컨텍스트를 종료하여 모든 영속 상태의 엔티티를 준영속 상태로 만들 수도 있습니다. 

 

준영속 상태는 데이터를 변경해도 DB에 반영이 되지 않습니다.

그렇다면 1번의 비영속 상태와 무엇이 다른가? 궁금하실 수 있습니다.

비영속 상태와 준영속 상태는 두 가지 차이점이 있습니다. 

첫 번째로 영속성 컨텍스트에서 관리 되었던 적이 있는지입니다[2]. 비영속 상태는 한 번도 관리된 적이 없고, 준영속 상태는 한 번 이상 관리된 적이 있습니다.

두 번째로 식별자 값이 반드시 존재하는지입니다. 비영속 상태는 식별자 값이 있을 수도 없을 수도 있지만, 준영속 상태는 고의로 삭제하지 않은 한 반드시 식별자 값이 있습니다. 영속 상태가 되려면 식별자 값이 필요하기 때문에, 한 번 이상 영속 상태였던 준영속 상태는 식별자 값을 갖습니다. 

 

4. 삭제

em.remove(member);

엔티티를 영속성 컨텍스트와 데이터베이스에서 삭제합니다. 

 

이번 게시글에서는 영속성 컨텍스트와 엔티티의 생명 주기에 대해서 알아보았습니다.

다음 게시글에서는 영속성 컨텍스트의 특징과 장점에 대해 알아보겠습니다.

이어지는 내용이니 관심있으신 분은 아래 게시글을 참고해주세요.

[JPA] 영속성 컨텍스트의 특징과 장점

 

 

인프런  '자바 ORM 표준 JPA 프로그래밍 - 기본편' 강의를 듣고 공부하며 정리한 자료입니다. 

잘못된 부분은 피드백 주시면 감사하겠습니다. 

글 읽어주셔서 감사합니다 :-)

 

참고 자료

자바 ORM 표준 JPA 프로그래밍 - 기본편, 섹션 3. 영속성 관리 - 내부 동작 방식 https://www.inflearn.com/course/ORM-JPA-Basic

김영한, 자바 ORM 표준 JPA 프로그래밍, 에이콘출판(2015), pp.90-94.

[1] https://feco.tistory.com/93

[2] https://www.inflearn.com/questions/262771

댓글