엔티티 매니저(Entity Manager)란?

Kkd·2024년 11월 20일
0

매일메일 개념정리

목록 보기
2/93

엔티티 매니저(Entity Manager)란?

EntityManager는 JPA(Java Persistence API)에서 엔티티를 관리하는 핵심 인터페이스입니다.
JPA를 통해 데이터베이스와 상호작용하며, 엔티티의 생명주기를 관리하고 쿼리를 실행하는 역할을 수행합니다.


주요 역할 및 기능

  1. 엔티티 생명주기 관리

    • EntityManager는 엔티티를 영속성 컨텍스트(Persistence Context)에 등록하고 관리합니다.
    • 엔티티는 아래 네 가지 생명주기 상태를 가집니다:
      • 비영속(New/Transient): 영속성 컨텍스트와 관련이 없는 상태.
      • 영속(Managed): 영속성 컨텍스트에서 관리되는 상태.
      • 준영속(Detached): 영속성 컨텍스트에서 분리된 상태.
      • 삭제(Removed): 삭제 예약 상태.
  2. CRUD 작업

    • EntityManager는 엔티티를 데이터베이스에 저장, 조회, 수정, 삭제하는 메서드를 제공합니다.
      • persist(entity): 엔티티를 영속성 컨텍스트에 등록.
      • find(entityClass, id): 데이터베이스에서 엔티티를 조회.
      • merge(entity): 준영속 상태의 엔티티를 다시 영속 상태로 병합.
      • remove(entity): 엔티티를 삭제 예약 상태로 변경.
  3. JPQL 실행

    • JPQL(Java Persistence Query Language)을 사용하여 데이터베이스 쿼리를 실행합니다.
    TypedQuery<Member> query = em.createQuery("SELECT m FROM Member m WHERE m.name = :name", Member.class);
    query.setParameter("name", "John");
    List<Member> members = query.getResultList();
  4. 트랜잭션 관리

    • 데이터 변경 작업(persist, merge, remove)은 반드시 트랜잭션 안에서 실행되어야 합니다.
    • 트랜잭션 시작과 커밋은 EntityTransaction을 통해 제어합니다.
    em.getTransaction().begin();
    em.persist(entity);
    em.getTransaction().commit();
  5. 캐싱

    • 1차 캐시: EntityManager는 영속성 컨텍스트에 이미 존재하는 엔티티를 재사용하여 불필요한 데이터베이스 조회를 줄입니다.

엔티티 매니저의 주요 메서드

메서드설명
persist(Object entity)엔티티를 영속성 컨텍스트에 저장.
find(Class<T> clazz, Object primaryKey)주어진 ID로 엔티티를 조회.
merge(Object entity)준영속 상태의 엔티티를 다시 영속 상태로 병합.
remove(Object entity)엔티티를 삭제 예약 상태로 변경.
flush()영속성 컨텍스트의 변경 내용을 데이터베이스에 반영.
clear()영속성 컨텍스트를 초기화.

엔티티 매니저의 생성 및 사용

  1. 생성

    • EntityManagerEntityManagerFactory를 통해 생성됩니다.
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistenceUnitName");
    EntityManager em = emf.createEntityManager();
  2. 사용

    • 일반적인 JPA 작업 흐름:
    EntityManager em = emf.createEntityManager();
    EntityTransaction tx = em.getTransaction();
    
    try {
        tx.begin();  // 트랜잭션 시작
        Member member = new Member();
        member.setName("John Doe");
        em.persist(member);  // 엔티티 저장
        tx.commit();  // 트랜잭션 커밋
    } catch (Exception e) {
        tx.rollback();  // 에러 발생 시 롤백
    } finally {
        em.close();  // 엔티티 매니저 닫기
    }

주의 사항

  1. 스레드 안전하지 않음

    • EntityManager는 스레드 안전하지 않으므로, 여러 스레드에서 공유하면 안 됩니다.
    • 각 요청마다 별도의 EntityManager를 생성하거나, 스프링에서는 @Transactional을 통해 관리합니다.
  2. 트랜잭션 범위 내 사용

    • 데이터 변경 작업은 반드시 트랜잭션 안에서 수행되어야 합니다.
    • 트랜잭션이 없으면 데이터베이스 변경이 적용되지 않습니다.
  3. close() 호출

    • 작업이 끝난 후 반드시 close()를 호출하여 리소스를 해제해야 합니다.

요약

  • EntityManager는 JPA의 중심으로, 엔티티의 생명주기와 데이터베이스 작업을 관리하는 역할을 합니다.
  • 트랜잭션, 영속성 컨텍스트, JPQL 등을 통해 데이터베이스와 상호작용하며, 성능 최적화를 위해 캐싱도 지원합니다.
  • 안전하고 효율적으로 사용하려면 트랜잭션과 스레드 안전성에 유의해야 합니다.

추가 학습 자료

profile
🌱

0개의 댓글