[SpringBoot] 게시판 검색 기능 구현하기[5]

Euiyeon Park·2025년 2월 9일
post-thumbnail

✨ 구현을 통한 학습 목표

  1. ✅ createdAt 컬럼 사용하기
  2. ✅ 정렬 기능
  3. ✅ 검색 기능
  4. 최대로 조회 가능한 데이터 개수 제한

✨ 기능1. 검색 키워드가 포함된 게시글

📂 controler.java

// 게시글 전체 조회 - 검색키워드가 포함된 게시글 조회
// board/post/search?keyword="의연 최고"
@GetMapping("/posts/search")
	public PagedModel<PostResponse> getPostByKeyword(@RequestParam String keyword,
    												 @RequestParam(name = "page", defaultValue = "1") int page,
													 @RequestParam(name = "size", defaultValue = "15") int size){
        if(size > 100){ size = 100; }
        Pageable pageable = PageRequest.of(page-1, size, Sort.by("createdAt").descending());
        return postService.getPostByKeyword(keyword, pageable);
    }

📂 service.java

// 게시글 전체 조회 - 검색 키워드로 게시글 조회
public PagedModel<PostResponse> getPostByKeyword(String keyword, Pageable pageable){
	Page<PostResponse> postResponses = postRepository.findByKeyword(keyword, pageable)
    		.map(PostResponse::new);
   	return new PagedModel<>(postResponses);
 }

📂 repository.java

@Query("SELECT p FROM Post p WHERE p.title LIKE %:keyword% OR p.content LIKE %:keyword%")
Page<Post> findByKeyword(@Param("keyword") String keyword, Pageable pageable);

✨ 기능 2. 검색 키워드가 포함된 제목의 게시글

📂 controler.java

// 게시글 전체 조회 - 검색키워드가 포함된 제목의 게시글 조회
// board/post/search/title?keyword="의연 최고"
@GetMapping("/posts/search/title")
public PagedModel<PostResponse> getPostByTitle(@RequestParam String keyword,
                                               @RequestParam(name = "page", defaultValue = "1") int page,
                                               @RequestParam(name = "size", defaultValue = "15") int size){
   if(size > 100){ size = 100; }
   Pageable pageable = PageRequest.of(page-1, size, Sort.by("createdAt").descending());
   return postService.getPostByTitle(keyword, pageable);
}

📂 service.java

// 게시글 전체 조회 - 제목에 검색 키워드가 포함된 게시글 조회
public PagedModel<PostResponse> getPostByTitle(String keyword, Pageable pageable){
   Page<PostResponse> postResponses = postRepository.findByTitle(keyword, pageable)
           .map(PostResponse::new);
   return new PagedModel<>(postResponses);
}

📂 repository.java

@Query("SELECT p FROM Post p WHERE p.title LIKE %:keyword%")
Page<Post> findByTitle(@Param("keyword") String keyword, Pageable pageable);

✨ 구현 요구사항

  1. ✅ 검색 키워드로 게시글을 검색할 수 있어야 한다.
  2. ✅ 검색 키워드가 포함된 제목을 가진 게시글을 전부 조회한다.
  3. ✅ 최근에 작성된 순으로 게시글이 조회되어야 한다.
  4. ✅ 데이터 조회 개수는 최대 100개까지만 할 수 있어야 한다.

😡 대뜸 코드만 박아둔 이유

❗ 코드가 개띠겁다

이유는 모르겠으나, 그냥 느낌적으로 코드가 일단 진짜 개띠겁다 꿀밤 먹이고 싶음

1. API 개띠꺼움

  • API가 너무 띠껍다.
    • 첫 번째 요구사항 API : board/post/search?keyword="검색키워드"
    • 두 번째 요구사항 API : board/post/search/title?keyword="검색키워드"
    • 여기에 Pageble(page, size, sort)까지 붙으면? 우..우웁.. 우웩🌈

2. 페이지네이션 개띠꺼움

  • 특히 네 번째 요구사항인 데이터 최대 조회 개수 제약을 위해
    이런 코드를 작성한게 그냥 마음에 안듬. 간지 소멸
if(size > 100){ size = 100; }

3. JPQL 개띠거움

  • 레포지토리에서 게시글을 조회해올 때 사용한 JPQL 너무 띠껍다.
  • 뭔가 쿼리메서드로 해결할 수 있는데 JPQL 쓴 기분이랄까 ..
@Query("SELECT p FROM Post p WHERE p.title LIKE %:keyword% OR p.content LIKE %:keyword%")
Page<Post> findByKeyword(@Param("keyword") String keyword, Pageable pageable);

@Query("SELECT p FROM Post p WHERE p.title LIKE %:keyword%")
Page<Post> findByTitle(@Param("keyword") String keyword, Pageable pageable);

❗ 리팩토링 시급하다

진짜 시급하다 뭔가 단단히 잘못된 느낌? 코드가 그냥 🌈졸💖라 구😊려🍀
리팩토링 하면서 검색 기능 관련된 포스트는 새로 작성할 예정 ! ! !

profile
"개발자는 해결사이자 발견자이다✨" - Michael C. Feathers

1개의 댓글

comment-user-thumbnail
2025년 2월 11일

퍼가요~

답글 달기