Spring Boot
230220 Spring Boot 카테고리 처리-2
주영재
2023. 2. 20. 19:42
목록에 카테고리를 붙이는 건 N:1
MySQL
select * from product
where prod_writer = 'admin'
and prod_name like '%샘숭%' ## +조건 +조건
order by prod_price asc, prod_id desc
limit 0,10;
SELECT
#A1.*,
#A2.CATEGORY_DETAIL_NM,
#A3.CATEGORY_DETAIL_NM,
#CONCAT(A1.group_ID, A1.CATEGORY_ID, A1.category_LV, A1.category_detail_LV) AS CATEGORY_KEY, ##카테고리 키
CONCAT(A1.group_ID, A1.CATEGORY_ID) AS CATEGORY_KEY, ##카테고리 키 (그룹 + 키 형태로 카테고리분류)
CASE A1.category_parent_LV
WHEN 0 THEN A1.category_detail_NM
WHEN 1 THEN CONCAT(A2.category_detail_NM,' > ', A1.category_detail_NM)
WHEN 2 THEN CONCAT(A3.category_detail_NM, ' > ', A2.category_detail_NM,' > ', A1.category_detail_NM)
END as CATEGORY_NAV
FROM PRODUCT_CATEGORY A1
LEFT OUTER JOIN PRODUCT_CATEGORY A2
ON A1.CATEGORY_PARENT_LV = A2.CATEGORY_LV AND A1.CATEGORY_DETAIL_PARENT_LV = A2.CATEGORY_DETAIL_LV AND A1.GROUP_ID = A2.GROUP_ID
LEFT OUTER JOIN PRODUCT_CATEGORY A3
ON A2.CATEGORY_PARENT_LV = A3.CATEGORY_LV AND A2.CATEGORY_DETAIL_PARENT_LV = A3.CATEGORY_DETAIL_LV
ORDER BY CATEGORY_NAV ASC;
## 조인
select p.*, k.category_nav
from (
select * from product
where prod_writer = 'admin'
and prod_name like '%샘숭%'
) p
left join (
SELECT
CONCAT(A1.group_ID, A1.CATEGORY_ID) AS CATEGORY_KEY, ##카테고리 키 (그룹 + 키 형태로 카테고리분류)
CASE A1.category_parent_LV
WHEN 0 THEN A1.category_detail_NM
WHEN 1 THEN CONCAT(A2.category_detail_NM,' > ', A1.category_detail_NM)
WHEN 2 THEN CONCAT(A3.category_detail_NM, ' > ', A2.category_detail_NM,' > ', A1.category_detail_NM)
END as CATEGORY_NAV
FROM PRODUCT_CATEGORY A1
LEFT OUTER JOIN PRODUCT_CATEGORY A2
ON A1.CATEGORY_PARENT_LV = A2.CATEGORY_LV AND A1.CATEGORY_DETAIL_PARENT_LV = A2.CATEGORY_DETAIL_LV AND A1.GROUP_ID = A2.GROUP_ID
LEFT OUTER JOIN PRODUCT_CATEGORY A3
ON A2.CATEGORY_PARENT_LV = A3.CATEGORY_LV AND A2.CATEGORY_DETAIL_PARENT_LV = A3.CATEGORY_DETAIL_LV
ORDER BY CATEGORY_NAV ASC
) k
on p.prod_category=k.category_key
order by prod_price asc, prod_id desc
limit 0,10;
ProductVO
package com.codehistory.myweb.command;
import java.time.LocalDateTime;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ProductVO {
private int prod_id;
private LocalDateTime prod_regdate;
@NotBlank(message="판매종료일은 공백일 수 없습니다.")
@Pattern(regexp = "[0-9]{4}-[0-9]{2}-[0-9]{2}")
private String prod_enddate;
private String prod_category;//카테고리
private String category_nav;//카테고리 조인된 결과
@NotBlank(message = "작성자는 공백일 수 없습니다.")
private String prod_writer;
private String prod_name;
@Min(value = 0, message="가격은 0원 이상이어야 합니다.")
private int prod_price;
private int prod_count;
private int prod_discount;
private String prod_purchase_yn;
private String prod_content;
private String prod_comment;
}
prod_category, category_nav 변수 추가.
AjaxController, ProductService, ProductServiceImpl, ProductMapper.java는 변동 없음.
ProductVO에 추가적으로 변수를 담는다.
ProductMapper.xml에서
<select id="getList" resultType="ProductVO">
select p.*, k.category_nav
from (
select * from product
where prod_writer = #{user_id}
<if test="cri.startDate!=null and cri.startDate != ''">
<![CDATA[and date_format(prod_enddate, '%Y-%m-%d') >= date_format(#{cri.startDate}, '%Y-%m-%d')]]>
</if>
<if test="cri.endDate != null and cri.endDate != ''">
<![CDATA[and date_format(prod_enddate, '%Y-%m-%d') <= date_format(#{cri.endDate}, '%Y-%m-%d')]]>
</if>
<if test="cri.searchName != null and cri.searchName != ''">
and prod_name like concat('%', #{cri.searchName}, '%')
</if>
<if test="cri.searchContent != null and cri.searchContent != ''">
and prod_name like concat('%', #{cri.searchContent}, '%')
</if>
order by
<if test="cri.searchPrice == 'asc'">
prod_price asc,
</if>
<if test="cri.searchPrice == 'desc'">
prod_price desc,
</if>
prod_id desc
limit #{cri.pageStart}, #{cri.amount}
) p
left outer join (
SELECT CONCAT(A1.group_ID, A1.CATEGORY_ID) AS CATEGORY_KEY,
CASE A1.category_parent_LV
WHEN 0 THEN A1.category_detail_NM
WHEN 1 THEN CONCAT(A2.category_detail_NM,' > ', A1.category_detail_NM)
WHEN 2 THEN CONCAT(A3.category_detail_NM, ' > ', A2.category_detail_NM,' > ', A1.category_detail_NM)
END as CATEGORY_NAV
FROM PRODUCT_CATEGORY A1
LEFT OUTER JOIN
PRODUCT_CATEGORY A2
ON A1.CATEGORY_PARENT_LV = A2.CATEGORY_LV AND
A1.CATEGORY_DETAIL_PARENT_LV = A2.CATEGORY_DETAIL_LV AND A1.GROUP_ID =
A2.GROUP_ID
LEFT OUTER JOIN PRODUCT_CATEGORY A3
ON A2.CATEGORY_PARENT_LV
= A3.CATEGORY_LV AND A2.CATEGORY_DETAIL_PARENT_LV =
A3.CATEGORY_DETAIL_LV
ORDER BY CATEGORY_NAV ASC
) k
on p.prod_category=k.category_key
order by prod_price asc, prod_id desc
limit 0,10
</select>
ProductList.html에서
<table cellpadding="0" cellspacing="0" class="col_14" width="100%;">
<tr>
<th>순서</th>
<th>표시</th>
<th>상품번호</th>
<th>카테고리</th>
<th>제목(상품명)</th>
<th>등록일</th>
<th>판매가</th>
<th>재고상태</th>
<th>할인율</th>
<th>상품 구매제한</th>
<th>판매마감일</th>
<th>등록자</th>
</tr>
<tr th:each="vo, status : ${list}">
<td>[[${status.count}]]</td>
<td>
<a href="#" class="normal_btn">정보수정</a>
<a href="#" class="normal_btn modalOn">이미지수정</a>
</td>
<td>[[${vo.prod_id}]]</td>
<td>[[${vo.category_nav==null?'없음':vo.category_nav}]]</td>
<td>
<a title="상세보기(클릭)" th:href="@{ productDetail(prod_id = ${vo.prod_id}) }">
[[${vo.prod_name}]]
</a>
</td>
<td>[[${ #temporals.format(vo.prod_regdate, 'yyyy-MM-dd') }]]</td>
<td>[[${vo.prod_price}]]원</td>
<td>[[${vo.prod_count}]]개</td>
<td>[[${vo.prod_discount}]]%</td>
<td>[[${vo.prod_purchase_yn == 'Y' ? '제한없음' : '1회제한'}]]</td>
<td>[[${vo.prod_enddate}]]</td>
<td>[[${vo.prod_writer}]]</td>
</tr>
</table>
<td>[[${vo.category_nav==null?'없음':vo.category_nav}]]</td>
로 join을 통해 뽑아온 내용 추가.
이 목록에 N:1로 한개가 들어간 것.
MySql은 테이블 엘리어스를 반드시 줘야 한다.