ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JPA(2) - 영속성 컨테이너란?
    Back-end/JPA 2021. 8. 1. 20:31
    반응형

    이번 포스팅은 영속성 컨테이너의 개념 및 동작원리에 대해서 포스팅해보겠습니다.

    JPA를 사용 할 경우 Hibernate라는 라이브러리를 이용하시는데 이것이 영속성 컨테이너를 만들고 동작하게 합니다.

    Hibernate도 따로 포스팅을 하도록 하겠습니다! 오늘은 JPA 영속성 컨테이너에 대해서 알아보시죠!

     

    ❗ JPA의 영속성 컨텍스트 사용목적

    영속성 컨텍스트의 사용 목적은 캐싱기능 및 자동 수정기능이라고 할 수 있습니다.

    굳이 DB에 접근하지 않아도 컨텍스트에서 많은 정보들을 얻어 올 수 있어 더 효율적입니다.

     

    📽️ 영속성 컨텍스트의 기본 동작

    크게는 EntityManagerFactory, EntityManager, 커넥션 풀로 이루어져 있습니다.

    이렇게 서버로 요청이 올 때마다 Thread를 한 개씩 생성하게 되고 각 Thread당 한 개의 EntityManagerEntityManagerFactory가 생성해줍니다. EntityManagerFactory는 WAS가구동되는 순간 한 개의 인스턴스로 생성이됩니다. 이렇게 생성 된 EntityManager는 요청이 끝나는 순간 사라지게 됩니다. 그러므로 Thread간의 컨텍스트의 공유는 불가능하다고 생각하시면 됩니다. 그럼 이렇게 사라지는데 왜 굳이 캐싱을 해서 사용할까? 라고 생각이 들 수 있습니다.

    비지니스 로직이 복잡해지는 경우 DB에 접근이 많아지기 때문에 그 떄 영속성 컨텍스트가 필요하게됩니다. 그러한 이점으로 영속성 컨텍스트를 사용합니다.

     

    📽️ 영속성 컨텍스트의 생명주기

     

    위의 그림을 보시면 4가지의 상태를 가질 수 있습니다.

    1. New/Transient : 영속성 컨테이너와 관계가 없는 상태.
    2. Managed : 영속성 컨테이너에 포함된 상태. DB에는 저장이 안됨.
    3. Detached : 영속성 컨테이너에 저장되었다가 분리된 상태. 사용하지 못함.
    4. Removed : 영속성 컨테이너에서 삭제된 상태. DB에서도 삭제됨.

    그럼 위의 행동들을 하나씩 살펴볼까요?

     

    1. Persist

     

    영속성 컨테이너에 Entity를 추가합니다. 그리고 이 Entity는 이제 영속성 컨테이너의 지배하에 존재하게 됩니다. 그 다음 영속성 컨텍스트는 Entity를 분석하여 Insert query구문을 생성합니다. 그렇게 쿼리는 SQL저장소에서 발송 준비상태에 있다가 트랜잭션 커밋명령이 들어오면 모여있던 쿼리들이 한꺼번에 DB로 전송이됩니다.

    em.persist(member);

     

     

    2. Find

     

    Find는 조회 기능입니다. 이 명령을 실행 할 경우 영속성 컨테이너에 찾고자하는 Entity가 있는지 찾아봅니다. 그리고 있으면 바로 응답을 해줍니다. 없을 경우는 DB에서 조회 후 영속성 컨테이너에도 저장을 해놓고 응답을 해줍니다. 다음에 find명령을 실행 할 경우 DB접근이 필요없습니다.

    em.find(Memeber.class, "member")

     

    3. Flush

     

    flush기능은 SQL쿼리 저장소에 있는 쿼리들을 DB로 보내주는 역할을 담당합니다. 데이터베이스와 영속성 컨테이너의 싱크하기 위한 작업입니다. flush기능을 수행하면 Dirty check를 하게 되는데 밑 부분에서 자세하게 설명하겠습니다.

    transcation.commit();

     

    4. Remove

     

    이 기능은 DB, 영속성 컨테이너에서 모든 Entity와 데이터를 지웁니다.

    em.remove(member);

     

    ✔️ Dirty Checking

    이 기능은 JPA 영속성 컨테이너가 Update를 자동으로 Flush할 경우 반영해주는 기능입니다.

    그래서 EntityManager는 Update해주는 기능을 따로 가지고 있지 않습니다.

    Dirty Checking이 되는 두 가지 조건은 Entity가 Manage상태이거나 Transaction안에서 Entity를

    변경하는 조건입니다.

    아래의 예시를 들어보겠습니다.

    @Service 
    public class Example {
    
    	@Transactional
        public void update() { 
    		User user = userRepository.findById(id);
    		user.setName(name);
    	} 
    }

    이럴 경우에는 자동으로 Update문Hibernate가 실행해주겠죠?

    그렇게되면 DB에 직접 반영이 됩니다.

    그러나 @Transactional을 사용하지 않을 경우에는 DB적용되지 않습니다.

     

     

    이렇게 영속성 컨테이너의 기능Dirty Check에 대해서 알아봤습니다.

    이러한 기능들을 원리를 잘 이해하지 못하면 Service로직이 엉켜버려 나중에 해결 할 수 없는 상황이

    올 수 도있기 때문에 원리를 잘 이해하는게 중요합니다!

     

    반응형

    'Back-end > JPA' 카테고리의 다른 글

    JPA(3) - Transation(트랜잭션)  (0) 2021.08.18
    JPA(1) - JPA란?  (0) 2021.07.31

    댓글

Designed by Tistory.