일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 싱글톤
- 목록
- css
- JAVA11
- Spring boot
- 프로그래머스
- 반복문
- input태그
- 리눅스
- Linux
- 스프링 부트
- 소스트리
- springboot
- programmers
- codingtest
- java
- 시큐리티로그인
- StyleSheet
- 코딩테스트
- html
- 시큐리티 로그인
- security
- gradle
- 시큐리티 로그아웃
- 2차원배열
- javascript
- 로그인
- 시큐리티
- sql
- springSecurity
Archives
- Today
- Total
JAVAIARY
검색 처리 본문
검색처리
- 서버 쪽 처리
- PageRequestDTO에 검색 타입(type)과 키워드(keyword) 추가
- 이하 서비스 계층에서 Querydsl을 이용해서 검색 처리
- 화면 쪽 처리
1. PageRequestDTO 에 검색을 위한 검색조건과 검색 키워드 추가
2. GuestbookServiceImpl에 getSearch() 메서드 추가
private BooleanBuilder getSearch(PageRequestDTO requestDTO) {//querydsl처리
String type = requestDTO.getType();
BooleanBuilder booleanBuilder = new BooleanBuilder();
QGuestbook qGuestbook = QGuestbook.guestbook;
String keyword = requestDTO.getKeyword();
BooleanExpression expression = qGuestbook.gno.gt(0L); // gno > 0
booleanBuilder.and(expression);
if (type == null || type.trim().length() == 0) { // 검색 조건이 없는 경우
return booleanBuilder;
}
// 검색 조건 작성하기
BooleanBuilder conditionBuilder = new BooleanBuilder();
if (type.contains("t")) {
conditionBuilder.or(qGuestbook.title.contains(keyword));
}
if (type.contains("c")) {
conditionBuilder.or(qGuestbook.content.contains(keyword));
}
if (type.contains("w")) {
conditionBuilder.or(qGuestbook.writer.contains(keyword));
}
booleanBuilder.and(conditionBuilder);
return booleanBuilder;
}
- PageRequestDTO를 파라미터로받음
- 검색조건(type)이 있는 경우, conditionBuilder변수를 생성하여 각 검색 조건을 or로 연결 처리
- 검색조건이 없는 경우 gno > 0 조건으로만 생성
3. GuestbookServiceImpl의 getList() 수정
Test 추가하여 확인
@Test
public void testSearch(){
PageRequestDTO pageRequestDTO = PageRequestDTO.builder()
.page(1)
.size(10)
.type("tc") // 검색조건
.keyword("한글") // 검색 키워드
.build();
PageResultDTO<GuestbookDTO, Guestbook> resultDTO = service.getList(pageRequestDTO);
System.out.println("PREV : " + resultDTO.isPrev());
System.out.println("NEXT : " + resultDTO.isNext());
System.out.println("TOTAL : " + resultDTO.getTotalPage());
System.out.println("--------------------------------------");
for (GuestbookDTO guestbookDTO : resultDTO.getDtoList()){
System.out.println(guestbookDTO);
}
System.out.println("=========================================");
resultDTO.getPageList().forEach(i -> System.out.println(i));
}
- tc = title과 content에서 "한글"이 포함된 글만 검색
4. list.html 수정
4-1. 검색창 추가
<form action = "/guestbook/list" method="get" id = "searchForm">
<div class = "input-group">
<input type="hidden" name="page" value = "1">
<div class="input-group-prepend">
<select class="custom-select" name = "type">
<option th:selected = "${pageRequestDTO.type == null}">------</option>
<option value="t" th:selected="${pageRequestDTO.type=='t'">제목</option>
<option value="c" th:selected="${pageRequestDTO.type=='c'">내용</option>
<option value="w" th:selected="${pageRequestDTO.type=='w'">작성자</option>
<option value="tc" th:selected="${pageRequestDTO.type=='tc'">제목+내용</option>
<option value="tcw" th:selected="${pageRequestDTO.type=='t'">제목+내용+작성자</option>
</select>
</div>
<input class="form-control" name="keyword" th:value="${pageRequestDTO.keyword}">
<div class="input-group-append" id="button-addon4">
<button class="btn btn-outline-secondary btn-search" type="button">Search</button>
<button class="btn btn-outline-secondary btn-clear" type="button">Clear</button>
</div>
</div>
</form>
- 게시글 목록 위에 추가
- <select>태그를 이용하여 value값 을 보내줌.
PageRequestDTO를 이용해 검색타입에 맞게 자동으로 선택됨 - 키워드(검색어)는 <input>태그로 처리
- 주소창에 쿼리스트링을 입력하면 해당 키워드와 검색타입이 적용된 상태로 출력되는 것 확인
4-2. 검색버튼 클릭시 이벤트 작성
var searchForm = $("#searchForm");
$('.btn-search').click(function(e){
searchForm.submit();
});
$('.btn-clear').click(function(e){
searchForm.empty().submit();
});
- form을 submit함으로써 변경된 검색 타입, 검색어가 쿼리스트링에 반영
4-3. 페이지 네비게이션 링크에 type과 keyword 추가
, type=${pageRequestDTO.type}, keyword=${pageRequestDTO.keyword}
- 기존 페이지 네비게이션은 page 값만을 처리함
- 네비게이션 클릭시 검색된 결과값 목록 중에서 이동하도록 변경
- thymeleaf 이용시 검색어 쿼리스트링의 공백이나 한글도 인코딩 처리되어 표시됨
- ex) "타임리프" 검색
5. read.html
5-1. 조회 페이지 이동 링크에 type & keyword 추가
<th scope="row" ><a th:href="@{/guestbook/read(gno=${dto.gno}, page=${result.page}, type=${pageRequestDTO.type}, keyword=${pageRequestDTO.keyword)}">[[${dto.gno}]]</a></th>
5-2. 조회 페이지 하단 링크 (수정, 목록) 처리
<a th:href="@{/guestbook/modify(gno=${dto.gno}, page=${requestDTO.page}, type=${pageRequestDTO.type}, keyword=${pageRequestDTO.keyword})}"><button type="button" class="btn btn-primary">Modify</button></a>
<a th:href="@{/guestbook/list(page=${requestDTO.page}, type=${pageRequestDTO.type}, keyword=${pageRequestDTO.keyword})}"><button type="button" class="btn btn-info">List</button></a>
6. modify.html
6-1. 수정 작업 후 이동 처리
- 등록처리 : 1페이지로 이동
- 삭제처리 : 1페이지로 이동
- 수정처리 : 조회 페이지로 이동
- page뿐 아니라 type과 keyword부분도 같이 보관했다가 <form>태그와 같이 전송하도록 수업
7. GuestbookController.java
7-1. 수정한 후에 조회페이지로 리다이렉트 처리될 때 검색조건 유지하도록 추가
'Project > 2023.02~ ) Study toy 프로젝트' 카테고리의 다른 글
N:1(다대일) 연관 관계 2 - JPQL과 LEFT(OUTER) JOIN (0) | 2023.03.05 |
---|---|
N:1(다대일) 연관관계 1 (0) | 2023.03.01 |
Spring Boot) 게시글 수정/ 삭제 처리 (0) | 2023.02.21 |
Spring Boot) 게시글 등록 페이지 / 등록 처리 (0) | 2023.02.20 |
Spring Boot) 목록처리 (0) | 2023.02.20 |