검색 시 나라 이름으로 검색하면 결과 미출력
게시글 작성 시 나라를 선택하면 title이 [나라] title 이렇게 등록이 됨
ex) 영국 검색 시 [영국]title, [프랑스] 영국에서 만나요, 영국에 대한 내용이 들어간 게시글 이렇게 검색 되어야하는데 [영국]title이 검색 X
public List<PostResponseDto> searchPost(String keyword, Long category, int pageNum) {
Pageable pageable = PageRequest.of(pageNum, 20);
BooleanExpression titleOrContentsContain = post.title.containsIgnoreCase(keyword)
.or(post.contents.containsIgnoreCase(keyword));
JPAQuery<Post> query = queryFactory.selectFrom(post)
.where(titleOrContentsContain);
List<PostResponseDto> postList = query
.orderBy(post.createdAt.desc()) // 최신 게시글 순으로 정렬
.offset(pageable.getOffset()) // 현재 페이지의 시작 위치를 반환(가져올 데이터의 시작 위치)
.limit(pageable.getPageSize()) // 쿼리로 가져올 최대 항목 수
.fetch()
.stream()
.map(PostResponseDto::new)
.collect(Collectors.toList());
return postList;
}
BooleanExpression titleContainsCountry = post.title.containsIgnoreCase("[" + keyword + "]")
.or(post.country.containsIgnoreCase(keyword));
JPAQuery<Post> query = queryFactory.selectFrom(post)
.where(titleOrContentsContain.or(titleContainsCountry));
포스트맨으로 테스트 시 빈 배열로 출력
데이터 베이스에 게시글 존재 확인, 쿼리 잘 날아가는 것도 확인
오류 확인을 위해 로그 출력
@GetMapping("/search/{pageNum}")
public ResponseEntity<List<PostResponseDto>> searchPost(@RequestParam String keyword,
@PathVariable int pageNum) {
log.info("keyword = {} ", keyword);
List<PostResponseDto> response = postService.searchPost(keyword,pageNum - 1);
return new ResponseEntity<>(response, HttpStatus.OK);
}
public List<PostResponseDto> searchPost(String keyword, int pageNum) {
Pageable pageable = PageRequest.of(pageNum, 20);
BooleanExpression titleOrContentsContain = post.title.containsIgnoreCase(keyword)
.or(post.contents.containsIgnoreCase(keyword));
BooleanExpression titleContainsCountry = post.title.containsIgnoreCase("[" + keyword + "]")
.or(post.country.containsIgnoreCase(keyword));
JPAQuery<Post> query = queryFactory.selectFrom(post)
.where(titleOrContentsContain.or(titleContainsCountry));
List<PostResponseDto> postList = query
.orderBy(post.createdAt.desc()) // 최신 게시글 순으로 정렬
.offset(pageable.getOffset()) // 현재 페이지의 시작 위치를 반환(가져올 데이터의 시작 위치)
.limit(pageable.getPageSize()) // 쿼리로 가져올 최대 항목 수
.fetch()
.stream()
.map(PostResponseDto::new)
.toList();
System.out.println("postList = " + postList);
return postList;
}
public List<PostResponseDto> searchPost(String keyword, int pageNum) {
Pageable pageable = PageRequest.of(pageNum, 20);
BooleanExpression titleOrContentsContain = post.title.containsIgnoreCase(keyword)
.or(post.contents.containsIgnoreCase(keyword));
BooleanExpression titleContainsCountry = post.title.containsIgnoreCase("[" + keyword + "]")
.or(post.country.containsIgnoreCase(keyword));
JPAQuery<Post> query = queryFactory.selectFrom(post)
.where(titleOrContentsContain.or(titleContainsCountry));
for (Post post : query.fetch())
{
System.out.println("post Title = " + post.getTitle());
}
List<PostResponseDto> postList = query
.orderBy(post.createdAt.desc()) // 최신 게시글 순으로 정렬
.offset(pageable.getOffset()) // 현재 페이지의 시작 위치를 반환(가져올 데이터의 시작 위치)
.limit(pageable.getPageSize()) // 쿼리로 가져올 최대 항목 수
.fetch()
.stream()
.map(PostResponseDto::new)
.toList();
System.out.println("postList = " + postList);
return postList;
}
영국이 아닌 게시글도 post Title로 출력되는 것을 확인
키워드 변경 시 controller의 log에서 keyword가 빈 값으로 출력되는 것을 확인
다시 시도하면 keyword 값이 제대로 들어간 것을 확인
ex) 이집트 검색 시 처음 시도 keyword = {}, 두 번째 시도 시 keyword = 이집트
public ResponseEntity<List<PostResponseDto>> searchPost(@RequestParam("keyword") String keyword,
@PathVariable int pageNum)
@RequestParam 사용 시 key 값을 지정해 주는 것이 좋다는 것을 깨닫게 되었다.
로그 찍는 위치도 중요하다는 것을 알게 되었다.
오류 발생 시 하나하나 차근차근 되짚어가면서 해결하자
좋은 글 감사합니다. 자주 방문할게요 :)