엔티티에 한마디로 설명해보세요!
- 대부분 JPA에서 DB의 Table과 맵핑되는 클래스라고 답변할 것입니다.
여기까지는 대부분 답변을 쉽게 할 것 입니다! 그러면 Entity의 LifeCycle에 대해 말해보시요!!
여기서부터 JPA를 제대로 공부하지 않았던, 필자의 한계가 보였다ㅎㅎ
- JPA에서는 Entity를 관리하는 Persist Context가 존재합니다. 그리고 Persist Context는 Entity의 LifeCycle의 상태를 관리합니다!!!
- 그러면 Entity Manager는 뭐야 ??
Entity Manager도 Entity의 LifeCycle을 관리해!!
필자가 공부하면서 의문이 들었던 것이 저 두 가지의 차이를 잘 모르겠었습니다. 이러한 의문을 아래의 정리를 통해 해결했습니다.
엔티티 관리: EntityManager는 엔티티의 생명주기를 관리합니다. 엔티티를 영속성 컨텍스트에 저장하고, 수정하고, 삭제하는 작업을 수행할 수 있습니다. 또한, 엔티티 객체의 상태를 관리하고, 변경사항을 추적하여 데이터베이스에 반영할 수 있습니다.
트랜잭션 관리: EntityManager는 트랜잭션을 관리하는 기능을 제공합니다. EntityManager를 사용하여 트랜잭션을 시작하고, 커밋하거나 롤백할 수 있습니다. 트랜잭션을 사용하여 엔티티의 변경사항을 일괄적으로 처리하거나, 롤백을 통해 변경사항을 취소할 수 있습니다.
쿼리 실행: EntityManager는 데이터베이스에 대한 쿼리를 실행하는 기능을 제공합니다. JPQL(Java Persistence Query Language)을 사용하여 엔티티 객체를 조회하거나, 복잡한 조건을 적용한 쿼리를 실행할 수 있습니다. 또한, TypedQuery나 Query 인터페이스를 사용하여 쿼리 결과를 반환받을 수 있습니다.
관계 매핑: EntityManager는 엔티티 클래스 간의 관계를 매핑하는 기능을 제공합니다. 관계 매핑을 통해 엔티티 객체 간의 관계를 표현하고, 객체 간의 연관성을 유지하며, 데이터베이스 테이블 간의 관계를 매핑할 수 있습니다.
엔티티 관리: 영속성 컨텍스트는 엔티티 객체의 생명주기를 관리합니다. 엔티티 매니저를 통해 엔티티를 영속성 컨텍스트에 저장하면, 해당 엔티티는 관리 상태(Managed)가 됩니다. 이후에 엔티티의 변경사항을 추적하고, 트랜잭션 커밋 시에 변경사항을 데이터베이스에 자동으로 반영합니다.
1차 캐시: 영속성 컨텍스트는 엔티티 객체를 캐싱하는 1차 캐시를 가지고 있습니다. 1차 캐시는 엔티티의 식별자를 기준으로 엔티티를 저장하고 조회할 수 있는 캐시입니다. 이를 통해 같은 엔티티를 여러 번 조회할 때 데이터베이스에 접근하는 것을 줄여 성능을 향상시킵니다.
지연 로딩: 영속성 컨텍스트는 연관된 엔티티의 지연 로딩(Lazy Loading)을 지원합니다. 지연 로딩은 연관된 엔티티가 실제로 필요한 시점까지 로딩을 지연시키는 방식으로 성능을 최적화합니다.
동일성 보장: 영속성 컨텍스트는 동일한 식별자를 가지는 엔티티에 대해 동일성(Identity)을 보장합니다. 즉, 동일한 식별자를 가진 엔티티 객체는 항상 동일한 객체로 인식됩니다.
둘의 기능와 특성을 이해해보면, Entity Managera와 Persist Context는 매우 밀접한 관계가 있는 것을 알 수 있습니다.
한마디로 정리하자면 아래와 같습니다.
Persistence Context는 엔티티 객체(Entity)를 관리하는 논리적인 영역입니다. EntityManager를 통해 영속성 컨텍스트에 접근하고, 엔티티 객체를 영속성 컨텍스트에 저장하고 관리합니다.
우리는 @Entity 어노테이션을 활용해 간단히 Entity 객체를 생성하고 JPA에게 LifeCycle을 위임하기에 위의 내용을 크게 인지 못하고 있을 수 있습니다.
하지만 One To Many와 같은 관계를 가지고 있을 때 Fetch를 하는 과정에서 우리는 LifeCycle을 고려해주지 않는 다면, Error를 마주칠 것입니다.
이번에는 JPA의 기본이자 전부인 Entity Manager와 Persist Context에 대해 간단하게 개념을 알아보는 글이였다. 사실 위의 두가지 인터페이스로 인해 매우 강력하고 편리한 기능들을 제공한다. 그에 따른 기능들도 공부하다가 언젠가 글을 쓸 예정입니다.