-
[Spring JPA] 검색 쿼리 개발백엔드/Spring 2021. 1. 2. 03:43
🚀 들어가며...
- 검색의 경우 총 네가지를 구상했습니다.
- 단순 키워드 검색 (좋아요 내림차순)
- 단순 키워드 검색 (좋아요 오름차순)
- 페이지 반환, 키워드 검색 (좋아요 내림차순)
- 페이지 반환, 키워드 검색 (좋아요 오름차순)
- 좋아요 컬럼의 변수 이름은 likeCount로 하였습니다
- like는 데이터베이스 예약어이기 때문에 안됩니다.
- 테스트 케이스는 assertThat()을 사용하여 진행하였습니다.
💌 소스코드
- 도메인 클래스 (Comment)
package org.rojae.examples; import org.springframework.lang.NonNull; import javax.persistence.*; @Entity public class Comment { @Id @GeneratedValue private Long id; @Column private String comment; @ManyToOne(fetch = FetchType.EAGER) private Post post; @NonNull private Integer likeCount = 0; @NonNull public Integer getLikeCount() { return likeCount; } public void setLikeCount(@NonNull Integer likeCount) { this.likeCount = likeCount; } public Long getId() { return id; } public String getComment() { return comment; } public Post getPost() { return post; } public void setComment(String comment) { this.comment = comment; } public void setPost(Post post) { this.post = post; } }
- 레파지토리 (JPQL)
package org.rojae.examples; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import java.util.List; public interface CommentRepository extends MyRepository<Comment, Long>{ // keyword의 문자를 대문자로 바꾸어 준다 List<Comment> findByCommentContainsIgnoreCaseOrderByLikeCountDesc(String keyword); List<Comment> findByCommentContainsIgnoreCaseOrderByLikeCountAsc(String keyword); // Page Page<Comment> findByCommentContainsIgnoreCase(String keyword, Pageable pageable); }
- 테스트 코드 작성
package org.rojae.examples; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.test.annotation.Rollback; import org.springframework.test.context.junit4.SpringRunner; import java.util.List; import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; @RunWith(SpringRunner.class) @DataJpaTest public class CommentRepositoryTest { @Autowired CommentRepository commentRepository; @Test public void run(){ // GIVEN this.createComment(100, "SPRING 100 LIKE COUNT"); this.createComment(50, "SPRING 50 LIKE COUNT"); this.createComment(10, "SPRING 10 LIKE COUNT"); // WHEN (단순 키워드 내림차순 검색) List<Comment> comments = commentRepository.findByCommentContainsIgnoreCaseOrderByLikeCountDesc("spring"); // TEST (리스트의 반환 첫번째의 좋아요는 100) assertThat(comments.size()).isEqualTo(3); assertThat(comments).first().hasFieldOrPropertyWithValue("likeCount" , 100); // When (단순 키워드 오름차순 검색) comments = commentRepository.findByCommentContainsIgnoreCaseOrderByLikeCountAsc("spring"); // Test (리스트의 반환 첫번째의 좋아요는 10) assertThat(comments.size()).isEqualTo(3); assertThat(comments).first().hasFieldOrPropertyWithValue("likeCount" , 10); // When (페이지 반환 키워드 검색) PageRequest pageRequest = PageRequest.of(0, 10, Sort.by(Sort.Direction.DESC, "LikeCount")); Page<Comment> pageComment = commentRepository.findByCommentContainsIgnoreCase("spring", pageRequest); // Test (내림차순의 경우 첫번째 좋아요는 100이다) assertThat(pageComment.getNumberOfElements()).isEqualTo(3); assertThat(pageComment).first().hasFieldOrPropertyWithValue("likeCount", 100); // When (페이지 반환 키워드 검색) pageRequest = PageRequest.of(0, 10, Sort.by(Sort.Direction.ASC, "LikeCount")); pageComment = commentRepository.findByCommentContainsIgnoreCase("spring", pageRequest); // Test (오름차순의 경우 첫번째 좋아요는 10이다) assertThat(pageComment.getNumberOfElements()).isEqualTo(3); assertThat(pageComment).first().hasFieldOrPropertyWithValue("likeCount", 10); } private void createComment(int likeCount, String txt){ Comment comment = new Comment(); comment.setComment(txt); comment.setLikeCount(likeCount); commentRepository.save(comment); } }
🙋🏻♂️ 후기
CommentRepository ~> findByCommentContainsIgnoreCase(String keyword, Pageable pageable) 의 경우
Pageable을 통해서 오름차순 혹은 내림차순의
JPQL을 생성할 수 있다는 점이 특별하게 와닿았다.
인자로 주어진 PageRequest의 Sort에 의해서 쿼리가 생성되는 점이
신선했다~
반응형'백엔드 > Spring' 카테고리의 다른 글
[Spring Security} Spring 3.x에서 mockMvc 테스트 하는 법 (0) 2021.01.15 [Spring JPA] 객체의 상태에 대해서 알아보자 (Transient, Persistent, Detached) (0) 2021.01.12 [Spring JPA] 검색 쿼리 - 대소문자 무시하기 (0) 2021.01.02 [Spring JPA] Hibernate 파라미터 출력 설정 (로그 출력) (2) 2020.12.29 - 검색의 경우 총 네가지를 구상했습니다.