BE/Spring & Spring Boot

[Spring Boot, JPA] EntityManager

baek-dev 2025. 1. 16. 18:59

JPA에서 데이터베이스와 상호작용하기 위해 사용되는 핵심 인터페이스

JPA의 영속성 컨텍스트를 관리하고, 엔티티의 생명주기를 제어하며, 데이터베이스 작업(저장, 업데이트, 삭제 등)을 수행한다

엔티티매니저는 JPA 표준 사양에 속하며, 스프링부트에서는 보통 Hibernate가 이를 구현체로 사용한다

 

주요 역할

1. 영속성 컨텍스트 관리

  • 엔티티를 영속성 컨텍스트에 저장하고 관리한다
  • 영속성 컨텍스트는 엔티티의 1차 캐시 역할을 수행하며, 엔티티 상태를 추적한다

2. 엔티티 상태 관리

  • Transient : 영속성 컨텍스트에 포함되지 않은 상태
  • Persistent : 영속성 컨텍스트에 포함되어 관리되는 상태
  • Detached : 영속성 컨텍스트에서 분리된 상태
  • Removed : 삭제 예정 상태

3. 데이터베이스 작업 처리

  • 데이터 저장, 조회, 수정, 삭제 작업을 수행한다

4. JPQL (Java Persistence Query Language) 지원

  • JPA 표준 쿼리 언어를 사용해 데이터를 조회하거나 업데이트 한다

5. 트랜잭션 관리

  • 데이터베이스 작업은 반드시 트랜잭션 내에서 실행된다

주요 메서드

1. 영속성 컨트롤러 관련 메서드

  • persist(Object entity)
    • 엔티티를 영속성 컨텍스트에 저장하고 Persistent 상태로 만든다
    • 즉시 데이터베이스에 저장되지는 않고, 트랜잭션이 커밋될 때 플러시 된다
  • merge(Object entity)
    • Detached 상태의 엔티티를 다시 영속성 컨텍스트에 병합한다
    • 반환값으로 병합된 새로운 Persistent 상태의 엔티티를 반환한다
  • remove(Object entity)
    • 엔티티를 영속성 컨텍스트에서 제거하며, 트랜잭션 커밋 시 데이터베이스에서 삭제된다
  • detach(Object entity)
    • 특정 엔티티를 영속성 컨텍스트에서 분리하여 Detached 상태로 만든다
  • clear()
    • 현재 영속성 컨텍스트를 초기화 한다
    • 모든 엔티티가 Detached 상태가 된다
  • close()
    • 영속성 컨텍스트를 닫는다
    • 닫힌 EntityManager는 더이상 사용할 수 없다

2. 데이터베이스 작업 관련 메서드

  • find(Class<T> entityClass, Object primaryKey)
    • 주어진 기본키(primary key)로 특정 엔티티를 조회한다
    • 조회된 엔티티는 영속성 컨텍스트에 포함된다
  • getReference(Class<T> entityClass, Object primaryKey)
    • 프록시 객체를 반환하며, 실제 데이터는 필요할때 가져온다 (Lazy Loading)
  • createQuery(String qlString)
    • JPQL 쿼리를 작성하여 데이터를 조회함
    • 반환값 : Query 객체
  • createNativeQuery(String sqlString)
    • 네이티브 SQL 쿼리를 작성하여 데이터베이스와 직접 상호작용한다
  • flush()
    • 영속성 컨텍스트의 변경 내용을 강제로 데이터베이스에 반영한다

3. 트랜잭션 관리

트랜잭션을 직접 관리하지 않지만, 보통 다음과 같이 트랜잭션 내에서 사용된다

  • 트랜잭션 시작
    • entityManager.getTransaction().begin();
  • 트랜잭션 커밋 
    • entityManager.getTransaction().commit();
  • 트랜잭션 롤백 
    • entityManager.getTransaction().rollback();

사용 예제

1. 기본 사용

@Entity
public class User {
    @Id
    @GeneratedValue
    private Long id;

    private String name;

    // Getters and Setters
}
EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-persistence-unit");
EntityManager em = emf.createEntityManager();

em.getTransaction().begin();

// Create
User user = new User();
user.setName("John Doe");
em.persist(user);

// Find
User foundUser = em.find(User.class, user.getId());
System.out.println(foundUser.getName());

// Update
foundUser.setName("Jane Doe");
em.merge(foundUser);

// Delete
em.remove(foundUser);

em.getTransaction().commit();
em.close();

 

2. JPQL 사용

TypedQuery<User> query = em.createQuery("SELECT u FROM User u WHERE u.name = :name", User.class);
query.setParameter("name", "Jane Doe");
List<User> users = query.getResultList();

스프링부트와 EntityManager

스프링부트에서는 보통 EntityManager 대신 Spring Data JPA가 제공하는 Repository 인터페이스를 사용하여 데이터베이스 작업을 수행한다

그러나, 커스텀 쿼리 작성이나 세부적인 영속성 컨텍스트 제어가 필요할 경우 EntityManager를 사용할 수 있다

@Repository
public class UserRepository {
    @PersistenceContext
    private EntityManager entityManager;

    public User findUserById(Long id) {
        return entityManager.find(User.class, id);
    }
}

요약

1. EntityManager는 JPA에서 영속성 컨텍스트와 데이터베이스 작업을 관리하는 핵심 인터페이스

 

2. 주요 역할:

  • 영속성 컨텍스트 관리
  • 엔티티 상태 전환
  • 데이터베이스 작업 수행

3. 주요 메서드:

  • persist, merge, find, remove, detach, clear, flush

4. 스프링부트에서는 EntityManager를 직접 사용할 수도 있지만, 보통 Repository를 통해 작업을 처리한다

 

 

 

 

출처 : ChatGPT

'BE > Spring & Spring Boot' 카테고리의 다른 글

[Spring Boot] Specification과 QueryDSL  (1) 2025.01.18
[Spring Boot] List<Sort.Order>와 Sort.Order.desc()  (0) 2025.01.17
[Spring Boot] @ControllerAdvice  (0) 2025.01.09
[Spring Boot] PSA  (0) 2025.01.05
[Spring Boot] AOP  (0) 2025.01.05