프로젝트

30일차

사랑박 2023. 3. 21. 13:03

오늘은 Part 2. 게시판 서비스 강의의 `게시판 검색 구현-해시태그(단일)` 부분을 학습하였다.
 
해시태그를 위한 검색페이지를 따로 만들기로 정하였고 오늘은 해시태그 검색 페이지를 위한 기능을 구현하였다.
해시태그 검색뷰에 모든 게시글에서 나오는 해시태그를 정리해서 보여주는 기능을 넣기 위해, 해시태그만 뽑아서 unique하게 보여주는 쿼리를 querydsl로 작성하였다.
 

ArticleRepositoryCoustom 인터페이스 작성

import java.util.List;

public interface ArticleRepositoryCustom {
    List<String> findAllDistinctHashtags();
}

 

ArticleRepositoryCoustom 구현을 작성 

Impl을 붙여야 querydsl이 인식한다. (관례? 뭐 그런거)
QuerydslRepositorySupport를 상속받아 활용하여 작성하였다.

import com.project.projectboard.Domain.Article;
import com.project.projectboard.Domain.QArticle;
import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport;

import java.util.List;

public class ArticleRepositoryImpl extends QuerydslRepositorySupport implements ArticleRepositoryCustom {

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

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

        return from(article)
                .distinct()
                .select(article.hashtag)
                .where(article.hashtag.isNotNull())
                .fetch();
    }
}

 

ArticleRepository에 ArticleRepositoryCustom을 상속

ArticleRepository에 ArticleRepositoryCustom을 상속 시켜줌으로 메소드를 사용할 수 있게 해준다.

@RepositoryRestResource
public interface ArticleRepository extends
        JpaRepository<Article, Long>,
        ArticleRepositoryCustom,
        QuerydslPredicateExecutor<Article>, // 검색기능
        QuerydslBinderCustomizer<QArticle>
{...}

 

서비스 코드 작성

    @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();
    }

 

컨트롤러 작성

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

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

        return "articles/search-hashtag";
    }

 

'프로젝트' 카테고리의 다른 글

29일차  (0) 2023.03.20
28일차  (0) 2023.03.19
27일차  (0) 2023.03.18
26일차  (0) 2023.03.17
25일차  (0) 2023.03.16