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



© 2022. by minkuk

Powered by minkuk