Spring Data JPA - Common Repository

Spring Data JPA

백기선님의 강의인 Spring Data JPA 강의를 듣고 공부한 내용을 정리한 글

Common Repository

이번 시간에는 스프링 데이터 Common Repository에 대해서 학습해보자.

우리는 앞서 지난 시간에 JpaRepository를 사용하였는데 이는 스프링 데이터 JPA에서 제공하는 인터페이스이다.

이 인터페이스는 다시 PagingAndSortingRepository를 상속받고 있는데 이 인터페이스부터 Common에 해당하는 인터페이스이다.

그림으로 표현하면 대략 이렇게 된다.

스크린샷 2020-05-21 오후 11 03 42

@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



© 2022. by minkuk

Powered by minkuk