본문 바로가기
프로그래밍/Back-end

JPA 영속성과 영속성 컨텍스트에 대하여!

by @GodWin 2024. 10. 15.

-

 

-
안녕하세요? 오늘은 JPA에서 가장 중요한 개념인, 영속성에 관련해서 알아보도록 하겠습니다.


JPA를 공부할 때 가장 중요한 점은,
1. 객체와 관계형 데이터베이스를 매핑하는 것
(Object Relational Mapping)

2. 영속성 컨텍스트를 이해하는 것
이라고 볼 수 있습니다.


JPA에서는, 요청이 올때마다, EntityManagerFactory를 통해서 EntityManager를 생성을 해주게 됩니다.
EntityManager에서는 이제, 데이터 커넥션을 사용해서 DB를 사용하게 됩니다.



엔티티의 생명주기는 크게 비영속 / 영속 / 준영속 / 삭제 로 나눠집니다.
그럼 각각에 대해서 자세히 알아보도록 하겠습니다.

-

비영속

: 영속성 컨텍스트와 전혀 관계가 없는 상태

// 객체를 생성만 한 상태(비영속) 
Entity entity = new Entity(); 
entity.setId("entityA"); 
entity.setUsername("엔티티A");

-

영속

: 영속성 컨테스트에 저장 > 관리되는 상태
: 엔티티가 영속성 컨테스트에 의해 관리가 됨
: 이때 DB에 저장이 되지 않음




그렇다면,

영속성 컨텍스트 란?

: 엔티티를 영구 저장하는 환경
(논리적인 개념)


EntityManager.persist(엔티티)를 실행 했을 때, 실제로는 DB에 저장이 바로 이루어지는 것이 아니라, 영속성 컨텍스트를 통해서 엔티티를 영속화하게 된다.

DB 저장 시점은, 트랜잭션의 커밋 시점으로 볼 수 있다.

// 객체를 생성한 상태(비영속) 
Entity entity = new Entity(); 
entity.setId("entityA"); 
entity.setUsername("엔티티A"); 

EntityManagerFactory emf = Persistence.createEntityManagerFactory("유닛명"); 
EntityManager em = emf.createEntityManager();

// 객체를 저장한 상태(영속)
em.persist(entity);
em.getTransaction().begin();

-

준영속

: 영속성 컨텍스트에 저장이 되었다가 분리된 상태

EntityManagerFactory emf = Persistence.createEntityManagerFactory("유닛명"); 
EntityManager em = emf.createEntityManager();

// 회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태 
em.detach(entity);

-

삭제

: 삭제된 상태
: DB에서도 실제데이터가 삭제된다.

EntityManagerFactory emf = Persistence.createEntityManagerFactory("유닛명"); 
EntityManager em = emf.createEntityManager();

// 객체를 삭제한 상태
em.remove(entity);



그렇다면, 영속성 컨텍스트의 이점은 뭘까요?
그건 바로, 1차 캐시, 동일성 보장 (Identity), 트랜잭션을 지원하는 쓰기 지연, 변경 감지, 지연 로딩 등등이 존재합니다.


오늘은 JPA에서 가장 중요한 개념인, 영속성에 관련해서 알아보았습니다.
다음 포스팅에서는, 영속성 컨텍스트의 이점에 대해서 알아보도록 하겠습니다.
그럼 오늘도 즐거운 하루 되시길 바라겠습니다.