영속성 컨텍스트와 엔티티 생명주기

MoonJaeGyeong·2024년 9월 4일

1. 영속성 컨텍스트


영속성 컨텍스트(Persistence Context) 는 애플케이션과 데이터베이스 사이에 있는 '가상'의 데이터베이스로 인스턴스로 존재하는 엔티티를 관리하고 영속화 시키는 논리적인 영역이다.

위와 같은 그림으로 사용자와 소통을 하면서 엔티티를 DB에 저장, 조회, 삭제, 수정할 수 있습니다. 이 때 어플리케이션 즉 사용자와 같이 소통을 할 수 있게 해주는 것을 엔티티 매니저(Entity Manager) 라고 한다.


영속성 컨텍스트를 좀 더 자세하게 보자면

1차 캐시와 쿼리문 저장소로 이루어져 있다.

1차 캐시

영속성 컨텍스트가 관리하는 엔티티 정보를 관리하는 공간. 이 곳에 엔티티 정보를 보관해놓는 상태를 영속상태라고 한다. 아직 DB에 저장되기 전인 상태이다.

쿼리문 저장소

애플리케이션에서 요청한 쿼리문들을 한 번에 모아놓다가 엔티티 매니저에 의해 flush() 가 호출되면 DB에 접근하는 방식, 최대한 데이터베이스에 접근하는 횟수를 줄여 성능상의 이점을 가져가고 있다.


1-2. 영속성 컨텍스트의 기능

1차 캐시

영속성 컨텍스트에서 1차 캐시를 사용하는데 이곳에는 HashMap 의 형태로 Key (@Id), Value(Entity) 의 형태로 저장된다. 아래 코드를 예시로 보자

Member member = new Member();
member.setId(1); 
member.seUsername("유저1");

em.persist(member); // 엔티티 영속

em.find(Member.class, 1); // 조회

위 코드에서는 1이 Key 가 되는 것이고 Value는 "유저1" 이란 유저의 엔티티 그 자체가 저장된다.


동일성 보장

Member a = em.find(Member.class, 1);
Member b = em.find(Member.class, 1);

System.out.println(a == b); // true 반환

위 코드와 같이 em.find() 를 이용해 1차 캐시에 있는 Entity 객체를 가져온다고 했을 때 둘 다 동일한 주소값을 가지고 있는 동일한 객체로 동일성을 보장한다.


변경 감지

엔티티 매니저 명령어중에는 Update 라는 메서드가 존재하지 않는다. 하지만 수정 관련한 기능을 제공하는데 이는 Snapshot 과 현재 엔티티를 비교하면서 수정된 사항이 있다면 Update 쿼리문을 날린다. 이러한 SnpaShot 은 @Id 로 불러와진다.



2. 엔티티 생명주기


엔티티 생명주기를 공부한다면 아마 볼 수 밖에 없는 그림이라고 생각한다.

하나하나 살펴보자면

비영속(new, transient) 상태

엔티티가 영속 되기전 객체가 생성된 상태

Member member = new Member();

영속(managed) 상태

엔티티가 영속성 컨텍스트에 의해 관리되고 있는 상태 아직 데이터베이스에 저장되기 전이다.

em.persist(member);

준영속(detached) 상태

엔티티가 영속성 컨텍스트에 의해 관리되고 있다가 더이상 관리되지 않는 상태

em.detach(member); // 엔티티를 영속성 컨텍스트에서 분리

em.claer(); // 영속성 콘텍스트를 비움

em.close(); // 영속성 콘텍스트를 종료

이렇게 위 3가지 코드로 엔티티를 준영속 상태를 만들 수 있는데, 영속 상태에 올라간 순간 부터 식별자 @Id 가 생성되는 특징이 있다.


삭제(removed) 상태

삭제 상태는 엔티티를 영속성 컨텍스트에서 관리하지 않게 되고, 해당 엔티티를 DB에서 삭제하는 DELETE 쿼리문을 보관하게 된다.

profile
내 맘대로 끄적이는 개발 블로그

0개의 댓글