코딍코딍
코딩기록
코딍코딍
전체 방문자
오늘
어제
  • 분류 전체보기 (271)
    • 개발 (2)
    • Java (1)
    • 스프링 (28)
    • JPA (11)
    • Git (3)
    • 알고리즘 (160)
      • 백준 (132)
      • 프로그래머스 (8)
      • SWEA (20)
    • 토이 프로젝트 (14)
      • 간단한 Springboot CRUD (1)
      • 게시판 프로젝트 (13)
    • 알고리즘 개념정리 (8)
    • 오류 해결 (13)
    • 보류 (0)
    • AWS (5)
    • 트러블 슈팅 (0)
    • 회고 (3)
    • CS (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

최근 글

티스토리

hELLO · Designed By 정상우.
코딍코딍
토이 프로젝트/게시판 프로젝트

13. 게시판 프로젝트 - 검색 기능, 내가 쓴 글 보기, 기본키 생성 전략

토이 프로젝트/게시판 프로젝트

13. 게시판 프로젝트 - 검색 기능, 내가 쓴 글 보기, 기본키 생성 전략

2022. 8. 17. 16:22

검색 기능

제목+내용으로 게시글을 검색할 수 있게 구현하였다.

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=

 

 

테스트1 검색 - 제목
test2 검색 - 내용
te 검색 - 내용

 

 

내가 쓴 글 보기

내가 쓴 글 보기 버튼을 누르면 로그인 사용자가 썼던 글 리스트가 보여지는 기능을 추가해봤다.

 

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 경로 이동

 

boardList.html - 현재 로그인 사용자 ww
boardList.html - 내가 쓴 글 보기 클릭

 

 

엔티티 기본키 생성 전략 변경

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
  • 검색 기능
  • 내가 쓴 글 보기
  • 엔티티 기본키 생성 전략 변경
'토이 프로젝트/게시판 프로젝트' 카테고리의 다른 글
  • 12. 게시판 프로젝트 - 페이징, 조회수 기능 수정
  • 11. 게시판 프로젝트 - 댓글 작성
  • 10. 게시판 프로젝트 - 글 조회, 조회수, 글 수정, welcomePage
  • 9. 게시판 프로젝트 - 게시판 뼈대, 글 등록 구현
코딍코딍
코딍코딍
ㅎ2

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.