Spring Data JPA - 인터페이스 정의하기
Spring Data JPA
백기선님의 강의인 Spring Data JPA 강의를 듣고 공부한 내용을 정리한 글
인터페이스 정의하기
Repository를 색다르게 정의해보자.
기본적으로 CRUDRepository에서 제공하는 기능 외에 내가 정의한 기능을 사용하고 싶을 수 있다.
Comment에 해당하는 Repository를 작성해보자.
@RepositoryDefinition(domainClass = Comment::class, idClass = Long::class)
interface CommentRepository {
fun save(comment: Comment): Comment
fun findAll(): List<Comment>
}
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class CommentRepositoryTest {
@Autowired
lateinit var commentRepository: CommentRepository
@Test
fun crud() {
var comment = Comment()
comment.comment = "Hello Comment"
commentRepository.save(comment)
val all = commentRepository.findAll()
assertThat(all.size).isEqualTo(3)
}
}
공통되는 함수들 인터페이스로 뽑아내기
save와 findAll을 직접 정의하는 경우라면
매번 레포지토리를 생성할 때 마다 함수를 선언해야해서 귀찮을 수 있다.
이럴 때는 공통 인터페이스로 뽑아내는 방법이 있다.
@NoRepositoryBean
interface MyRepository<T, Id:Serializable>: Repository<T, Id> {
fun <E:T> save(entity : E): T
fun findAll(): List<T>
}
MyRepository를 공통 인터페이스로 뽑아내고,
@RepositoryDefinition(domainClass = Comment::class, idClass = Long::class)
interface CommentRepository: MyRepository<Comment,Long> {
}
그 레포지토리를 상속받게 하면 된다.
이렇게 하면 매번 반복되는 함수를 정의하지 않아도 된다.
Reference
인프런 백기선님의 스프링 Data JPA