Programming Language/JPA

[JPA] Repository 인터페이스

Ma_Sand 2023. 7. 30. 02:07
반응형

Spring Data Repository Abstraction에서의 핵심 인터페이스는 Repository이다.

이는 도메인 클래스와 도메인의 id 타입을 인자로 받는다. 주로 마커 인터페이스(Marker Interface)로 동작한다.

 

 

CRUDRepository

CRUDRepository는 엔티티 클래스에서 복잡한 CRUD 기능을 제공한다.

public interface CrudRepository<T, ID extends Serializable>
    extends Repository<T, ID> {

    <S extends T> S save(S entity); 

    T findOne(ID primaryKey);       

    Iterable<T> findAll();          

    Long count();                   

    void delete(T entity);          

    boolean exists(ID primaryKey);  

    // … more functionality omitted.
}

 

  • save(entity) : 주어진 엔티티를 저장한다.
  • findOne(pk) : 주어진 ID로 식별된 엔티티를 반환한다.
  • findAll() : 모든 엔티티를 반환한다.
  • count() : 엔티티의 숫자를 반환한다.
  • delete(entity) : 주어진 엔티티를 삭제한다.
  • exists(pk) : 주어진 ID로 엔티티가 존재하는지를 반환한다.

 

 

PagingAndSortingRepository

CRUDRepository를 확장한 것 중 PagingAndSortingRepository는 엔티티들에 대해 페이징할 수 있는 메소드를 제공한다.

public interface PagingAndSortingRepository<T, ID extends Serializable>
  extends CrudRepository<T, ID> {

  Iterable<T> findAll(Sort sort);

  Page<T> findAll(Pageable pageable);
}

 

User의 페이지 크기를 10으로 하고 두 번째 페이지에 접근하는 것은 다음과 같이 작성할 수 있다.

PagingAndSortingRepository<User, Long> repository = // … get access to a bean
Page<User> users = repository.findAll(new PageRequest(1, 10));

 

쿼리 메소드로는 쿼리 카운트나 삭제가 가능하다.

// 카운트 쿼리
public interface UserRepository extends CrudRepository<User, Long> {

  Long countByLastname(String lastname);
}

// 삭제 쿼리
public interface UserRepository extends CrudRepository<User, Long> {

  Long deleteByLastname(String lastname);

  List<User> removeByLastname(String lastname);

}
반응형

 

Query 메소드

/**
 * 1. Repository나 그 하위 인터페이스를 상속하는 인터페이스를 상속하여 
 * 2. 도메인 클래스와 ID 타입을 작성한 후 해당 인터페이스에 대해 쿼리 메소드를 선언한다.
 */
interface PersonRepository extends Repository<User, Long> {
  List<Person> findByLastname(String lastname);
}


/**
 * 3. 스프링을 설정하여 이 인터페이스들을 위한 프록시 인스턴스를 생성하게 한다.
 *    자바 설정이나 XML을 통해 할 수 있다.
 */
 // 자바 설정
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

@EnableJpaRepositories
class Config {}
 
// XML
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:jpa="http://www.springframework.org/schema/data/jpa"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans.xsd
     http://www.springframework.org/schema/data/jpa
     http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">

   <jpa:repositories base-package="com.acme.repositories"/>

</beans>

 

 

 

Repository 인터페이스 정의

일반적으로 Repository 인터페이스는 Repository, CRUDRepository 또는 PagingAndSortingRepository을 상속한다.

만약, 스프링 데이터 인터페이스를 상속하고 싶지 않으면 Repository에 @RepositoryDefinition 어노테이션을 선언할 수 있다.

@NoRepositoryBean
interface MyBaseRepository<T, ID extends Serializable> extends Repository<T, ID> {

  T findOne(ID id);

  T save(T entity);
}

interface UserRepository extends MyBaseRepository<User, Long> {
  User findByEmailAddress(EmailAddress emailAddress);
}

@NoRepositoryBean : 해당 어노테이션이 있는 모든 Repository는 런타임에서 인스턴스를 생성하지 않는다.

 

출처: https://arahansa.github.io/docs_spring/jpa.html

 

반응형