TIL

김나영·2023년 8월 18일
0

TIL

목록 보기
42/43

2023.08.18

✅ Fact

  • 실전 프로젝트

트러블 슈팅

  • 검색 시 나라 이름으로 검색하면 결과 미출력

  • 게시글 작성 시 나라를 선택하면 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 query 코드에서 아래 코드로 수정
JPAQuery<Post> query = queryFactory.selectFrom(post)
                .where(titleOrContentsContain.or(titleContainsCountry));
  • 포스트맨으로 테스트 시 빈 배열로 출력

    • 데이터 베이스에 게시글 존재 확인, 쿼리 잘 날아가는 것도 확인

    • 오류 확인을 위해 로그 출력

1. Controller 로그 출력 시도

    @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);
    }
  • keyword 영국 출력 확인

2. Service 로그 출력 시도

    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;
    }
  • postList가 빈 배열로 출력되는 것을 확인

3. 로그 찍는 위치 추가

    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 = 이집트

4. Controller에서 keyword key 값을 "keyword"로 지정

public ResponseEntity<List<PostResponseDto>> searchPost(@RequestParam("keyword") String keyword,
                                                        @PathVariable int pageNum)

5. [이집트] title, []이집트, contents = 이집트 게시물을 다 받아오는 것을 확인


  • @RequestParam 사용 시 key 값을 지정해 주는 것이 좋다는 것을 깨닫게 되었다.

    • 어차피 지정해주지 않아도 keyword가 key 값으로 들어가서 괜찮을 줄 알았는데 아니였다.
  • 로그 찍는 위치도 중요하다는 것을 알게 되었다.

    • 계속 postList를 return하기 전에 찍어서 왜 빈 배열이 출력되는 지 알 수 없었다.
  • 오류 발생 시 하나하나 차근차근 되짚어가면서 해결하자

1개의 댓글

comment-user-thumbnail
2023년 8월 18일

좋은 글 감사합니다. 자주 방문할게요 :)

답글 달기