springframework/Spring Data JPA

Spring Data Common : Repository 인터페이스 정의

Jungsoomin :) 2020. 11. 15. 18:32

JpaRepository 를 상속하면, JpaRepository 가 제공하는 메서드들을 사용할 수 있게 되는데,

 

이와는 다르게 자신이 직접 원하는 메서드만을 정의하고 싶다면 @RepositoryDefinition 을 사용한다.

 

@RepositoryDefinition 의 속성에 도메인 클래스, Entity 식별자 클래스를 정의하면 된다.

 

  • 메서드 이름에 따라 JPA 가 쿼리를 만들어 주기 때문에 원하는 메서드만을 인터페이스에 정의 할수 있게 되지만, 검증을 위해 메서드 테스트가 필요하다.
@RepositoryDefinition(domainClass = Comment.class,idClass = Long.class)
public interface CommentRepository {
    Comment save(Comment comment);

    List<Comment> findAll();
}

@RunWith(SpringRunner.class)
@DataJpaTest
public class CommentRepositoryTest {

    @Autowired
    private CommentRepository commentRepository;

    @Test
    public void crud(){
        Comment comment = new Comment();
        comment.setComment("Hello Comment");
        commentRepository.save(comment);

        List<Comment> all = commentRepository.findAll();
        assertThat(all.size()).isEqualTo(1);
    }
 }
Hibernate: 
    call next value for hibernate_sequence
Hibernate: 
    insert 
    into
        comment
        (comment, post_id, id) 
    values
        (?, ?, ?)
2020-11-15 18:23:21.857 TRACE 1472 --- [           main] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [VARCHAR] - [Hello Comment]
2020-11-15 18:23:21.860 TRACE 1472 --- [           main] o.h.type.descriptor.sql.BasicBinder      : binding parameter [2] as [BIGINT] - [null]
2020-11-15 18:23:21.860 TRACE 1472 --- [           main] o.h.type.descriptor.sql.BasicBinder      : binding parameter [3] as [BIGINT] - [1]
Hibernate: 
    select
        comment0_.id as id1_1_,
        comment0_.comment as comment2_1_,
        comment0_.post_id as post_id3_1_ 
    from
        comment comment0_
2020-11-15 18:23:21.888 TRACE 1472 --- [           main] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([id1_1_] : [BIGINT]) - [1]

 


유지보수 관점에서 공통된 메서드를 정의해야한다면 @NoRepositoryBean .

 

  • 각각의 원하는 Repository 인터페이스 마다 메서드를 선언한다는 것은 유지보수 관점에서 비효율성을 야기한다.
  • 그러므로 마커 인터페이스인 Repository 를 상속하는 CustomRepository 를 만들어 필요한 메서드를 정의하고 이를 상속해 사용하면 된다.
@NoRepositoryBean
public interface MyRepository<T, Id extends Serializable> extends Repository<T, Id> {

    // T 의 하위타입 E
    <E extends T> E save(E entity);

    List<T> findAll();

    long count();

}

 

CustomRepository 를 상속하면 JpaRepositoryRegistrar 에 의해 SpringBean 으로 등록된다.

public interface CommentRepository  extends  MyRepository<Comment, Long>{
}

@RunWith(SpringRunner.class)
@DataJpaTest
public class CommentRepositoryTest {

    @Autowired
    private CommentRepository commentRepository;

    @Test
    public void crud(){
        Comment comment = new Comment();
        comment.setComment("Hello Comment");
        commentRepository.save(comment);

        List<Comment> all = commentRepository.findAll();
        assertThat(all.size()).isEqualTo(1);

        long count = commentRepository.count();
        assertThat(count).isEqualTo(1);
    }
}
Hibernate: 
    call next value for hibernate_sequence
Hibernate: 
    insert 
    into
        comment
        (comment, post_id, id) 
    values
        (?, ?, ?)
2020-11-15 18:23:21.857 TRACE 1472 --- [           main] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [VARCHAR] - [Hello Comment]
2020-11-15 18:23:21.860 TRACE 1472 --- [           main] o.h.type.descriptor.sql.BasicBinder      : binding parameter [2] as [BIGINT] - [null]
2020-11-15 18:23:21.860 TRACE 1472 --- [           main] o.h.type.descriptor.sql.BasicBinder      : binding parameter [3] as [BIGINT] - [1]
Hibernate: 
    select
        comment0_.id as id1_1_,
        comment0_.comment as comment2_1_,
        comment0_.post_id as post_id3_1_ 
    from
        comment comment0_
2020-11-15 18:23:21.888 TRACE 1472 --- [           main] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([id1_1_] : [BIGINT]) - [1]
Hibernate: 
    select
        count(*) as col_0_0_ 
    from
        comment comment0_
2020-11-15 18:23:22.186 TRACE 1472 --- [           main] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([col_0_0_] : [BIGINT]) - [1]