검색 기능
제목+내용으로 게시글을 검색할 수 있게 구현하였다.
Spring Data Jpa의 기능으로 LIKE 쿼리 메서드를 만들어주는 findByXXXContaining을 알게됐다.
BoardController
@GetMapping("/boardList")
public String boardList(Model model, @PageableDefault(page=0, size=10) Pageable pageable,
@RequestParam(required = false, defaultValue = "")String searchText) {
Page<Board> boards = boardService.findAll(searchText, searchText, pageable);
int nowPage = boards.getPageable().getPageNumber() + 1;
int startPage = Math.max(1, nowPage - 4);
int endPage;
if(boards.getTotalPages()==0) endPage = Math.min(nowPage + 5, boards.getTotalPages()+1);
else endPage = Math.min(nowPage + 5, boards.getTotalPages());
log.info(nowPage + " " + startPage + " " + endPage);
model.addAttribute("boards", boards);
model.addAttribute("nowPage", nowPage);
model.addAttribute("startPage", startPage);
model.addAttribute("endPage", endPage);
return "/board/boardList";
}
- 쿼리 파라미터를 받을 수 있도록 boardList()의 인자 부분을 변경
- @RequestParam(required = false, defaultValue = "")String searchText
- 파라미터 searchText가 없으면 디폴트 값 ""
- boardService.findAll(searchText, searchText, pageable);
- 인수로 searchText를 보낸다. 각각 제목, 내용에 해당된다.
BoardRepository
@Repository
public interface BoardRepository extends JpaRepository<Board, Long> {
Page<Board> findByTitleContainingOrContentContaining(String title, String content, Pageable pageable);
}
- Page<Board> findByTitleContainingOrContentContaining(String title, String content, Pageable pageable);
- 제목에 title로 받은 문자열이 포함되거나 내용에 content로 받은 문자열이 포함되는 데이터를 Page<Board>에 넣어서 반환한다.
- Containing : LIKE 쿼리 메서드를 만들 수 있다.
- 참고문헌
BoardService
@Transactional(readOnly = true)
public Page<Board> findAll(String title, String content, Pageable pageable) {
if(title.equals("")) return boardRepository.findAll(pageable);
else {
return boardRepository.findByTitleContainingOrContentContaining(title, content, pageable);
}
}
- findAll() - 수정
- 인자로 title, content, pageable을 받는다.
- 검색 값이 없으면 게시글 전체를 반환하고, 있으면 해당하는 게시글들을 찾아 반환한다.
BoardList.html
<form class="form-inline d-flex justify-content-end" method="GET", th:action="@{/board/boardList}" th:value="${param.searchText}" >
<div class="form-group mx-sm-3 mb-2 pull-right">
<label for="searchText" class="sr-only">검색</label>
<input type="text" class="form-control" id="searchText" name="searchText">
<button type="submit" class="btn btn-primary mb-2">검색 </button>
</div>
</form>
- searchText를 쿼리 파라미터로 보낸다.
- localhost:8080/board/boardList?searchText=




내가 쓴 글 보기
내가 쓴 글 보기 버튼을 누르면 로그인 사용자가 썼던 글 리스트가 보여지는 기능을 추가해봤다.
BoardController
@GetMapping("/boardList")
public String boardList(Model model, @PageableDefault(page=0, size=10) Pageable pageable,
@SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false) MemberDto memberDto,
@RequestParam(required = false, defaultValue = "")String searchText,
@RequestParam(required = false) String my ) {
Page<Board> boards;
if(my!=null) {
boards = boardService.findByMemberId(memberDto.getId(), pageable);
}else {
boards = boardService.findAll(searchText, searchText, pageable);
}
...
- 세션에서 로그인 사용자의 dto를 받았다.
- my라는 쿼리 스트링을 받을 수있도록 추가하였다.
- my 값이 있으면 내가 쓴 글 리스트가 보여진다.
- boardService.findByMemberId()
- 로그인 사용자의 게시글들을 반환
BoardRepository
@Repository
public interface BoardRepository extends JpaRepository<Board, Long> {
Page<Board> findByTitleContainingOrContentContaining(String title, String content, Pageable pageable);
Page<Board> findByMemberId(Long memberId, Pageable pageable);
}
- findByMemberId()
- memberId와 DB에 저장된 Board를 매핑하여 해당하는 Board들을 Page로 반환
BoardService
public Page<Board> findByMemberId(Long memberId, Pageable pageable) {
return boardRepository.findByMemberId(memberId, pageable);
}
- findByMemberId()
- 로그인 사용자의 게시글들을 반환하는 메서드 추가
BoardList.html
<form class="form-inline d-flex justify-content-end" method="GET", th:action="@{/board/boardList}" th:value="${param.searchText}" >
<div class="form-group mx-sm-3 mb-2 pull-right">
<label for="searchText" class="sr-only">검색</label>
<input type="text" class="form-control" id="searchText" name="searchText">
<button type="submit" class="btn btn-primary mb-2">검색 </button>
<!--추가-->
<a href="/board/boardList?my=true">
<button type="button" class="btn btn-primary mb-2">내가 쓴 글 보기 </button>
</a>
<!--추가-->
</div>
</form>
- "내가 쓴 글 보기" 버튼 클릭시 localhost:8080/board/boardList?my=true 경로 이동


엔티티 기본키 생성 전략 변경
Member, Board, BoardComment를 생성하면 기본키인 id값들이 1씩 증가하지 않고 뒤죽박죽으로 증가하였는데 @GeneratedValue의 속성인 strategy를 바꿔 해결하였다.
Member
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "member_id")
private Long id;
- strategy를 IDENTITY로 변경
Board
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "board_id")
private Long id;
- strategy를 IDENTITY로 변경
BoardComment
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "boardComment_id")
private Long id;
- strategy를 IDENTITY로 변경


'토이 프로젝트 > 게시판 프로젝트' 카테고리의 다른 글
12. 게시판 프로젝트 - 페이징, 조회수 기능 수정 (0) | 2022.08.17 |
---|---|
11. 게시판 프로젝트 - 댓글 작성 (0) | 2022.08.14 |
10. 게시판 프로젝트 - 글 조회, 조회수, 글 수정, welcomePage (0) | 2022.08.12 |
9. 게시판 프로젝트 - 게시판 뼈대, 글 등록 구현 (0) | 2022.08.11 |
8. 게시판 프로젝트 - 로그아웃, 회원 정보 수정 (0) | 2022.08.11 |