전략 패턴을 사용한 코드 구현이 처음이라 아주 재미있는 작업이었다
검색창의 value와 option filer의 value 값을 서버로 전송하여 페이징 처리된 카페 리스트를 반환 받음
html
<div class="filter">
<span style="font-size: medium">정렬</span> :
<select id="sorting" onchange="getCafeList()">
<option value="createdDateDesc">-선택-</option>
<option value="priceDesc">높은 가격순</option>
<option value="priceAsc">낮은 가격순</option>
</select>
</div>
js
function getCafeList() {
let dataSource = null;
let searchVal = $("#searchBox input").val();
let searchStrategy = $("#sorting option:selected").val();
dataSource = `/api/cafes?searchVal=${searchVal}&searchStrategy=${searchStrategy}`;
$('#cafeListContainer').empty();
$('#pagination').pagination({
dataSource,
locator: 'content',
alias: {
pageNumber: 'page',
pageSize: 'size'
},
totalNumberLocator: (response) => {
return response.totalElements;
},
pageSize: 3,
showPrevious: true,
showNext: true,
ajax: {
beforeSend: function () {
$('#cafeListContainer').html('불러오는 중...');
}
},
callback: function (data, pagination) {
$('#cafeListContainer').empty();
for (let cafe of data) {
let tempHtml = makeHtml(cafe);
$('#cafeListContainer').append(tempHtml);
}
}
});
}
controller
@GetMapping("/api/cafes")
public Page<CafeListResponseDto> ReadAllCafeList(
@RequestParam("page") int page,
@RequestParam("size") int size,
@RequestParam("searchVal") String searchVal,
@RequestParam("searchStrategy") String searchStrategy
){
System.out.println(searchVal);
System.out.println(searchStrategy);
page = page - 1;
return cafeService.findAllCafeList(page, size, searchVal, searchStrategy);
}
service
data jpa : like문 사용시 Containing 사용
private final Map<String, SortStrategy> sortStrategyMap;
public Page<CafeListResponseDto> findAllCafeList(int page, int size, String searchVal, String searchStrategy) {
SortStrategy sortStrategy = sortStrategyMap.get(searchStrategy);
Sort sort = sortStrategy.sort();
Pageable pageable = PageRequest.of(page, size, sort);
Page<Cafe> all;
if (searchVal.equals("")){
all = cafeRepository.findAll(pageable);
}else {
all = cafeRepository.findAllByCafeNameContaining(searchVal, pageable);
// like 대신 Containing
}
// return all.map(cafe -> new CafeListResponseDto(cafe));
// 위의 주석단 람다식을 아래의 식으로 치환
return all.map(CafeListResponseDto::new);
}
전략 패턴 사용 - service
SortStrategy의 의존성 주입을 프론트에서 받아온 'searchStrategy' 값에 따라 다른 class를 주입해주는 정략 사용
-> Class명과 String searchStrategy를 일치시켜 주입받음
선언
private final Map<String, SortStrategy> sortStrategyMap;
주입
SortStrategy sortStrategy = sortStrategyMap.get(searchStrategy)
폴더구조
'프로그래밍 > JPA Project - sparta' 카테고리의 다른 글
이미지 슬라이드 구현 문제 해결 (0) | 2022.07.13 |
---|---|
enum 활용 - key, value 사용하여 리팩토링 (0) | 2022.07.13 |
카페 이벤트 내역 달력에 표시 (pullcalender - 달력 api) (0) | 2022.07.11 |
카페 삭제 (0) | 2022.07.11 |
카페 수정 (기본 정보) (0) | 2022.07.11 |