내일배움캠프 Spring 51일차(목) TIL - Repository

Skadi·2024년 3월 7일
0

1. SpringData

  • Repository ~ JpaRepository 까지는 **@NotRepositoryBean** 이 붙어있는 인터페이스이다.

    • JpaRepository<Entity,ID> 붙이면 알맞은 프로그래밍 된 **SimpleJpaReository** 구현체 빈이 등록된다.
      • @SpringBootApplication 을 통해 자동으로 붙여지는 @EnableJpaRepositoriesJpaRepositoriesRegistrar 를 통해서 등록된다.
        • JpaRepositoriesRegistrar 는 ImportBeanDefinitionRegistrar 의 구현체이다
        • ImportBeanDefinitionRegistrar 는 프로그래밍을 통해 빈을 주입해준다.
  • 기존 Repository vs 새로운 JpaRepository

    • 기존 Repository
      • @Repository 을 클래스에 붙인다.
      • 앞서배운 RawJPA의 Repository 기능만 가진 구현체가 생성된다. (DB별 예외처리 등)
    • 새로운 JpaRepository
      • JpaRepository<Entity,ID> 인터페이스를 인터페이스에 extends 붙인다.
        • @NotRepositoryBean 된 **상위 인터페이스들의 기능을 포함한 구현체가 프로그래밍된다. (@NotRepositoryBean** = 빈생성 막음)
        • SpringDataJpa 에 의해 엔티티의 CRUD, 페이징, 정렬 기능 메소드들을 가진 빈이 등록된다. (상위 인터페이스들의 기능)
  • JpaRepository 꿀팁!!!
    • JpaRepository 에서 사용할 메소드 제한하기
      • JpaRepository 는 기본적으로 모든 기능을 제공하기 때문에 리스크가 있을 수 있다.
      • 따라서, 아래와 같은 방법으로 원하는 기능 메소드만 구현하도록 제한할 수 있다.

@RepositoryDefinition 을 인터페이스에 붙이는법 (가장 많이 쓰임)

  • 어노테이션을 붙이면 BeanDefinition 에 직접 접근하여 프로그래밍으로 주입받을 구현체 메소드들을 지정해서 요청할 수 있다.
@RepositoryDefinition(domainClass = Comment.class, idClass = Long.class)
public interface CommentRepository {

    Comment save(Comment comment);

    List<Comment> findAll();
    
}

@NoRepositoryBean 인터페이스로 한번더 감싸는법

  • 상위 인터페이스 개념을 하나 더 만들어서 열어줄 메소드만 선언해준다.
@NoRepositoryBean
public interface MyRepository<T, ID extends Serializable> extends Repository<T, ID> {

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

    List<T> findAll();

}

0개의 댓글