Project/project-board

[Project] 해시태그 검색 구현

수수한개발자 2022. 7. 20.
728x90

게시글들을 보면 해시태그들을 넣을 수 있게 되어있다.

위의 검색창의 해시태그를 사용하여 검색할 수 있지만, 티스토리 블로그 같은 경우에도 해시태그 검색 페이지가 따로 있다. 이걸 토대로 해시태그를 검색할 수 있는 페이지를 만들어 보겠습니다.

티스토리의 해시태그 검색 페이지

 

ArticleController

@GetMapping("/search-hashtag")
public String searchArticleHashtag(
        @RequestParam(required = false) String searchValue,
        @PageableDefault(size = 10, sort = "createdAt", direction = Sort.Direction.DESC) Pageable pageable,
        ModelMap modelMap) {
    Page<ArticleResponse> articles = articleService.searchArticlesViaHashtag(searchValue, pageable).map(ArticleResponse::from);
    List<Integer> paginationBarNumbers = paginationService.getPaginationBarNumbers(pageable.getPageNumber(), articles.getTotalPages());
    List<String> hashtags = articleService.getHashtags();

    modelMap.addAttribute("articles", articles);
    modelMap.addAttribute("hashtags", hashtags);
    modelMap.addAttribute("paginationBarNumbers", paginationBarNumbers);
    modelMap.addAttribute("searchType", SearchType.HASHTAG);

    return "articles/search-hashtag";
}

 

컨트롤러에 /search-hashtag 라는 url을 만들어 줍니다. 기본적으로 10개의 게시글을 가져오기위해 @PageableDefault를 사용하여 size, sort, 를 설정해줍니다.

 

ArticleRepositoryCustom

public interface ArticleRepositoryCustom {

    List<String> findAllDistinctHashtags();
}

ArticleRepositoryCustomImpl

public class ArticleRepositoryCustomImpl extends QuerydslRepositorySupport 
				  	 implements ArticleRepositoryCustom {

    public ArticleRepositoryCustomImpl() {
        super(Article.class);
    }

    @Override
    public List<String> findAllDistinctHashtags() {
        QArticle article = QArticle.article;

        JPQLQuery<String> query = from(article)
                .distinct()
                .select(article.hashtag)
                .where(article.hashtag.isNotNull());

        return query.fetch();
    }
}

QuerydslRepositorySupport 와 구현해야할 인터페이스 ArticleRepositoryCustom을 상속받아줍니다.

중복제거와 hashtag와 게시글들을 보면 해시태그없이 작성한 글들도 있기 때문에 isNotnull을 통해 notnull인 값들을 가져옵니다.

 

ArticleService

@Transactional(readOnly = true)
public Page<ArticleDto> searchArticlesViaHashtag(String hashtag, Pageable pageable) {
    if (hashtag == null || hashtag.isBlank()) {
        return Page.empty(pageable);
    }
    return articleRepository.findByHashtag(hashtag, pageable).map(ArticleDto::from);
}

public List<String> getHashtags() {
    return articleRepository.findAllDistinctHashtags();
}

getHashtags : 첫 해시태그 검색페이지의 해시태그 목록들을 가져옴.

searchArticleViaHashtag : 해시태그를 눌렀을때 해시태그를 통해 가져온 게시글들을 페이징처리하여 반환.

 

뷰 코드 : https://github.com/jisu3316/project-board/commit/01ea33c2d05709c232967b606533ccc05dffa37f

 

결과물

 

헤더의 hashtags를 눌렀을때의 화면
#turquoise를 눌렀을때의 화면

 

728x90

댓글