💻구현
PostService
/**
* 제목과 태그에 keyword가 포함되는 프로젝트 검색
*/
public ResponseDto<List<PostResponseDto>> searchPost(Pageable pageable, String keyword, Member member) {
Page<Post> allPosts = postRepository.findByIsFinishTrueAndTitleContainingOrTagsTagNameContaining(pageable, keyword, keyword);
List<PostResponseDto> postList = getAllPostsByUserDetails(member, allPosts);
return ResponseDto.setSuccess(postList);
}
/**
* 프로젝트 전체 조회
*/
public ResponseDto<List<PostResponseDto>> findAllPosts(Pageable pageable, Category category, Member member) {
Page<Post> allPosts = null;
if (category == Category.All) {
allPosts = postRepository.findAllByIsFinishTrue(pageable);
} else {
allPosts = postRepository.findAllByCategoryAndIsFinishTrue(pageable, category);
}
List<PostResponseDto> postList = getAllPostsByUserDetails(member, allPosts);
return ResponseDto.setSuccess(postList);
}
PostRepository
public interface PostRepository extends JpaRepository<Post, Long> {
Page<Post> findByIsFinishTrueAndTitleContainingOrTagsTagNameContaining(Pageable pageable, String keyword, String tagKeyword);
Page<Post> findAllByIsFinishTrue(Pageable pageable);
Page<Post> findAllByCategoryAndIsFinishTrue(Pageable pageable, Category category);
}
게시글(프로젝트)에는 사용자가 게시글 등록 시 입력한 태그가 있다.
searchPost 메서드
사용자가 검색창에 입력한 keyword가 제목 또는 태그에 포함되는 게시글을 검색하여 전달한다.
PostRepository의 findByIsFinishTrueAndTitleContainingOrTagsTagNameContatining() 살펴보면 다음과 같다.
1) IsFinishTrue → 게시글(프로젝트) 작성이 완료된 게시글을 찾는다.
게시글을 생성하고, 모든 내용을 입력하여 저장하기 전까지는 임시 저장 상태이므로, 게시글 전체 조회시 출력되면 안된다.
2) TitleContaining → keyword가 게시글 제목에 포함하는 게시글을 찾는다.
3) TagsTagNameContaining → Post 엔티티에는 Post와 Tag의 중간 테이블인 PostTag 타입의 리스트 Tags가 존재한다. 이 PostTag에는 Tag타입의 tag 속성이 있고, Tag 엔티티에는 태그 이름인 name 속성이 있다. 따라서 이 부분은 Post의 태그들 중 태그 이름에 keyword가 포함하는 게시글을 찾는다.
findAllPosts메서드
사용자가 선택한 카테고리에 따라 게시글을 검색하여 전달한다.
Category가 All이 아닌 경우, findAllByCategoryAndIsFinishTrue메서드를 통해 사용자가 선택한 카테고리와 일치하고 게시글 작성이 완료된 게시글들만 찾아 전달한다.
🤦♀️의문점
findByIsFinishTrueAndTitleContainingOrTagsTagNameContatining() 메서드 이름이 매우 길고 복잡하기 때문에 한 눈에 알아보기 어려운 것 같긴하다. @Query 애노테이션을 통해 JPQL을 작성했다면 더 가독성이 좋아졌을 것 같다.
'TIL' 카테고리의 다른 글
[TIL - 20230522] EC2 도커 이미지 한 번에 배포.. OBS 연결 실패 (0) | 2023.05.23 |
---|---|
[TIL - 20230522] 로컬에서 OBS 실시간 스트리밍 (0) | 2023.05.23 |
[TIL - 20230515] @ReqeustParam enum 타입 받기 (0) | 2023.05.15 |
[TIL - 20230513] 게시글 수정(썸네일 변경 포함)을 위한 MutipartFile과 Dto 함께 받기 (0) | 2023.05.14 |
[TIL - 20230510] Service 유효성 검사 메서드 분리 (0) | 2023.05.11 |