본문 바로가기

Server/Spring

[TIL] 영속성 컨텍스트 (Persistence Context)

반응형
SMALL

오늘 강의에서는 영속성 컨텍스트의 개념과 구조, 기능들을 배울 수 있었다. 구조를 이해한 후, 기능에 대한 설명을 들으니 DB에 어떻게 접근하고 데이터를 어떻게 가져오는지 더 잘 알 수 있어서 좋았다.

 

 

먼저, Entity와 EntityManager에 대해 알 수 있었다. 지난 시간에 Bean으로 등록하면서 사용한 몇 패키지들을 몰라서 찾아 공부하면서도 모르는 부분이 모호하게 남아있었는데, 오늘 강의에서 정확히 알고 넘어갈 수 있어서 좋았다.

 

Entity: RDB의 테이블과 매핑되는 객체

EntityManagerFactory: EntityManager을 생산하는 공장으로, Thread safe 해서 여러 Bean이 접근해도 안전하다.

EntityManager: CRUD와 같은 모든 트랜잭션을 처리하고, Thread safe 하지 않기 때문에 여러 Thread가 동시 접근할 경우 동시성 이슈가 발생할 수 있다.

 

WAS (Web Application Server)

위 그림으로 요청 후, EntityManager가 어떻게 만들어지고 DB에 어떻게 저장되는지에 대한 WAS 구조를 이해할 수 있었다.

 

 

영속성 컨텍스트

Entity를 이해하고, 영속성 컨텍스트에 대해 알 수 있었다.

영속성 컨텍스트(Persistence Context)는 JPA를 이용하는데 가장 중요한 요소로, Entity를 영구 저장하는 환경이다. EntityManager가 Entity를 영속성 컨텍스트에 보관하고 관리한다.

 

영속성 컨텍스트 구조

영속성 컨텍스트 또한 위 이미지를 통해 쉽게 이해할 수 있었다. EntityManager가 psersist() 메서드로 Entity를 영속성 컨텍스트에 저장하고, Entity에 대한 1차 캐시를 가진다. 영속성 컨텍스트의 특징은 아래와 같다.

 

- 영속성 컨텍스트에서 관리되는 Entity는 반드시 식별자 값을 가져야 한다. 이는 Key-Value 값으로 저장하고 관리되기 때문이다.

- JPA는 트랜잭션을 커밋하는 순간, 영속성 컨텍스트에 새로 저장된 Entity를 DB에 반영한다. DB에 반영하는 과정을 flush라고 한다.

 

Entity 생명주기

영속성 컨텍스트와 Entity 사이의 생명주기도 알 수 있었다.

- 비영속(new/transient): 영속성 컨텍스트와 전혀 상관없는 관계로, DB에 저장하려는 객체가 한 예시가 된다.

- 영속(managed): 영속성 컨텍스트에 저장된 상태로, DB에서 찾을 수 있는 객체가 한 예시가 된다.

- 준영속(detached): 영속성 컨텍스트에 저장되었다가 분리된 상태로, EntityManager가 detach한 객체가 한 예시가 된다.

- 삭제(removed): 말 그대로 삭제된 상태이다.

 

 

 

이와 같이 JPA에서 필요한 Entity와 Persistence Context을 배울 수 있었다. JPA를 사용한 CRUD를 무턱대고 배우기보다, 영속성 컨텍스트의 구조와 역할을 이해하고 그 속에서 이루어지는 과정을 안 후에 간단한 Entity를 CRUD 하는 테스트를 해서 개념이 더 잘 와닿고 깊게 이해할 수 있었다. 또한 구조를 알고 사용하니까 코드를 작성하는 것이 재밌게 느껴지기도 했다.

 

아무쪼록 배우고 싶었던 JPA를 기본부터 깊게, 좋은 강의로 배울 수 있어서 감사하다. 그래서 더욱 열심히 배우고 개발해야겠다 :)

반응형
LIST