스마트웹앱콘텐츠전문가/JAVA

JPA EntityManager: 영속성 관리부터 트랜잭션까지 완벽 가이드

9D4U 2025. 3. 13. 15:51
728x90
반응형

Java Persistence API(JPA)는 자바 애플리케이션에서 데이터베이스와 상호작용하기 위한 표준 규격입니다. JPA를 사용할 때 중요한 개념 중 하나는 EntityManager입니다. EntityManager는 JPA에서 엔티티를 관리하고, 데이터베이스와의 CRUD(Create, Read, Update, Delete) 작업을 수행하는 중심 역할을 합니다. 이 게시글에서는 EntityManager의 역할과 주요 기능, 사용법, 그리고 주의사항을 구체적으로 설명합니다.

 

 


1. EntityManager의 역할

 

EntityManager는 JPA에서 엔티티(객체)와 데이터베이스 간의 상호작용을 관리하는 인터페이스입니다. 엔티티는 데이터베이스 테이블에 매핑되는 자바 객체로, EntityManager를 사용하여 데이터베이스의 데이터를 읽거나 저장할 수 있습니다. EntityManager는 JPA의 영속성 컨텍스트(Persistence Context)를 관리하며, 이 컨텍스트 내에서 엔티티 객체들의 상태를 추적합니다.

 

 

 


2. 주요 기능

EntityManager는 여러 중요한 기능을 제공합니다. 이를 통해 개발자는 데이터베이스와 효율적으로 상호작용할 수 있습니다.

 

2.1. 영속성 관리 (Persistence Management)

  • persist(): 새로운 엔티티를 데이터베이스에 저장합니다. persist 메서드는 엔티티를 영속성 컨텍스트에 저장하고, 트랜잭션이 커밋되면 데이터베이스에 반영됩니다.
    entityManager.persist(entity);
    
  • merge(): 이미 존재하는 엔티티를 갱신합니다. 만약 엔티티가 영속성 컨텍스트에 없다면 새로운 엔티티로 삽입됩니다.
    entityManager.merge(entity);
    
  • remove(): 엔티티를 삭제합니다. 삭제된 엔티티는 트랜잭션이 커밋될 때 실제 데이터베이스에서 삭제됩니다.
    entityManager.remove(entity);
    

 

2.2. 조회 (Querying)

 

  • find(): 기본 키(primary key)를 사용하여 엔티티를 조회합니다. find 메서드는 데이터베이스에서 해당 엔티티를 찾은 후 반환합니다.
  • MyEntity entity = entityManager.find(MyEntity.class, primaryKey);
  • JPQL (Java Persistence Query Language): JPQL은 객체지향적인 쿼리 언어로, 데이터베이스 테이블 대신 엔티티 객체를 대상으로 쿼리를 작성합니다. createQuery 메서드를 사용하여 JPQL 쿼리를 실행할 수 있습니다.
  • List<MyEntity> result = entityManager.createQuery("SELECT e FROM MyEntity e WHERE e.name = :name", MyEntity.class) .setParameter("name", "John") .getResultList();
  • Native Query: SQL 쿼리를 직접 작성하여 실행할 수 있습니다. 이를 통해 복잡한 쿼리나 JPA에서 지원하지 않는 기능을 사용할 수 있습니다.
  • List<Object[]> results = entityManager.createNativeQuery("SELECT * FROM my_table").getResultList();

 

2.3. 영속성 컨텍스트 플러시 (Flush)

  • flush(): flush 메서드는 영속성 컨텍스트에 있는 변경 사항을 즉시 데이터베이스에 반영하도록 합니다. 즉, 변경 사항이 실제로 커밋되기 전에 데이터베이스에 적용됩니다.
    entityManager.flush();
    

 

 

2.4. 트랜잭션 관리 (Transaction Management)

EntityManager는 트랜잭션을 직접 관리하지 않지만, 스프링과 같은 프레임워크에서 트랜잭션을 관리합니다. 예를 들어, @Transactional 애너테이션을 사용하여 메서드 단위로 트랜잭션을 관리할 수 있습니다.

@Transactional
public void saveAndFlushEntity(MyEntity entity) {
    entityManager.persist(entity);
    entityManager.flush();  // 변경 사항을 즉시 반영
}

 

 

 

반응형

 

 


3. EntityManager의 주요 메서드

 

