엔티티 매니저(EntityManager)의 역할
엔티티 매니저(EntityManager)는 JPA(Java Persistence API)에서 영속성 컨텍스트(Persistence Context)를 관리하는 핵심 인터페이스로, 엔티티의 생명 주기를 관리한다. 이를 통해 애플리케이션과 데이터베이스 간의 객체 지향적인 상호작용을 지원하며, 개발자가 보다 직관적이고 효율적인 방식으로 데이터베이스를 조작할 수 있게 한다.
엔티티(Entity)의 4가지 상태
엔티티는 JPA에서 영속성 컨텍스트와의 관계에 따라 다음과 같은 네 가지 상태를 가질 수 있다:
1. 비영속(New)
Member member = new Member("홍길동");
- 엔티티 객체가 새로 생성되었지만 아직 영속성 컨텍스트와 연결되지 않은 상태이다.
- 오직 메모리상에서만 존재하며 DB와는 관련이 없다.
2. 영속(Managed)
em.persist(member); // 엔티티를 영속 상태로 전환
em.merge(detachedMember); // 준영속 상태의 엔티티를 다시 영속 상태로 전환
Member findMember = em.find(Member.class, 1L); // DB 또는 1차 캐시에서 조회
- 엔티티 객체가 영속성 컨텍스트에 의해 관리되는 상태이다.
- 1차 캐시를 활용해 엔티티를 관리하며, 변경 사항이 트랜잭션 커밋 시 자동으로 DB에 반영된다.
- 엔티티 변경 감지(Dirty Checking)를 통해 자동으로 DB와의 동기화를 수행한다.
3. 준영속(Detached)
em.detach(member); // 특정 엔티티만 준영속 상태로 전환
em.clear(); // 모든 엔티티를 준영속 상태로 전환
em.close(); // 영속성 컨텍스트 종료, 모든 엔티티가 준영속 상태로 전환
- 엔티티 객체가 한 번 영속 상태였으나, 이후 영속성 컨텍스트로부터 분리된 상태이다.
- 엔티티의 변경 사항은 더 이상 자동으로 DB에 반영되지 않는다.
- 준영속 상태의 엔티티를 다시 영속 상태로 변경하려면
em.merge()
메서드를 사용해야 한다.
4. 삭제(Removed)
em.remove(member);
- 엔티티가 영속성 컨텍스트와 데이터베이스에서 제거되는 상태이다.
- 트랜잭션이 커밋될 때 DB에서 해당 엔티티가 실제로 삭제된다.
엔티티 매니저의 주요 메서드
메서드 | 역할 |
---|---|
persist() |
엔티티를 영속성 컨텍스트에 추가하여 관리 상태로 전환한다. |
merge() |
준영속 상태의 엔티티를 다시 영속 상태로 전환하거나 비영속 엔티티를 영속 상태로 만든다. |
remove() |
엔티티를 삭제 상태로 만든다. |
find() |
기본 키를 이용하여 엔티티를 조회한다. |
flush() |
영속성 컨텍스트의 변경 내용을 DB에 즉시 반영한다. |
detach() |
특정 엔티티를 준영속 상태로 전환한다. |
clear() |
영속성 컨텍스트의 모든 엔티티를 준영속 상태로 만든다. |
close() |
엔티티 매니저와 영속성 컨텍스트를 종료하여 모든 엔티티를 준영속 상태로 만든다. |
JPQL과 네이티브 쿼리 활용
엔티티 매니저는 JPQL(Java Persistence Query Language) 또는 네이티브 쿼리를 이용하여 더욱 복잡한 데이터베이스 조회와 조작 작업을 지원한다.
JPQL 사용 예시:
TypedQuery<Member> query = em.createQuery("SELECT m FROM Member m WHERE m.name = :name", Member.class);
query.setParameter("name", "홍길동");
List<Member> members = query.getResultList();
네이티브 쿼리 사용 예시:
Query nativeQuery = em.createNativeQuery("SELECT * FROM Member WHERE name = ?", Member.class);
nativeQuery.setParameter(1, "홍길동");
List<Member> result = nativeQuery.getResultList();
참고 자료
'지식저장소' 카테고리의 다른 글
공유 락과 배타 락 (0) | 2025.04.23 |
---|---|
JPA의 N + 1 (0) | 2025.04.01 |
Spring Data JPA에서 새로운 Entity인지 판단하는 방법은? (0) | 2025.03.26 |
카프카 알아보기 (0) | 2025.02.17 |
정적 팩토리 메서드란? (0) | 2024.11.19 |