ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링 데이터 Common - 1 (스프링 데이터 JPA - 4)
    Programming/Spring Data JPA 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

    댓글

Designed by Tistory.