보라코딩
맛집 스타일별 정렬하기 / 별점순 / 인기순 / 거리순 구현하기 본문
맛집 스타일별 정렬하기
list.html
화면 구성은 select와 option 사용!
<div class="form-group">
<form id="myForm" method="get">
<select class="form-control" name="cuisineSelect" onchange="submitForm()">
<option selected disabled>FOOD STYLE</option>
<option value="한식">한식</option>
<option value="중식">중식</option>
<option value="일식">일식</option>
<option value="양식">양식</option>
<option value="퓨전">퓨전</option>
<option value="푸드코트">푸드코트</option>
</select>
</form>
</div>
</div>
버튼이 없고
option 선택하면 바로 controller로 전송되도록!
function submitForm() {
var form = document.getElementById("myForm");
var selectedValue = form.querySelector('select[name="cuisineSelect"]').value;
form.action = "/store/list?cuisineSelect=" + encodeURIComponent(selectedValue);
form.submit();
}
</script>
StoreController
@RequestParam 이용해서 전달해준 cuisineSelect를 받는다.
그런데 메인 페이지의 경우, 음식스타일을 선택하지 않기에
required=false로 해놓으면 파라미터를 필수로 받지 않음을 의미한다.
에러 나지 않게 하기 위해, 그리고 mapper에서 if 쓰기 위해서
값이 없을때는 없음으로 저장되게 한다.
public void get(Model model
,@RequestParam(value="cuisineSelect",required = false) String cuisineSelect){
if(cuisineSelect == null){
cuisineSelect = "없음";
}
log.info("cuisineSelect : " + cuisineSelect);
List<StoreVO> storeVO = service.store_getList(cuisineSelect);
model.addAttribute("storeList", storeVO);
}
Service
//List<StoreVO> storeList = mapper.store_getList();
List<StoreVO> storeList = mapper.store_getList_withStar(cuisineSelect);
return storeList;
}
mapper
mapper.xml
별점과 같이 받는 것 때문에 복잡한데
사실 중요한 부분은
parameterType = "string"과 <-- 이것이 cuisineSelect
if문을 사용하는 것이다!
<select id="store_getList_withStar" resultMap="storeStarResultMap"
parameterType="string">
<!--select * from store-->
SELECT s.store_idx, s.user_idx, s.store_name, s.category1, s.store_address,
s.store_lati, s.store_longi, s.phone_number, s.store_count, s.filename,
avg_star.STORE_STAR
FROM STORE s
LEFT OUTER JOIN (
SELECT store_idx, ROUND(AVG(store_star), 1) AS STORE_STAR
FROM STAR
GROUP BY store_idx
) avg_star ON s.store_idx = avg_star.store_idx
<if test="cuisineSelect != '없음'">
where category1 = #{cuisineSelect}
</if>
ORDER BY s.store_idx
</select>
별점순 / 인기순 / 거리순 구현하기
모두 메인 페이지에서 이루어진다.
list.html
a 태그를 사용해서 파라미터를 전달해주었다.
th:href="@{/store/list(storeStar='별점순')}">별점순</a>
<a class="btn btn-warning"
th:href="@{/store/list(storeCount='인기순')}">인기순</a>
<a class="btn btn-warning"
th:href="@{/store/list(storeDistance='거리순')}">거리순</a>
Controller
받아올 파라미터가 4개가 되어서 Map을 사용했다.
파라미터는 한번에 하나만 받아오게 했고
모두 필수값이 아닐 수도 있기에 required = false 는 항상 적용!
null 인 경우에는 없음이라는 값을 넣어줘서
mapper if문에서 조건으로 활용함
public void get(Model model
,@RequestParam(value="cuisineSelect",required = false) String cuisineSelect
,@RequestParam(value="storeStar",required = false) String storeStar
,@RequestParam(value="storeCount",required = false) String storeCount
,@RequestParam(value="storeDistance",required = false) String storeDistance
){
if(cuisineSelect == null){
cuisineSelect = "없음";
}
if(storeStar == null){
storeStar = "없음";
}
if(storeCount == null){
storeCount = "없음";
}
if(storeDistance == null){
storeDistance = "없음";
}
Map<String,String> orderMap = new HashMap<>();
orderMap.put("cuisineSelect", cuisineSelect);
orderMap.put("storeStar", storeStar);
orderMap.put("storeCount", storeCount);
orderMap.put("storeDistance", storeDistance);
log.info("orderMap : " + orderMap);
List<StoreVO> storeVO = service.store_getList(orderMap);
model.addAttribute("storeList", storeVO);
}
Service
//List<StoreVO> storeList = mapper.store_getList();
List<StoreVO> storeList = mapper.store_getList_withStar(orderMap);
return storeList;
}
Mapper
Mapper.xml
if문을 열심히 넣어줬다.
지금 쓰면서 생각해보니까 case 사용할걸 그랬나 싶기도 하네...
and와 or 사용해서 조건 하나씩만 만족하게 해주었다 ㅎㅎㅎ
여기서 조건 잘못 만족하면
order by가 두번 들어가서 sql문 에러 난다 ^^
parameterType="Map">
<!--select * from store-->
SELECT s.store_idx, s.user_idx, s.store_name, s.category1, s.store_address,
s.store_lati, s.store_longi, s.phone_number, s.store_count, s.filename, s.distance,
avg_star.STORE_STAR
FROM STORE s
LEFT OUTER JOIN (
SELECT store_idx, ROUND(AVG(store_star), 1) AS STORE_STAR
FROM STAR
GROUP BY store_idx
) avg_star ON s.store_idx = avg_star.store_idx
<if test="cuisineSelect != '없음'">
where category1 = #{cuisineSelect}
</if>
<if test="storeStar != '없음' and storeCount == '없음' and storeDistance == '없음'">
ORDER BY avg_star.STORE_STAR desc nulls last
</if>
<if test="storeCount != '없음' and storeStar == '없음' and storeDistance == '없음'">
ORDER BY s.store_count desc nulls last
</if>
<if test="storeDistance != '없음' and storeStar == '없음' and storeCount == '없음'">
ORDER BY distance nulls last
</if>
<if test="storeStar == '없음' and storeCount == '없음' and storeDistance == '없음'">
ORDER BY s.store_idx
</if>
</select>
=> choose로 변경함
https://boracoding.tistory.com/208
Day108_230601_페이징처리... 하...........
와 해결했다... 너무 감동이라 빨간색으로 씀 페이징 처리를 위해 표시가 들어가서 저 코드를 써서 문자화해주었는데 저 코드를 맨위에 맨 아래에 넣으니 까지 문자화되어서 안되었던 것.... 결
boracoding.tistory.com
'코딩 > Spring' 카테고리의 다른 글
별점 평가하는 화면 (부트스트랩 + 보라색 사용ㅎㅎ) (0) | 2023.05.31 |
---|---|
거리순 기능 구현하기 (자바 거리 계산) (0) | 2023.05.31 |
스프링부트 파일(이미지) 수정하기!!! (0) | 2023.05.31 |
모달 사용 (삭제 전에 삭제하시겠습니까?) (0) | 2023.05.31 |
Day107_230531_ 프로젝트 시작한지 2주째.. 시간이 없다! (0) | 2023.05.31 |