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
결과물
728x90
'Project > project-board' 카테고리의 다른 글
[Project] 댓글 기능 컨트롤러와 서비스코드 작성 (0) | 2022.08.03 |
---|---|
[Project] 게시판 검색기능 (0) | 2022.07.15 |
[Project] 게시글 페이징 처리 구현, 정렬 및 테스트 (0) | 2022.07.14 |
[Project] 게시글, 댓글 비즈니스 로직, 페이지 구현 (0) | 2022.07.14 |
[Project] DTO 설계 (0) | 2022.07.14 |
댓글