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]
'springframework > Spring Data JPA' 카테고리의 다른 글
Spring Data Common : 쿼리 작성 키워드 (0) | 2020.11.15 |
---|---|
Spring Data Common : Null 처리 (0) | 2020.11.15 |
Spring Data Common : Repository (0) | 2020.11.15 |
Spring Data JPA 활용 개요. (0) | 2020.11.15 |
JPA 생성 쿼리 파라미터 로깅, Spring Data JPA 사용시 명심해야 할 것들 (0) | 2020.11.14 |