-
JPA(2) - 영속성 컨테이너란?Back-end/JPA 2021. 8. 1. 20:31반응형
이번 포스팅은 영속성 컨테이너의 개념 및 동작원리에 대해서 포스팅해보겠습니다.
JPA를 사용 할 경우 Hibernate라는 라이브러리를 이용하시는데 이것이 영속성 컨테이너를 만들고 동작하게 합니다.
Hibernate도 따로 포스팅을 하도록 하겠습니다! 오늘은 JPA 영속성 컨테이너에 대해서 알아보시죠!
❗ JPA의 영속성 컨텍스트 사용목적
영속성 컨텍스트의 사용 목적은 캐싱기능 및 자동 수정기능이라고 할 수 있습니다.
굳이 DB에 접근하지 않아도 컨텍스트에서 많은 정보들을 얻어 올 수 있어 더 효율적입니다.
📽️ 영속성 컨텍스트의 기본 동작
크게는 EntityManagerFactory, EntityManager, 커넥션 풀로 이루어져 있습니다.
이렇게 서버로 요청이 올 때마다 Thread를 한 개씩 생성하게 되고 각 Thread당 한 개의 EntityManager를EntityManagerFactory가 생성해줍니다. EntityManagerFactory는 WAS가구동되는 순간 한 개의 인스턴스로 생성이됩니다. 이렇게 생성 된 EntityManager는 요청이 끝나는 순간 사라지게 됩니다. 그러므로 Thread간의 컨텍스트의 공유는 불가능하다고 생각하시면 됩니다. 그럼 이렇게 사라지는데 왜 굳이 캐싱을 해서 사용할까? 라고 생각이 들 수 있습니다.
비지니스 로직이 복잡해지는 경우 DB에 접근이 많아지기 때문에 그 떄 영속성 컨텍스트가 필요하게됩니다. 그러한 이점으로 영속성 컨텍스트를 사용합니다.
📽️ 영속성 컨텍스트의 생명주기
위의 그림을 보시면 4가지의 상태를 가질 수 있습니다.
- New/Transient : 영속성 컨테이너와 관계가 없는 상태.
- Managed : 영속성 컨테이너에 포함된 상태. DB에는 저장이 안됨.
- Detached : 영속성 컨테이너에 저장되었다가 분리된 상태. 사용하지 못함.
- 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