본문 바로가기
ORM/Spring Data JPA

JPA Repository - 개념

by 코딩하는 랄로 2024. 1. 15.
728x90

JPA Repository

JPA Repository는 기본적인 CRUD 부터 Spring Data JPA의 여러 메소드들을 사용할 수 있도록 정의된 인터페이스이다. 다음은 JPA Repository의 상속 계층도이다.

 

상속 계층도를 살펴보면 CRUD를 위한 Repositoy부터 Paingnation, Sorting 등 다양한 메소드를 제공하는 여러 Repository를 JPA Repository가 상속받고 있는 것을 볼 수 있다. 아래는 JpaRepository interface이다.

@NoRepositoryBean
public interface JpaRepository<T, ID> extends ListCrudRepository<T, ID>, ListPagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {

	// ... methods ...
    
}

 

JpaRepository를 상속받기 위해서는 Generic Type인 T 와 ID를 지정해주어야 한다. 여기서 T type은 상속받는 repository 클래스가 다룰 Entity 의 타입을 지정해주어야 하고, ID는 그 Entity의 @Id annotation이 달린 변수의 타입을 지정해주어야 한다.

 

아래는 Student 테이블을 생성하기 위한 Entity 클래스이다.

@Data
@NoArgsConstructor
@Entity
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    private String address;

}

 

Student Entity를 다루기 위해 StudentRepository를 생성하고 JpaRepository를 상속 받게 되면, 아래와 같이 T에는 Student 타입을 ID에는 Student Entity의 @Id 변수의 타입인 Long을 지정해주면 된다.

import com.lec.spring.domain.Student;
import org.springframework.data.jpa.repository.JpaRepository;

public interface StudentRepository extends JpaRepository<Student, Long> {

}

 

JpaRepository는 상속을 받은 것만으로도 Spring Context에 빈이 생성되기 때문에, 언제든지 해당 Repository를 상속받아 JPA 메소드를 편리하게 사용할 수 있다.

 

 

 

Entity Manager & 내부 동작

Entity Manager는 이름 그대로 Entity 객체들을 관리하는 역할을 하는 객체이다. Spring Data JPA를 사용하다 보면 Entity Manager를 직접 다룰 일은 크게 없지만, 에러 메세지 등이나 간혹 직접 다루어야 하는 경우가 생기기 때문에 기본적으로 Entity Manager가 무엇인지에 대해서는 알고 있어야 한다.

 

Entity Manager는 Entity를 관리한다고 하였는데, 이는 Entity 객체들의 Life Cycle(생명주기)를 관리한다는 의미이다. 자신이 관리하는 Entity 객체들을 영속성 컨텍스트(Persistence Context)에 넣어두고 이 객체들의 생명주기를 관리하는 데, 이를 더 자세히 알기 위해서는 Entity 객체의 상태에 대해서 알아야 한다.

 

각각의 상태에 대한 설명은 다음과 같다.

상태 설명
New(비영속) 객체가 Java 영역에만 존재하는 상태. 아직 데이터 베이스에 연동된 적이 없는 순수한 Java 객체이기 때문에 Entity Manager로 관리되고 있지 않은 상태이다.
Managed(영속) 데이터 베이스에 저장되고, 메모리 상에서도 같은 상태로 존재하는 상태. 객체는 영속성 컨텍스트에 포함되고 PK 값을 통해서 필요한 엔티티 객체를 꺼내 사용할 수 있게 된다.
Removed(삭제) 데이터베이스 상에서 삭제된 상태. 객체는 더 이상 영속성 컨텍스트에 존재하지 않는다.
Datached(준영속) 영속성 컨텍스트에서 엔티티 객체를 꺼내서 사용하는 상태. 준영속 상태의 객체는 고유한 PK 값을 가지고 있지만, 아직 데이터베이스에 동기화가 이루어지지 않은 상태.

 

Entity 객체는 Entity Manager에 의해 영속성 컨텍스트에 저장되고 여기에 저장된 객체를 이용하여 JDBC가 Database와 연동하여 해당 데이터를 반영하게 되는 것이다. 또한 언제든지 Entity Manager에 의해 영속성 컨텍스트에서 객체를 꺼내 데이터를 다루고 그 변경사항을 영속성 컨텍스트를 거쳐서 데이터베이스에 반영되게 된다.

 

 

 

728x90

'ORM > Spring Data JPA' 카테고리의 다른 글

기본 CRUD - Create & Update  (0) 2024.01.16
기본 CRUD - DELETE  (1) 2024.01.16
기본 CRUD - READ  (0) 2024.01.16
Entity 개념 & 기본 사용법  (1) 2024.01.11
JPA 란  (1) 2024.01.05