Chef.Yeon
Code Cook
Chef.Yeon
전체 방문자
오늘
어제
  • 분류 전체보기 (230)
    • 게임 개발 (1)
      • Unity (1)
    • Android (27)
      • Kotlin (19)
      • 우아한테크코스 5기 (4)
    • Language (11)
      • 파이썬 (3)
      • Java (7)
    • DB (2)
      • SQL (16)
    • Spring (25)
    • 코딩테스트 (56)
    • Git (1)
    • TIL (85)
    • DevOps (6)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • SQL
  • 코딩테스트
  • 내림차순
  • 에라토스테네스의 체
  • spring
  • 다이나믹 프로그래밍
  • Docker
  • rsocket
  • 안드로이드
  • 파이썬
  • 문자열
  • elasticsearch
  • Wil
  • ec2
  • kotlin
  • 백준
  • MariaDB
  • til
  • 프로그래머스
  • 프리코스
  • grafana
  • 코틀린 인 액션
  • 코틀린
  • webflux
  • 우아한테크코스
  • Android
  • kibana
  • enum
  • 레포지토리
  • java

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Chef.Yeon

Code Cook

[TIL - 20230515] 게시글 제목과 태그에 검색어를 포함하는 게시글 조회
TIL

[TIL - 20230515] 게시글 제목과 태그에 검색어를 포함하는 게시글 조회

2023. 5. 16. 03:13

 

💻구현

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을 작성했다면 더 가독성이 좋아졌을 것 같다.

728x90

'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
    'TIL' 카테고리의 다른 글
    • [TIL - 20230522] EC2 도커 이미지 한 번에 배포.. OBS 연결 실패
    • [TIL - 20230522] 로컬에서 OBS 실시간 스트리밍
    • [TIL - 20230515] @ReqeustParam enum 타입 받기
    • [TIL - 20230513] 게시글 수정(썸네일 변경 포함)을 위한 MutipartFile과 Dto 함께 받기
    Chef.Yeon
    Chef.Yeon
    보기 좋고 깔끔한 코드를 요리하기 위해 노력하고 있습니다.

    티스토리툴바