[One Day One Question]
엔티티 매니저란?
엔티티 매니저(Entity Manager)는 JPA(Java Persistence API)에서 제공하는 핵심 인터페이스로, 엔티티와 데이터베이스 간의 상호작용을 관리하는 역할을 합니다. 엔티티 매니저를 통해 애플리케이션은 데이터베이스와의 CRUD(Create, Read, Update, Delete) 작업을 수행할 수 있습니다.
주요 기능 및 역할
- 엔티티 생명주기 관리
- 엔티티 매니저는 엔티티의 상태(비영속, 영속, 준영속, 삭제)를 관리합니다.
- 비영속(New/Transient): 엔티티가 영속성 컨텍스트에 포함되지 않은 상태.
- 영속(Managed): 영속성 컨텍스트에서 관리되는 상태.
- 준영속(Detached): 영속성 컨텍스트에서 분리된 상태.
- 삭제(Removed): 데이터베이스에서 삭제 예정 상태.
- 엔티티 매니저는 엔티티의 상태(비영속, 영속, 준영속, 삭제)를 관리합니다.
- CRUD 작업 지원
- Persist: 새로운 엔티티를 영속성 컨텍스트에 저장하고 데이터베이스에 반영.
- Find: 데이터베이스에서 특정 엔티티를 조회.
- Merge: 준영속 상태의 엔티티를 다시 영속 상태로 변환.
- Remove: 엔티티를 영속성 컨텍스트에서 제거하고 데이터베이스에서도 삭제.
- 쿼리 실행
- JPQL(Java Persistence Query Language) 또는 네이티브 SQL을 실행하여 복잡한 데이터 조회 및 조작을 지원합니다.
- createQuery(): JPQL 쿼리 실행.
- createNativeQuery(): 네이티브 SQL 실행.
- JPQL(Java Persistence Query Language) 또는 네이티브 SQL을 실행하여 복잡한 데이터 조회 및 조작을 지원합니다.
- 영속성 컨텍스트 관리
- 영속성 컨텍스트는 엔티티 매니저가 관리하는 1차 캐시로, 동일한 트랜잭션 내에서 데이터베이스와의 불필요한 상호작용을 줄입니다.
- 영속성 컨텍스트는 데이터 변경 시 자동으로 변경 내용을 감지하고 데이터베이스에 반영(Dirty Checking)합니다.
- 트랜잭션 관리
- 엔티티 매니저는 데이터 조작 시 트랜잭션을 통해 작업을 안전하게 수행합니다.
- begin(), commit(), rollback() 메서드를 통해 트랜잭션 경계를 설정.
엔티티의 각 상태
1. 비영속 상태 (Transient)
- 설명:
엔티티 객체가 새로 생성되었지만, 아직 영속성 컨텍스트와 전혀 연관되지 않은 상태입니다. 데이터베이스와는 관계가 없고, 단순히 메모리 상에만 존재합니다.Member member = new Member("홍길동");
2. 영속 상태 (Managed)
- 설명:
엔티티 객체가 영속성 컨텍스트에 의해 관리되고 있는 상태입니다.- 특징:
- 영속성 컨텍스트가 엔티티 객체의 변경 사항을 감지하여 데이터베이스에 반영합니다. (Dirty Checking)
- 1차 캐시에 저장되어 동일한 엔티티를 반복 조회할 경우, 데이터베이스에 다시 접근하지 않습니다.
- 특징:
- 전환 메서드:
- em.persist(entity) → 비영속 → 영속
- em.find() → 데이터베이스에서 조회된 엔티티는 자동으로 영속 상태가 됩니다.
em.persist(member); // member를 영속성 컨텍스트에 등록
em.find(Member.class, 1L); // 영속 상태의 엔티티 조회
3. 준영속 상태 (Detached)
- 설명:
한때 영속성 컨텍스트에서 관리되던 엔티티 객체가 더 이상 관리되지 않는 상태입니다.- 특징:
- 영속성 컨텍스트에서 분리되므로 데이터베이스 동기화가 중단됩니다.
- 객체 자체는 여전히 메모리에 존재하므로 읽거나 수정할 수는 있지만, 변경 사항은 데이터베이스에 반영되지 않습니다.
- 특징:
- 전환 메서드:
- em.detach(entity) → 특정 엔티티를 준영속 상태로 전환
- em.clear() → 모든 엔티티를 준영속 상태로 전환
- em.close() → 영속성 컨텍스트 종료
em.detach(member); // 특정 엔티티만 준영속 상태로 전환
em.clear(); // 모든 엔티티를 준영속 상태로 전환
em.close(); // 영속성 컨텍스트 종료
4. 삭제 상태 (Removed)
- 설명:
엔티티 객체가 영속성 컨텍스트에서 삭제된 상태입니다.- 특징:
- 영속 상태의 엔티티에 em.remove()를 호출하면 삭제 상태로 전환됩니다.
- 데이터베이스에서 해당 엔티티가 삭제됩니다.
- 특징:
- 전환 메서드:
- 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 |