mingg IT

[JPA] 영속성 컨텍스트 와 EntityManager 본문

BackEnd

[JPA] 영속성 컨텍스트 와 EntityManager

mingg123 2021. 12. 24. 12:02

영속성 컨텍스트란?

영속성 컨텐스트란 엔티티를 영구 저장하는 환경이라는 뜻이다.

애플리케이션과 DB 사이에서 객체를 보관하는 가상의 데이터베이스 같은 역할을 한다.

Entity Manager를 통해 엔티티를 저장하거나 조회하면 Entity Manager는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.

 

 



Transactional 사용하면 영속성 캐싱 기능을 사용한다. 

1차 캐시는 map의 형태로 key는 id value는 해당 entity id로 존재하면 1차로 entity에 존재하는지 검사하고

존재하지 않으면 실제쿼리로 DB에 보내고 조회한다. 

 

예시를 확인해보자. 

 @Test
    void cacheFindTest() {
        // System.out.println(userRepository.findByEmail("martin@fastcampus.com"));
        // System.out.println(userRepository.findByEmail("martin@fastcampus.com"));
        System.out.println(userRepository.findById(1L).get());
        System.out.println(userRepository.findById(1L).get());
        System.out.println(userRepository.findById(1L).get());

    }

결과를 확인해보면 1차 캐싱기능을 활용해서 Select 문은 한번만 작동하는것을 알 수 있다. 

 

 

그렇다면 findByEmail을 사용하면 ? 

   @Test
    void cacheFindTest() {
        System.out.println(userRepository.findByEmail("martin@fastcampus.com"));
        System.out.println(userRepository.findByEmail("martin@fastcampus.com"));
    }

Select문이 두번 사용된다. 

 

 

 

 

비영속상태와 영속상태를 알아보도록 하겠다.

UserServiceTest.java

   @Test
    void test() {
        userService.put();
        System.out.println(">>>" + userRepository.findByEmail("newUser@fastcampus.com"));
    }

 

비 영속 상태

UserService.java

@Transactional
    public void put() {
        User user = new User();
        user.setName("newUser");
        user.setEmail("newUser@fastcampus.com");
    }

 

결과를 확인해보면 비어 있음을 확인할 수 있다.

 

 

영속 상태

UserService.java

 @Transactional
    public void put() {
        User user = new User();
        user.setName("newUser");
        user.setEmail("newUser@fastcampus.com");
        //userRepository.save(user);
        entityManager.persist(user);
        user.setName("newUserAfterPersist");
    }

save 액션을 취하지 않아도 반영됨을 알 수 있다.

영속성 컨텍스트 내부에서 관리되는 엔티티는 set을 통해서 객체가 변경되는 이후에 transcaction 이 완료된 이후에 별도의 save가 없어도 DB에 반영된다. 

 

이는 JAP에서 Entity Life Cycle을 공부하지 않으면 실제업무에서 문제가 발생했을때 파악하기 힘들 수 있기 때문에 공부해놔야함. 

 

 

 

영속성 컨텍스트 관리하에 조회, 1차 캐시, 쓰기 지연 등 개발자가 신경쓰지 않아도 될 편의성을 제공하고 있지만

허나 놓치면 개발자가 의도하지 않은 동작이 할 수 있다. 사이드 이펙트를 막을 수 잇다. 

 

 

Comments