개발자의 오르막
스프링 데이터 JPA 커스텀 인터페이스 만드는 방법 본문
인터페이스를 정의할 때 2가지 경우가 있다.
1) JpaRepository의 메소드만을 사용하는 인터페이스를 만들 것이냐,
2) 아님 인터페이스 자체를 커스터마이징 할 것이냐
이번 시간은 독자적인 인터페이스를 만들고 싶을 때 어떻게 하는지 알아보겠다.
# 독자적인 인터페이스를 정의
@RepositoryDefinition(domainClass = Comment.class, idClass = Long.class)
public interface CommentRepository {
Comment save(Comment comment);
List<Comment> findAll();
}
위의 예시와 같이 JpaRepository를 상속받지 않는 독자적인 인터페이스를 생성한 후
Test도 구성해준다.
@RunWith(SpringRunner.class)
@DataJpaTest
public class CommentRepositoryTest {
@Autowired
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);
}
}
허나, 이 방법은 문제점이 있는데, 바로 위의 CommentRepository를 사용하고자 할때
일일이 save, findAll 을 각각 재정의를 해줘야 한다는 점이다.
이 방법을 방지하기 위해 MyRepository를 새로 생성한다.
@NoRepositoryBean
public interface MyRepository<T, Id extends Serializable> extends Repository<T, Id>{
<E extends T> E save(E entity);
List<T> findAll();
}
그리고 위의 CommentRepository가 MyRepository를 상속받게 만들어 준다.
public interface CommentRepository extends MyRepository<Comment, Long>{
}
이 방법을 사용하면, 내가 정의하고자 하는 공통 메소드를 갖고 있는 MyRepository는
제너럴 타입으로 여러 인터페이스가 상속받게 할 수 있고,
CommnetRepository는 Save, FindAll 메소드를 보유하고 있지 않기 때문에
매번 메소드를 재정의 할 필요가 없다는 말씀!!
'ORM > JPA' 카테고리의 다른 글
[# JPA] Pageable (0) | 2020.06.06 |
---|---|
SpringBoot + JPA QueryDSL 연동 (0) | 2019.10.08 |
Spring Security + JPA 로그인 구현 (String 아이디로 로그인 하기) (0) | 2019.09.26 |
Spring Security Login 기능 구현 (0) | 2019.09.24 |
스프링데이터 JPA 기본 개념과 메소드 기능 확인 (0) | 2019.09.24 |
Comments