프로젝트

27일차

사랑박 2023. 3. 18. 02:50

오늘은 Part 2. 게시판 서비스 강의의 `게시판 페이지 기능 구현 1`부분을 학습하였다.
 
저번 강의까지는 게시판, 게시글, 로그인 페이지 기능 테스트를 정의하면서 뷰의 기능을 정의하였지만 이번 강의에서부터 진짜 뷰의 기능 구현을 시작하기로 한다.
 
ArticleRepository를 다음과 같이 작성해주었다.

@RepositoryRestResource
public interface ArticleRepository extends
        JpaRepository<Article, Long>,
        QuerydslPredicateExecutor<Article>, // 검색기능
        QuerydslBinderCustomizer<QArticle>
{
    Page<Article> findByTitleContaining(String title, Pageable pageable);
    Page<Article> findByContentContaining(String content, Pageable pageable);
    Page<Article> findByUserAccount_UserIdContaining(String userId, Pageable pageable);
    Page<Article> findByUserAccount_NicknameContaining(String nickname, Pageable pageable);
    Page<Article> findByHashtag(String hashtag, Pageable pageable);
    @Override
    default void customize(QuerydslBindings bindings, QArticle root) {
        bindings.excludeUnlistedProperties(true);
        bindings.including(root.title, root.content, root.hashtag,root.createdAt,root.createdBy);
        bindings.bind(root.title).first(StringExpression::containsIgnoreCase);
        bindings.bind(root.content).first(StringExpression::containsIgnoreCase);
        bindings.bind(root.hashtag).first(StringExpression::containsIgnoreCase);
        bindings.bind(root.createdAt).first(DateTimeExpression::eq);
        bindings.bind(root.createdBy).first(StringExpression::containsIgnoreCase);
    }

}

 
findBy로 시작하면 select 쿼리를 시작한다는 뜻이다.
title, content, userId, nickname, hashtag는 이 컬럼에서 파라미터로 받은 값을 찾겠다는 의미이다.
Containing이 없다면 해당 키워드와 일치하는 결과만 찾고, 이 키워드가 있는 경우는 포함하는 결과를 찾는다. 즉 SQL문의 like와 비슷하다.
findByUserAccount_UserIdContaining과 findByUserAccount_NicknameContaining에서 Article 엔티티는 UserAccount 회원 정보를 가지고 있다. 따라서 UserAccount 내에서 userId와 nickname을 찾아야 한다는 뜻이다.