웹 개발 공부 : Back-end/JPA

[JPA 프로젝트 회고 - 3] 영속성 컨텍스트 (Persistence Context)

Developer KTU 2024. 8. 9. 02:03
반응형

1. 영속성 컨텍스트란? (Persistence Context)

영속성 컨텍스트란 엔티티 객체를 관리하는 일종의 저장소다. 데이터베이스와의 인터페이스 역할을 하며, 애플리케이션에서 객체의 상태를 관리한다. 영속성 컨텍스트에 의해 관리되는 객체는 영속 상태(Persistent state)로 간주되며, 데이터베이스와의 동기화가 이루어진다.

 

2. 영속성 컨텍스트의 주요기능

1) 엔티티관리

영속성 컨텍스트는 엔티티의 생명주기를 관리한다. 새로 생성된 엔티티는 영속성 컨텍스트에 의해 관리되고, 수정사항은 자동으로 데이터베이스에 반영된다.

 

2) 1차 캐시

영속성 컨텍스트는 엔티티를 메모리에 저장하여, 동일한 엔티티에 대한 중복 조회를 방지한다. 이를 통해 성능을 향상시킬 수 있다.

 

3) 변경 감지

엔티티의 상태가 변경되면, 영속성 컨텍스트는 이를 감지하여 데이터베이스에 업데이트한다. 실제로 JPA에선 update와 관련된 메서드를 따로 지원하지 않는다. JPA는 변경감지로 update 쿼리를 날린다!
(변경감지는 다음 포스팅에서 구체적으로 다루겠다.)

 

 

3. 생명주기

1) 비영속상태

엔티티 객체가 아직 영속성 컨텍스트에 저장되지 않은 상태.

@Service
// JPA의 모든 데이터 변경은 트랜잭셔널 내에서 이루어져야하기 때문에 어노테이션 명시
@Transactional
public class UserServiceImpl implements UserService{
	
    @PersistenceContext
    EntityManager em;
    
    @Override
    public void createUser(){
    	// 비영속 상태
        User user1 = User.builder()
                         .name("영식")
                         .age(21)
                         .height(183)
                         .weight(71)
                         .build();
    }
}

 

2) 영속상태

엔티티 객체가 영속성 컨텍스트에 저장된 상태입니다. 데이터베이스와 동기화.

@Service
// JPA의 모든 데이터 변경은 트랜잭셔널 내에서 이루어져야하기 때문에 어노테이션 명시
@Transactional
public class UserServiceImpl implements UserService{
	
    @PersistenceContext
    EntityManager em;
    
    @Override
    public void createUser(){
    	// 비영속상태
        User user1 = User.builder()
                         .name("영식")
                         .age(21)
                         .height(183)
                         .weight(71)
                         .build();
        // 영속상태
        em.persist(user1);
        // 영속성 컨텍스트에 저장된 변경내용을 데이터베이스에 반영
        em.flush();
        en.clear();
    }
}

2-1) flush()

flush()는 영속성 컨텍스트에 저장된 엔티티 변경 내용을 데이터베이스에 반영하는 메서드이다. 이는 다른 트랜잭션이 변경사항이 반영되지 않은 엔티티를 참조하는 경우를 방지해준다.

 

3) 제거상태

영속성 컨텍스트에서 제거된 객체로, 데이터베이스에서 삭제될 준비가 된 상태.

 

 

4. EntityManager

EntityManager는 JPA의 핵심 인터페이스로, 영속성 컨텍스트상호작용하는 역할을 한다. 데이터베이스와의 CRUD(Create, Read, Update, Delete) 작업을 수행하기 위한 다양한 메서드를 제공한다.

EntityManager는 @PersistenceContext 어노테이션과 같이 써야한다. 이 어노테이션이 있어야 스프링 컨테이너가 EntityManager 객체를 인식하고 영속성 컨텍스트 메서드를 사용할 수 있다.

@PersistenceContext
private EntityManager em;

EntityManager를 통해서 JPA가 DB에 INSERT, SELECT 등 쿼리 역할을 수행한다.

 

 

 

긴 글 읽어주셔서 감사합니다! 다음 포스팅은 변경감지에 대한 내용입니다. 잘못된 내용이 있거나, 보충할 내용이 있다면 언제든지 댓글 부탁드리겠습니다!

 

반응형