EntityManager는 데이터베이스와 상호작용하는 여러 메서드를 제공합니다. 여기서는 자주 사용되는 메서드를 소개합니다:

  • persist(): 엔티티를 영속성 컨텍스트에 저장합니다.
  • find(): 기본 키를 사용하여 엔티티를 조회합니다.
  • merge(): 이미 존재하는 엔티티를 업데이트합니다.
  • remove(): 엔티티를 삭제합니다.
  • flush(): 변경된 데이터를 즉시 데이터베이스에 반영합니다.
  • clear(): 영속성 컨텍스트를 초기화하여, 모든 엔티티를 제거합니다.
  • createQuery(): JPQL 쿼리를 실행합니다.
  • createNativeQuery(): 네이티브 SQL 쿼리를 실행합니다.

 

 


4. 영속성 컨텍스트와 캐시

 

EntityManager는 엔티티를 관리하는 영속성 컨텍스트(Persistence Context)를 사용하여 데이터베이스의 데이터를 효율적으로 처리합니다. 이 컨텍스트는 엔티티를 1차 캐시로 저장하여, 동일한 엔티티에 대해 여러 번 조회할 때 데이터베이스를 다시 호출하지 않고 영속성 컨텍스트에서 가져옵니다.

  • 1차 캐시: EntityManager는 세션 단위로 영속성 컨텍스트를 관리합니다. 동일한 엔티티를 여러 번 조회할 경우, 첫 번째 조회 후 이후의 조회는 영속성 컨텍스트에서 엔티티를 반환합니다.
  • 2차 캐시: 2차 캐시는 여러 EntityManager 인스턴스 간에 공유되는 캐시입니다. 하지만 2차 캐시는 기본적으로 활성화되지 않으며, 별도의 설정을 통해 사용할 수 있습니다.

 

 

 


5. EntityManager와 Spring의 @Transactional

 

Spring에서는 @Transactional 애너테이션을 통해 트랜잭션을 자동으로 관리할 수 있습니다. @Transactional을 메서드에 적용하면, 해당 메서드는 트랜잭션이 시작되고 끝나는 범위 내에서 실행됩니다. 이를 통해 개발자는 데이터베이스 작업을 쉽게 관리할 수 있습니다.

@Transactional
public void updateEntity(MyEntity entity) {
    entityManager.merge(entity);
    entityManager.flush();  // 즉시 데이터베이스에 반영
}

 

 

 


6. EntityManager 사용 예시

 

엔티티 저장:

public void saveUser(User user) {
    entityManager.persist(user);  // 새 엔티티를 데이터베이스에 저장
}

 

엔티티 조회:

public User findUser(Long id) {
    return entityManager.find(User.class, id);  // 기본키를 사용하여 엔티티 조회
}

 

엔티티 업데이트:

public void updateUser(User user) {
    entityManager.merge(user);  // 엔티티 업데이트
}

 

엔티티 삭제:

public void deleteUser(Long id) {
    User user = entityManager.find(User.class, id);
    if (user != null) {
        entityManager.remove(user);  // 엔티티 삭제
    }
}

 

 


7. EntityManager 사용 시 주의사항

 

  • 스레드 안전성: EntityManager는 스레드 안전하지 않습니다. 각 스레드는 자신만의 EntityManager 인스턴스를 가져야 하며, 보통 스프링에서는 @Transactional을 사용하여 트랜잭션 범위 내에서 관리됩니다.
  • 트랜잭션 관리: EntityManager는 트랜잭션을 직접 관리하지 않으며, 스프링과 같은 프레임워크에서 트랜잭션을 관리합니다.
  • 영속성 컨텍스트: EntityManager가 관리하는 영속성 컨텍스트는 트랜잭션이 끝날 때까지 유지되며, 트랜잭션이 커밋되면 변경 사항이 데이터베이스에 반영됩니다.

 

 

 


 

 

 

EntityManager는 JPA에서 데이터베이스와 상호작용하는 핵심 컴포넌트로, 엔티티의 영속성 관리, CRUD 작업, 쿼리 실행, 트랜잭션 관리 등을 제공합니다. 이를 통해 데이터베이스 작업을 객체지향적으로 처리할 수 있으며, 효율적인 성능과 관리가 가능합니다. Spring과 함께 사용할 때는 @Transactional 애너테이션을 통해 트랜잭션 범위 내에서 EntityManager를 쉽게 관리할 수 있습니다.

728x90