Spring Data JPA - Common Repository
Spring Data JPA
백기선님의 강의인 Spring Data JPA 강의를 듣고 공부한 내용을 정리한 글
Common Repository
이번 시간에는 스프링 데이터 Common Repository에 대해서 학습해보자.
우리는 앞서 지난 시간에 JpaRepository를 사용하였는데 이는 스프링 데이터 JPA에서 제공하는 인터페이스이다.
이 인터페이스는 다시 PagingAndSortingRepository
를 상속받고 있는데 이 인터페이스부터 Common에 해당하는 인터페이스이다.
그림으로 표현하면 대략 이렇게 된다.
@NoRepositoryBean
public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {
/**
* Returns all entities sorted by the given options.
*
* @param sort
* @return all entities sorted by the given options
*/
Iterable<T> findAll(Sort sort);
/**
* Returns a {@link Page} of entities meeting the paging restriction provided in the {@code Pageable} object.
*
* @param pageable
* @return a page of entities
*/
Page<T> findAll(Pageable pageable);
}
PagingAndSortingRepository
는 이름에 어울리게 페이징과 소팅에 관한 기능을 제공한다.
이 인터페이스는 CrudRepository
를 상속받고 있다.
/**
* Interface for generic CRUD operations on a repository for a specific type.
*
* @author Oliver Gierke
* @author Eberhard Wolff
*/
@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {
...
이름부터 Crud이기 때문에 무슨 기능을 하는지는 더 자세히 설명하지 않겠다.
이 인터페이스는 다시 Repository
라고 하는 인터페이스를 상속받고 있는데, 이 인터페이스는 기능은 없고 마커용이라고 보면 된다.
실질적인 기능을 정의한 인터페이스가 CrudRepository
이다.
여기에 @NoRepositoryBean
라는 애노테이션이 붙어있는데 스프링 데이터 Repository가 이 인터페이스를 빈으로 등록하지 않도록 이러한 애노테이션이 붙어있는 것을 확인할 수 있다.
이 CrudRepository
인터페이스를 보면 JpaRepository에서 사용하던 기능들을 살펴볼 수 있다.
h2 DB를 사용한 테스트 코드
그러면 이제 JpaRepository를 사용한 테스트 코드를 만들어보자.
@DataJpaTest
class PostRepositoryTest {
@Autowired
lateinit var postRepository:PostRepository
@Test
fun crudRepository() {
// Given
val post = Post(
null,
"Hello SpringBoot Common"
)
assertThat((post.id)).isNull()
// When
val newPost = postRepository.save(post)
// Then
assertThat(newPost.id).isNotNull()
}
}
이 코드를 실행하면 하이버네이트가 insert 쿼리조차 날리지 않는 것을 볼 수 있다.
이는 @DataJpaTest
에 @Transactional
애노테이션이 붙어있어서 이 테스트들은 항상 롤백되기 때문에 하이버네이트가 “어차피 롤백될 거 내가 insert를 왜 날려? 안해!”라고 하면서 쿼리를 안날린다. (이런 건방지고 똑똑한 하이버네이트 같으니라고..)
참고로 @Transactional
애노테이션은 스프링 프레임워크에서 제공되는 기능이며 쿼리를 안날린 것은 하이버네이트, 즉 스프링 데이터 JPA가 작업한 것이다.
이는 @Rollback(false)
애노테이션을 주면 해결 가능하다.
Reference
인프런 백기선님의 스프링 Data JPA