cs/ODOQ

[ODOQ] 엔티티 매니저란?

icodesiuuuu 2024. 11. 22. 17:25

[One Day One Question]

엔티티 매니저란?


엔티티 매니저(Entity Manager)는 JPA(Java Persistence API)에서 제공하는 핵심 인터페이스로, 엔티티와 데이터베이스 간의 상호작용을 관리하는 역할을 합니다. 엔티티 매니저를 통해 애플리케이션은 데이터베이스와의 CRUD(Create, Read, Update, Delete) 작업을 수행할 수 있습니다.

주요 기능 및 역할

  1. 엔티티 생명주기 관리
    • 엔티티 매니저는 엔티티의 상태(비영속, 영속, 준영속, 삭제)를 관리합니다.
      • 비영속(New/Transient): 엔티티가 영속성 컨텍스트에 포함되지 않은 상태.
      • 영속(Managed): 영속성 컨텍스트에서 관리되는 상태.
      • 준영속(Detached): 영속성 컨텍스트에서 분리된 상태.
      • 삭제(Removed): 데이터베이스에서 삭제 예정 상태.
  2. CRUD 작업 지원
    • Persist: 새로운 엔티티를 영속성 컨텍스트에 저장하고 데이터베이스에 반영.
    • Find: 데이터베이스에서 특정 엔티티를 조회.
    • Merge: 준영속 상태의 엔티티를 다시 영속 상태로 변환.
    • Remove: 엔티티를 영속성 컨텍스트에서 제거하고 데이터베이스에서도 삭제.
  3. 쿼리 실행
    • JPQL(Java Persistence Query Language) 또는 네이티브 SQL을 실행하여 복잡한 데이터 조회 및 조작을 지원합니다.
      • createQuery(): JPQL 쿼리 실행.
      • createNativeQuery(): 네이티브 SQL 실행.
  4. 영속성 컨텍스트 관리
    • 영속성 컨텍스트는 엔티티 매니저가 관리하는 1차 캐시로, 동일한 트랜잭션 내에서 데이터베이스와의 불필요한 상호작용을 줄입니다.
    • 영속성 컨텍스트는 데이터 변경 시 자동으로 변경 내용을 감지하고 데이터베이스에 반영(Dirty Checking)합니다.
  5. 트랜잭션 관리
    • 엔티티 매니저는 데이터 조작 시 트랜잭션을 통해 작업을 안전하게 수행합니다.
    • begin(), commit(), rollback() 메서드를 통해 트랜잭션 경계를 설정.

 

엔티티의 각 상태

1. 비영속 상태 (Transient)

  • 설명:
    엔티티 객체가 새로 생성되었지만, 아직 영속성 컨텍스트와 전혀 연관되지 않은 상태입니다. 데이터베이스와는 관계가 없고, 단순히 메모리 상에만 존재합니다.
    Member member = new Member("홍길동");

2. 영속 상태 (Managed)

  • 설명:
    엔티티 객체가 영속성 컨텍스트에 의해 관리되고 있는 상태입니다.
    • 특징:
      1. 영속성 컨텍스트가 엔티티 객체의 변경 사항을 감지하여 데이터베이스에 반영합니다. (Dirty Checking)
      2. 1차 캐시에 저장되어 동일한 엔티티를 반복 조회할 경우, 데이터베이스에 다시 접근하지 않습니다.
  • 전환 메서드:
    • em.persist(entity) → 비영속 → 영속
    • em.find() → 데이터베이스에서 조회된 엔티티는 자동으로 영속 상태가 됩니다.
em.persist(member); // member를 영속성 컨텍스트에 등록
em.find(Member.class, 1L); // 영속 상태의 엔티티 조회

 

3. 준영속 상태 (Detached)

  • 설명:
    한때 영속성 컨텍스트에서 관리되던 엔티티 객체가 더 이상 관리되지 않는 상태입니다.
    • 특징:
      1. 영속성 컨텍스트에서 분리되므로 데이터베이스 동기화가 중단됩니다.
      2. 객체 자체는 여전히 메모리에 존재하므로 읽거나 수정할 수는 있지만, 변경 사항은 데이터베이스에 반영되지 않습니다.
  • 전환 메서드:
    • em.detach(entity) → 특정 엔티티를 준영속 상태로 전환
    • em.clear() → 모든 엔티티를 준영속 상태로 전환
    • em.close() → 영속성 컨텍스트 종료
em.detach(member); // 특정 엔티티만 준영속 상태로 전환
em.clear(); // 모든 엔티티를 준영속 상태로 전환
em.close(); // 영속성 컨텍스트 종료

 

4. 삭제 상태 (Removed)

  • 설명:
    엔티티 객체가 영속성 컨텍스트에서 삭제된 상태입니다.
    • 특징:
      1. 영속 상태의 엔티티에 em.remove()를 호출하면 삭제 상태로 전환됩니다.
      2. 데이터베이스에서 해당 엔티티가 삭제됩니다.
  • 전환 메서드:
    • em.remove(entity)
em.remove(member); // 영속 상태의 엔티티를 삭제 상태로 전환

 

요약

상태설명관련 메서드

비영속 상태 엔티티가 영속성 컨텍스트와 연관되지 않은 상태 new, 아무것도 하지 않은 상태
영속 상태 엔티티가 영속성 컨텍스트에 의해 관리되고 있는 상태 em.persist(), em.find(), em.merge()
준영속 상태 엔티티가 한때 영속 상태였으나 현재는 영속성 컨텍스트에서 분리된 상태 em.detach(), em.clear(), em.close()
삭제 상태 엔티티가 영속성 컨텍스트에서 삭제된 상태 em.remove()

'cs > ODOQ' 카테고리의 다른 글

[ODOQ] JPA의 N + 1  (0) 2024.11.25
[ODOQ] TCP와 UDP의 차이점  (1) 2024.11.25
[ODOQ] HTTP와 HTTPS의 차이점  (0) 2024.11.24
[ODOQ] JPA의 ddl-auto 옵션  (0) 2024.11.22
[ODOQ] Spring Data JPA에서 새로운 Entity인지 판단하는 방법  (0) 2024.11.21