안녕하세요 저번 시간에는 게시물의 카테고리로 검색하는 기능을 추가하였습니다.
이번 시간에는 유저 닉네임, 게시물의 제목으로 검색하는 기능을 만들어 보도록 하겠습니다.
코드는 크게 달라진것은 없으며 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문에 들어갈 쿼리가 달라지게 됩니다.
'스프링 부트' 카테고리의 다른 글
스프링부트 게시판 API 만들기 - 끝 (AWS S3에 이미지 업로드 하기) (0) | 2021.05.05 |
---|---|
스프링부트 게시판 API 만들기 - 13 게시물 좋아요 기능 만들기 (1) | 2021.05.04 |
스프링부트 게시판 API 만들기 - 11 (게시물 검색기능 및 QueryDSL) - 1 (0) | 2021.05.01 |
스프링부트 게시판 API 만들기 - 10 (댓글 기능 만들기 및 쿼리 최적화2) (0) | 2021.04.30 |
스프링부트 게시판 API 만들기 - 9 (유저와 게시물 연관시키기 및 쿼리 최적화) (0) | 2021.04.29 |