JPA(Java Persistence API)
JPA(Java Persistence API)는 자바 진영의 ORM 기술 표준으로 채택된 인터페이스의 모음이다.
ORM 보다 더 구체화된 스펙을 포함한다. 즉 실제로 동작하는 것이 아닌 동작해야 하는 방법을 정리한 표준 명세다.
JPA는 내부적으로 JDBC를 사용한다. JDBC의 SQL 쿼리 의존성 등의 문제점을 보완했다.
JPA 기반의 구현체
JPA 기반 구현체에는 대표적으로 하이버네이트와 이클립스 링크, 데이터 뉴클리어스 등이 있는데 이중 가장 많이 사용하는 구현체가 하이버네이트이다.
하이버네이트
하이버네이트는 JPA 구현체 중 하나로, 자바의 ORM 프레임워크다.
Spring Data JPA
Spring Data JPA는 스프링 하위 프로젝트 중 하나로, JPA의 구현체 중 하나인 하이버네이트의 기능을 편리하게 사용하도록 모듈화되어 Spring 프레임워크에서 JPA를 편리하게 사용할 수 있도록 지원해준다.
특징
- Repository 인터페이스 제공
- 하이버네이트의 EntityManager를 직접 다루지 않고 Repository를 정의해 사용한다.
- Repository 인터페이스를 제공하여 데이터베이스와의 상호작용을 위한 메서드를 정의할 수 있다.
- 인터페이스를 사용하여 CRUD(Create, Read, Update, Delete) 작업을 수행할 수 있다.
- 다양한 데이터베이스 지원: JPA 구현체를 사용하여 관계형 데이터베이스를 사용할 수 있으며, MongoDB, Redis 등의 NoSQL 데이터베이스도 지원한다.
영속성 컨텍스트(Persistence Context)
영속성 컨텍스트는 엔티티와 레코드의 괴리 해소 기능과 객체를 보관하는 기능을 수행한다.
- 영속성 컨텍스트에 들어간 엔티티 객체는 JPA의 관리 대상이 된다.
- 영속성 컨텍스트에 들어간 객체를 영속 객체(Persistence Object)라고 부르며 해당 객체의 매핑 정보를 JPA가 데이터베이스에 반영한다.
- 영속성 컨텍스트의 생명주기는 세션단위이다.
엔티티 매니저(EntityManageer)
엔티티 매니저는 엔티티를 관리하는 객체이다. 엔티티 매니저가 데이터 베이스에 접근해서 CRUD를 수행한다.
엔티티를 영속성 컨텍스트에 추가해서 영속 객체로 만드는 작업을 수행하며, 영속성 컨텍스트와 데이터베이스를 비교하면서 실제 데이터 베이스 대상으로 작업을 수행한다.
jakarta.persistence 패키지 아래에 존재하는 것을 볼 수 있다.
엔티티매니저는 JPA의 실제 내부 구현체인 SimpleJpaRepository에서 사용하는 것을 확인할 수 있다.
SimpleJpaRepository: 실제 내부 구현체
실제 내부 구현체인 SimpleJpaRepository의 코드를 보면 엔티티 매니저를 사용하는 것을 알 수 있다.
org.springframework.data.jpa.repository.support.SimpleJpaRepository가 구현체이고
해당 클래스가 implements하고있는 JpaRepositoryImplementaion을 보면
JpaRepository를 extends하는 것으로 볼 수 있다.
해당 JpaRepository는 우리가 평소에 jpa 기능을 사용하기위해 interface를 생성하고 자주 상속받는 인터페이스인걸 알 수 있다!
예시
@Repository
public interface CompanyRepository extends JpaRepository<CompanyEntity, Long> {
...
}
아래는 SimpleJpaRepository의 내부를 봤을 때 entityManager를 이용해 Entity 관리하는 것을 예시로 볼 수 있다.
엔티티 매니저 팩토리
엔티티 매니저 팩토리는 데이터베이스에 대응하는 객체로서 엔티티 매니저를 엔티티 매니저 팩토리가 만든다.
JPA의 구현체인 하이버네이트에서는 persistence.xml 설정 파일에서 엔티티 매니저 팩토리를 구성한다.
엔티티 매니저 팩토리는 애플리케이션에서 단 하나만 생성되며, 모든 엔티티가 공유해서 사용한다.
jakarta.persistence 패키지 아래에 존재하는 것을 볼 수 있다.
아래는 엔티티 매니저 팩토리 사용을 위한 persistence.xml 파일 설정이라고 한다.
엔티티의 생명주기
엔티티의 생명주기는 엔티티가 영속성 컨텍스트에서 어떻게 관리되는지를 나타낸다. JPA에서는 엔티티의 생명주기를 다음과 같이 정의한다.
- Transient/New 상태 (비영속): 엔티티 객체가 생성되고, JPA가 아직 영속성 컨텍스트에 관리하지 않는 상태.
데이터베이스에 저장되지 않았으며, 영속성 컨텍스트가 해당 엔티티를 관리하지 않는다. - Managed 상태 (영속): 엔티티가 영속성 컨텍스트에 의해 관리되는 상태.
엔티티가 영속성 컨텍스트에 등록되면, 영속성 컨텍스트가 해당 엔티티를 추적하고 데이터베이스에 저장 및 업데이트할 때 관리된다. - Detached 상태 (준영속): 엔티티가 영속성 컨텍스트에서 분리된 상태.
영속성 컨텍스트가 더 이상 해당 엔티티를 관리하지 않으며, 데이터베이스와의 관련이 끊어진다. 일반적으로 트랜잭션이 종료될 때 엔티티는 이 상태로 전환된다. - Removed 상태: 엔티티가 영속성 컨텍스트에서 삭제된 상태.
삭제되는 엔티티는 데이터베이스에서 삭제되고, 영속성 컨텍스트가 해당 엔티티를 더 이상 관리하지 않는다.
'spring > spring jpa' 카테고리의 다른 글
[JPA] @MapsId로 FK를 PK로 설정하기 (0) | 2024.04.01 |
---|---|
[JPA][스프링 부트 핵심 가이드] 연관관계 매핑과 영속성 전이 (0) | 2024.02.19 |
[JPA] JPQL,쿼리메서드, QueryDSL, JPA Auditing - [스프링 부트 핵심 가이드] (0) | 2024.02.15 |
[JPA][스프링 부트 핵심 가이드] 리포지토리 메서드 생성 규칙 (0) | 2024.02.08 |
[JPA][스프링 부트 핵심 가이드] ORM의 개념과 장단점 (0) | 2024.02.08 |