아카이브

[스프링 데이터 JPA] 스프링 데이터 Common 1.레포지토리 (테스트) 본문

Spring/스프링 데이터 JPA

[스프링 데이터 JPA] 스프링 데이터 Common 1.레포지토리 (테스트)

주멘이 2021. 1. 16. 20:17

스프링 데이터 Common

  • Repository: 단순 Marker용 Interface로 Repository 용도로 쓰일 것을 암시하는 것.
  • CrudRepository: 기본적인 CRUD 기능들을 제공.
  • PagingAndSortingRepository  : Sort, Pageable findAll 메서드 제공

@NoRepositoryBean

spring data가 runtime시 bean을 이 어노테이션이 기입된 bean을 등록하지 않도록 방지하는 것

 

PostRepository에 사용자 메서드 추가

/**
 * JPA의 기본적인 동작 원리와 빈 등록
 *
 * @Repository가 없어도 Bean으로 등록해 줌
 * @EnableJpaRepositories 여기서부터 시작한다
 * EnableJpaRepositories 안에 @Import(JpaRepositoriesRegistrar.class)로 시작해서
 * RepositoryBeanDefinitionRegistrarSupport 이 implements ImportBeanDefinitionRegistrar(핵심) 하고
 * @Override registerBeanDefinitions() method
 */
public interface PostRepository extends JpaRepository<Post, Long> {

    Page<Post> findByTitleContains(String title, Pageable pageable);

    long countByTitleContains(String title);

}

 

JPA 슬라이싱 테스트 코드

@DataJpaTest// slicing test using h2 database
class PostRepositoryTest {

    @Autowired
    PostRepository postRepository;

    @Test
    @Rollback(false)    // @DataJpaTest의 @Transactional은 기본적으로 Rollback을 시킨다. 그러면 쿼리를 볼 수 없으니, Rollback=false로 설정한다.
    public void crudRepositoryTest() {
        //Given
        Post post = new Post();
        post.setTitle("hello spring boot common");

        //When
        assertThat(post.getId()).isNull();  // Transient status
        Post save = postRepository.save(post);

        //Then
        assertThat(save.getId()).isNotNull();

        //When
        List<Post> all = postRepository.findAll();

        //Then
        assertThat(all.size()).isEqualTo(1);
        assertThat(all).contains(save);

        //When
        Page<Post> postPage = postRepository.findAll(PageRequest.of(0, 10));

        //Then
        assertThat(postPage.getTotalElements()).isEqualTo(1);
        assertThat(postPage.getNumber()).isEqualTo(0);
        assertThat(postPage.getSize()).isEqualTo(10);
        assertThat(postPage.getNumberOfElements()).isEqualTo(1);

        //When
        Page<Post> titleContains = postRepository.findByTitleContains("spring", PageRequest.of(0, 10));
        //Then
        assertThat(titleContains.getTotalElements()).isEqualTo(1);
        assertThat(titleContains.getNumber()).isEqualTo(0);
        assertThat(titleContains.getSize()).isEqualTo(10);
        assertThat(titleContains.getNumberOfElements()).isEqualTo(1);

        //When
        long countByTitleContains = postRepository.countByTitleContains("spring");
        //Then
        assertThat(countByTitleContains).isEqualTo(1);

    }


}