메인 프로젝트 (7)메인페이지 - 태그 검색

InSeok·2022년 12월 10일
0

프로젝트

목록 보기
7/13

태그 검색

=

  • 유저들이 관심있는 내용의 게시물들을 빠르게 찾을 수 있게 태그 기반 검색 기능을 구현 하였습니다.
  • 응답은 기존 게시물 조회와 동일하게 Slice 형태로 반환합니다.
  • 메인 페이지 상단의 검색창에 태그들을 넣어 검색하면 #~~ 형식의 tag 검색어들을 parsing 해서 tagNames List에 추가합니다.
// 태그 검색어 # 기준으로 파싱
public List<String> queryParsing(String tag) {

log.info("queryParsing tag ={}", tag);

    //검색어에서 '#~~' 형식의 pattern 하나씩분리
    Pattern p = Pattern.compile("\\#([ㄱ-ㅎ가-힣a-zA-Z\\d]+)");

    Matcher m = p.matcher(tag); //문자열 설정

    List<String> tagNames = new ArrayList<>();

    // 패턴에 해당하는 그룹에서 tagName 추출
    while (m.find()) {
        tagNames.add(m.group().substring(1));
    }
		//tagNames List에 추가하여 반환
    return tagNames;
}

1. 파싱한 태그 검색어와 내용이 일치한 태그의Id목록을 DB Tag 테이블에서 가져온다.

// Service
List<Long> tagIds = queryTagRepository.findTagsByContent(tagNames);
if (tagIds.isEmpty()) {
    throw new PostNotFound(); //태그 내용과 일치하는 게시물이 없을경우 예외 던짐
}

//Repository
public List<Long> findTagsByContent(List<String> tagNames) {
        return jpaQueryFactory.select(tag.id)
                .from(tag)
                .where(tag.content.in(tagNames))
                .fetch();
    }

2. Tag와 Post의 다대다 연관관계를 연결하는 PostTag 테이블로부터 조회한 태그Id목록에 해당하는post의id가져오기 태그목록중 한개만 포함해도 가져온다.

// Service
List<Long> postIds = queryTagRepository.findPostByTag(lastPostId, tagIds, pageable);

//Repository
public List<Long> findPostByTag( Long lasPostId, List<Long> tagIds, Pageable pageable) {

        //distinct 필요할수도
        return jpaQueryFactory.selectDistinct(post.id)
                .from(postTag)
                .join(post)
                .on(postTag.post.id.eq(post.id))
               .where(
                      inTagIds(tagIds))
								...
}

3. post id에 해당하는 게시물들을 DB에서 가져와 반환한다.

profile
백엔드 개발자

0개의 댓글