안녕하세요 저번 시간에는 게시물의 카테고리로 검색하는 기능을 추가하였습니다.

이번 시간에는 유저 닉네임, 게시물의 제목으로 검색하는 기능을 만들어 보도록 하겠습니다.

코드는 크게 달라진것은 없으며 SearchType이 추가되고, PostRepositoryImpl 만 수정 하면 됩니다.

- SearchType, PostRepositoryImpl

- SearchType

@RequiredArgsConstructor
public enum SearchType {
    TITLE("title", "포스트 제목으로 검색"),
    USER("user", "유저명으로 검색");

    @Getter
    private final String type;

    @Getter
    private final String description;

    public static SearchType convertToType(String stringType) {
        return Arrays.stream(values())
                .filter(searchType -> searchType.type.equals(stringType))
                .findAny()
                .orElse(TITLE);
    }
}

convertToType 메서드는 values()로 SearchType의 enum값을 배열로 가져온뒤 filter로 stringType과 enum의 type이 동일 하면 해당 enum을 리턴하고 일치하는 enum이 없을시 TITLE enum을 리턴하는 메서드 입니다.

 

- PostRepositoryImpl

@RequiredArgsConstructor
public class PostRepositoryImpl implements PostRepositoryCustom {
    private final JPAQueryFactory jpaQueryFactory;

    @Override
    public List<Post> postListQueryDSL(SearchDTO searchDTO) {
        BooleanExpression postCategoryQuery = postCategoryQuery(searchDTO.getCategory());
        BooleanExpression postSearchQuery = postSearchQuery(searchDTO);

        return jpaQueryFactory
                .selectFrom(post)
                .where(postCategoryQuery, postSearchQuery)
                .join(post.user, user).fetchJoin()
                .join(post.category, postCategory).fetchJoin()
                .fetch();
    }

    private BooleanExpression postCategoryQuery(String category) {
        if (StringUtils.hasLength(category)) {
            return post.category.eq(getPostCategory(category));
        }

        return null;
    }

    private BooleanExpression postSearchQuery(SearchDTO searchDTO) {
        SearchType searchType = SearchType.convertToType(searchDTO.getSearchType());

        if (searchType == SearchType.USER) {
            return user.nickname.eq(searchDTO.getQuery());
        }
        return post.title.contains(searchDTO.getQuery());

    }

    private PostCategory getPostCategory(String category) {
        return jpaQueryFactory
                .selectFrom(postCategory)
                .where(postCategory.name.eq(category))
                .fetchOne();
    }
}

기존의 코드에서 postSearchQuery가 추가되었습니다. 이 메서드는 searchType에 따라 유저로 검색하는지, 게시물로 검색하는지에 따라where문에 들어갈 쿼리가 달라지게 됩니다.

+ Recent posts