Spring 게시판 7 - 게시글 검색

춤인형의 개발일지·2025년 1월 1일

Spring실습

목록 보기
8/40

24/12/31(화)

게시판 만들기 추가기능

게시글 검색하기

<나의고민>
❓전체 게시판에서 검색 vs 특정 게시판 내에서 검색

  • 전체 게시판에서 검색
    : (그림을 그려서 생각) 네이버 카페에서 어떤 게시물을 어디서 찾는지 모르니까 전체 게시판을 통해 특정 단어로 찾는다고 생각
    /posts/search를 통해서 찾는다.
  • 특정 게시판 내에서 검색
    : 네이버 카페에서 자유게시판 내에서 어떤 글을 찾고 싶을 때
    /posts에서 boardId와 search로 찾는다.

1. 전체 게시판에서 검색

controller 추가

@GetMapping("/posts/search")
    public List<PostResponse> search(@RequestParam(required = false)String title, String keyword){
        return postService.search(title, keyword);
    }

Request Param으로 2가지를 받는다.
특정으로 내가 받을 값이 정해져 있음 + 이거에 따라 사용자에게 보여지는 값이 다름

service 추가

public List<PostResponse> search(String title, String keyword){
        List<Post> searchResult = postRepository.findByTitleContainingOrContentContaining(title, keyword);
        return searchResult.stream().map(post -> new PostResponse(
                post.getTitle(),
                post.getContent(),
                post.getId(),
                post.getCreatedAt()
        )).toList();
    }

JPA쿼리 메서드로 제목과 내용(본문)에 내가 원하는 keyword가 있는지 찾는 함수를 만들어둔다.

List<Post> findByTitleContainingOrContentContaining(String titleKeyword, String contentKeyword);

이렇게 하면 전체 게시물로 받아진다.


2. 특정 게시판에서 검색
특정 게시판에서 검색하는 기능과 전체 게시판에서검색하는 기능을 합쳐서 구현하자

controller 수정

@GetMapping("/posts")
    public List<PostResponse> getOneBoard(@RequestParam(required = false) Long boardId, String title, String keyword){
        return postService.read(boardId, title, keyword);
    }
  1. 특정 게시판이기 때문에 boardId가 있어야한다.
  2. 제목과 keyword를 받아 검사를 할 수 있으니가 이 값들도 받는다.

service 수정
read함수를 먼저 수정해준다.

public List<PostResponse> read(Long boarId, String title, String keyword){
        if(title == null && keyword == null) {
            return getContentInTitle(boarId);
        }
        if(boarId == null){
            return search(title,keyword);
        }
        else return searchId(boarId, title, keyword);
    }

title과 keyword는 동시에 들어오는 값이기 때문에 둘은 한번에 처리한다.
1. boardId만 들어왔을 땐 특정 게시판의 전체 게시글을 반환해주는 함수로 간다.
2. boardId가 들어오지 않았을 땐, 전체 게시판에서 검색하는 함수로 간다.
3. 3가지가 다 들어왔을 땐, 특정 게시판에서 검색하는 함수로 간다.

private List<PostResponse> searchId(Long boarId, String title, String keyword) {
        List<Post> boardInSearch = postRepository.findByBoardIdAndTitleContainingOrBoardIdAndContentContaining(boarId, title, boarId, keyword);
        return boardInSearch.stream().map(post -> new PostResponse(
                post.getTitle(),
                post.getContent(),
                post.getId(),
                post.getCreatedAt()
        )).toList();
    }

특정 게시글의 제목과 내용에 keyword가 있냐를 찾아주는 JPA함수를 repository에 넣어준다.

List<Post> findByBoardIdAndTitleContainingOrBoardIdAndContentContaining(
            Long boardId,
            String titleKeyword,
            Long sameboardId,
            String contentKeyword);

이렇게 해주면 끝~!


😐 느낀점

JPA로 만들면 한계가 있다는 것을 저기 저 엄청나게 긴 함수로 증명이 되었다.
JPA로 한번에 만드는 건 어렵다. 찾아지는 것이 길어지면, JPA쿼리 메서드도 길어질 뿐만 아니라,
Request Param에 어떤 값이 들어왔냐에 따라 조건들도(If문) 여러개 생기게 된다.

그래도 이제는 구조가 눈에 보이기 시작했다. 아직까지 생각하기까지는 시간이 조금 걸리지만,
계속해서 반복하니까 이제 조금 알 것 같다.
함수 만드는것도 손에 익혀지고있고, JPA쿼리 메서드 만드는 것도 익숙해지고 있다.

0개의 댓글