Programming/Spring Data JPA

스프링 데이터 Common - 1 (스프링 데이터 JPA - 4)

흠냐아뤼 2021. 1. 1. 15:47
728x90

 

1. Repository

 

 

- 기본적으로 제공하는 기능 테스트

@RunWith(SpringRunner.class)
@DataJpaTest
class PostRepositoryTest {

    public static final String STRING = "31";
    @Autowired
    PostRepository postRepository;

    @Test
    @Rollback(false)
    public void curdRepository() {
        // Given
        Post post = new Post();
        post.setTitle("Title1");
        assertThat(post.getId()).isNull();

        // When
        Post newPost = postRepository.save(post);
        // Then
        assertThat(newPost.getId()).isNotNull();

        // When
        List<Post> posts = postRepository.findAll();
        // Then
        assertThat(posts.size()).isEqualTo(1);
        assertThat(posts.contains(newPost));

        // When
        Page<Post> page = postRepository.findAll(PageRequest.of(0, 10));
        // Then
        assertThat(page.getTotalElements()).isEqualTo(1);
        assertThat(page.getNumberOfElements()).isEqualTo(1);
    }

}

 

 

2. 인터페이스 정의하기

JpaRepository를 사용하면 모든 기능을 제공받을 수 있음.

 

- 직접 기능을 구현하는 방법

필요한 기능만 직접 추가하여 사용 가능

스프링 데이터 JPA가 우리가 정의한 메소드의 구현체만을 제공하게 됨

@RepositoryDefinition(domainClass = Comment.class, idClass = Long.class)
public interface CommentRepository {

    Comment save(Comment comment);

    List<Comment> findAll();

}

 

 

3. Null 처리

*콜렉션은 NULL을 리턴하지 않고, 비어있는 콜렉션을 리턴한다*

 

Optional

Optional<Comment> findById(Long id);
@RunWith(SpringRunner.class)
@DataJpaTest
class CommentRepositoryTest {

    @Autowired
    CommentRepository repository;

    @Test
    public void crud() {
        Optional<Comment> byId = repository.findById(10l);
        assertThat(byId).isEmpty();
//        Comment comment = byId.orElse(new Comment());
//        Comment comment1 = byId.orElseThrow();
    }

}

 

@NonNullApi, @NonNull, @Nullable

- 런타임 체크를 지원함

- 해당 메소드 또는 매개변수에 작성

 

 

4. 쿼리 만들기

세 가지 전략이 있음

1. 메소드 이름을 분석해서 쿼리 만들기

2. 미리 정의해 둔 쿼리 찾아 사용하기 (@Query - PSQL, Native Query 둘 다 사용 가능)

3. 미리 정의한 쿼리 찾아보고 없으면 메소드 이름으로 만들기 (기본전략)

 

- 쿼리 만드는 방법

 

@팁

먼저 메소드를 이용해서 쿼리를 만들 수 있는지 확인하기

  -> 확인하는 법 : 1. 일단 돌려보기(만들 수 없으면 런타임 에러) / 2. 테스트 코드를 통해서 쿼리를 확인

 

이후 메소드 이름으로 쿼리를 표현하기 힘든 경우에 쿼리를 직접 만들어 사용

 

public interface CommentRepository extends JpaRepository<Comment, Long> {

//    List<Comment> findByCommentContainsIgnoreCase(String comment);

    List<Comment> findByCommentContainsIgnoreCaseAndLikeCountGreaterThan(String comment, int likeCount);

    List<Comment> findByCommentContainsIgnoreCaseOrderByLikeCountDesc(String comment);

//    Page<Comment> findByCommentContainsIgnoreCase(String comment, Pageable pageable);

//    Stream<Comment> findByCommentContainsIgnoreCase(String comment, Pageable pageable);

    @Async
    Future<Comment> findByCommentContainsIgnoreCase(String comment, Pageable pageable);

}
@RunWith(SpringRunner.class)
@DataJpaTest
class CommentRepositoryTest {

    @Autowired
    CommentRepository repository;

    @Test
    public void crud() {
        this.createComment("spring jpa1", 100);
        this.createComment("spring jpa2", 44);

        List<Comment> comments = repository.findByCommentContainsIgnoreCaseOrderByLikeCountDesc("Spring");
        assertThat(comments.size()).isEqualTo(2);
        assertThat(comments).first().hasFieldOrPropertyWithValue("likeCount", 100);
    }

    private void createComment(String comm, int likeCount) {
        Comment comment = new Comment();
        comment.setComment(comm);
        comment.setLikeCount(likeCount);
        repository.save(comment);
    }

}

 

 

 

인프런 백기선님 '스프링 데이터 JPA’ 강의를 듣고 정리한 내용입니다.
728x90