2023. 4. 14. 17:29ใSpring
์๋ณ ํํฉ ํ์ด์ง ์์ฑ
controller ๊ฒฝ๋ก ์ด๋ ์ค์
//์๋ณ ํํฉ ํ์ด์ง
@GetMapping("/saleStatusPerMonth")
public String saleStatusPerMonth(AdminSubMenuVO adminSubMenuVO) {
return "content/admin/sale_status_per_month";
}
sale_status_per_month.html ์์ฑ
admin_layout ์ฐ๊ฒฐ
์ธํฐ์ ํฐ์์ ์๋ธ ๋ฉ๋ด ๋ฐ ์๋จ ๋ฉ๋ด ๊ฐ์ด ๋จ๊ฒ ์ฝ๋ ์ถ๊ฐ
@Override
public void addInterceptors(InterceptorRegistry registry) {
//์๋์ ๊ฐ์ฒด ์๋ก ๋ง๋๋ ๋ฉ์๋ ์คํ
registry.addInterceptor(getMenuIntercepter())
.order(2)
.addPathPatterns("/admin/cateManage") //์นดํ
๊ณ ๋ฆฌ ๊ด๋ฆฌ ํ์ด์ง
.addPathPatterns("/admin/regItem")
.addPathPatterns("/admin/itemManage")
.addPathPatterns("/admin/memberManage")
.addPathPatterns("/admin/orderManage")
.addPathPatterns("/admin/saleStatusPerMonth"); // ์๋ณ ๋งค์ถ ํํฉ ํ์ด์ง
}
์๋ณ ๋งค์ถ ํํฉ ํ๋ฉด ์๋์ฒ๋ผ ๊ตฌํ.
์๋ณ๋ก ๋ฐ์ดํฐ ๋ฝ๋ ๋ฐฉ๋ฒ 2๊ฐ์ง!
1. VO ์์ฑ(์๋ณ๋ก ๊ฐ๊ฐ์ ๋ฐ์ดํฐ ๋ฐ์์ฌ ์ ์๋๋ก VO์์ฑํ์ฌ ๋ฐ์ดํฐ ๋ฐ๊ธฐ)
2. map์ผ๋ก ๋ฐ๊ธฐ( map<String,Integer> )
1.VO๋ก ๋ฐ์ดํฐ ๋ฐ๊ธฐ
์๋ณ ๋ฐ์ดํฐ ๋ฐ์ StatisticsVO ์์ฑ
@Getter
@Setter
@ToString
public class StatisticsVO {
private int month_01;
private int month_02;
private int month_03;
private int month_04;
private int month_05;
private int month_06;
private int month_07;
private int month_08;
private int month_09;
private int month_10;
private int month_11;
private int month_12;
}
admin-mapper์ resultMap์์ฑ
<resultMap type="com.study.shop.admin.vo.StatisticsVO" id="statistics">
<result column="MONTH_01" property="month_01"/>
<result column="MONTH_02" property="month_02"/>
<result column="MONTH_03" property="month_03"/>
<result column="MONTH_04" property="month_04"/>
<result column="MONTH_05" property="month_05"/>
<result column="MONTH_06" property="month_06"/>
<result column="MONTH_07" property="month_07"/>
<result column="MONTH_08" property="month_08"/>
<result column="MONTH_09" property="month_09"/>
<result column="MONTH_10" property="month_10"/>
<result column="MONTH_11" property="month_11"/>
<result column="MONTH_12" property="month_12"/>
</resultMap>
์๋ณ ๋งค์ถ ํํ ์กฐํ ์ฟผ๋ฆฌ ์์ฑ
<์ฟผ๋ฆฌ ์์ฑ TIP > ์๋ URL ์ฐธ๊ณ
https://byeol-dev.tistory.com/152
์ฟผ๋ฆฌ ์์ฑ ์ ์๋ณ ๋งค์ถ ํํฉ์ด ๊ฐ๋ก๋ก ๋ฐฐ์น ๋์ด ์กฐํ๋๊ฒ ํ ๊ฒ!
DECODE๋ ๋๋ฒ ์ธ ์ ์์ด์ UNION ALL ์ฌ์ฉํ์ฌ ์๋ณ ๊ตฌ๋งค๊ฑด์์ ์๋ณ ๊ตฌ๋งค๊ธ์ก ๊ฐ๊ฐ ์กฐํ
<!-- ์๋ณ ๋งค์ถ ์ ๋ณด ์กฐํ -->
<select id="getSaleStatusPerMonth" resultMap="statistics">
<!-- ์๋ณ ๊ตฌ๋งค๊ฑด์ -->
SELECT SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '01', 1, 0)) AS "MONTH_01"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '02', 1, 0)) AS "MONTH_02"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '03', 1, 0)) AS "MONTH_03"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '04', 1, 0)) AS "MONTH_04"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '05', 1, 0)) AS "MONTH_05"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '06', 1, 0)) AS "MONTH_06"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '07', 1, 0)) AS "MONTH_07"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '08', 1, 0)) AS "MONTH_08"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '09', 1, 0)) AS "MONTH_09"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '10', 1, 0)) AS "MONTH_10"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '11', 1, 0)) AS "MONTH_11"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '12', 1, 0)) AS "MONTH_12"
FROM SHOP_BUY
UNION ALL
<!-- ์๋ณ ๊ตฌ๋งค ๊ธ์ก ํฉ -->
SELECT SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '01', BUY_PRICE, 0)) AS "MONTH_01"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '02', BUY_PRICE, 0)) AS "MONTH_02"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '03', BUY_PRICE, 0)) AS "MONTH_03"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '04', BUY_PRICE, 0)) AS "MONTH_04"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '05', BUY_PRICE, 0)) AS "MONTH_05"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '06', BUY_PRICE, 0)) AS "MONTH_06"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '07', BUY_PRICE, 0)) AS "MONTH_07"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '08', BUY_PRICE, 0)) AS "MONTH_08"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '09', BUY_PRICE, 0)) AS "MONTH_09"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '10', BUY_PRICE, 0)) AS "MONTH_10"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '11', BUY_PRICE, 0)) AS "MONTH_11"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '12', BUY_PRICE, 0)) AS "MONTH_12"
FROM SHOP_BUY
</select>
AdminService ๋ฉ์๋ ์์ฑ
//์๋ณ ๋งค์ถ ํํฉ ์กฐํ
List<StatisticsVO> getSaleStatusPerMonth();
AdminServiceImpl ๋ฉ์๋ ๊ตฌํ
//์๋ณ ๋งค์ถ ํํฉ ์กฐํ
@Override
public List<StatisticsVO> getSaleStatusPerMonth() {
return sqlSession.selectList("adminMapper.getSaleStatusPerMonth");
}
Admincontroller์์ ๋ฉ์๋ ์คํ
//์๋ณ ํํฉ ํ์ด์ง
@GetMapping("/saleStatusPerMonth")
public String saleStatusPerMonth(AdminSubMenuVO adminSubMenuVO, Model model) {
model.addAttribute("list", adminService.getSaleStatusPerMonth());
return "content/admin/sale_status_per_month";
}
sale_status_per_month.html์์ ๋ฐ์ดํฐ ๋ฟ๋ ค์ฃผ๊ธฐ
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorate="~{fragment/admin_layout}">
<!-- ์ฐ๊ฒฐํด์ผ ํ ์ธ๋ถ css ํ์ผ -->
<th:block layout:fragment="content_css">
<!--<link rel="stylesheet" href="/css/test.css(๋ณ๊ฒฝ)">--> <!-- ์ธ๋ถ css ์ฐ๊ฒฐํ๋ ์ฝ๋๋ฅผ block ์์ ์์ฑ layout์์ ๊ฐ์ด ์ด์ด์ค -->
</th:block>
<!--๋ณธ๋ฌธ๋ด์ฉ(html) -->
<th:block layout:fragment="content">
<!-- vo ์ฌ์ฉํ์ฌ ์๋ณ ๋งค์ถ ๋ฐ์ดํฐ ๋ฝ๊ธฐ -->
<div class="row">
<div class="col">
<div class="row"></div>
<div class="row"></div>
<div class="row"></div>
<div class="col">
<table class="table text-center align-middle">
<thead class="table-head">
<tr>
<td></td>
<th:block th:each="month : ${#numbers.sequence(1, 12)}">
<td style="text-align: center;"> [[${month}]]์</td>
</th:block>
</tr>
</thead>
<tbody>
<tr th:each="data, state : ${list}" style="text-align: center;">
<td>[[${state.index == 0 ? 'ํ๋งค๊ฑด์' : 'ํ๋งค๊ธ์ก'}]]</td>
<td>[[${data.month_01}]]</td>
<td>[[${data.month_02}]]</td>
<td>[[${data.month_03}]]</td>
<td>[[${data.month_04}]]</td>
<td>[[${data.month_05}]]</td>
<td>[[${data.month_06}]]</td>
<td>[[${data.month_07}]]</td>
<td>[[${data.month_08}]]</td>
<td>[[${data.month_09}]]</td>
<td>[[${data.month_10}]]</td>
<td>[[${data.month_11}]]</td>
<td>[[${data.month_12}]]</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</th:block>
2. map์ผ๋ก ๋ฐ์ดํฐ ๋ฐ๊ธฐ
map<string,integer>
์๋ณ ๋งค์ถ ํํฉ ์กฐํ ์ฟผ๋ฆฌ ์์ฑ.
์ฟผ๋ฆฌ ์์ฑ ์ ์ฐธ๊ณ ์ฌํญ.
map์์ ๋ฐ์ดํฐ ๋ฐ์ ๋ map<string,integer> ํ์์ผ๋ก ๋ฐ์. key : 1์ - value : 2 (ํ๋งค๊ฑด์) key : 2์ - value : 3 (ํ๋งค๊ฑด์) ํ์์ผ๋ก ๋ฐ์ดํฐ ๋ฐ์ ์ ์์. ํ๋ฉด์์์๋ key๊ฐ 1์์ด์ง๋ง ์ฝ๋๋ก๋ key : month_01์ ์์ ๊ทธ๋ฆผ์์ ๋ณด์ด๋ 1์ค(์ด๋ค ๋ฐ์ดํฐ์ 1~12์๊น์ง์ ํํฉ) ๋ฐ์ดํฐ๋ฅผ ๋ค๊ณ ์ค๋ ค๋ฉด map์ด 1๊ฐ ํ์ํจ! ์ฌ๋ฌ ๋ฐ์ดํฐ์ 1~12์๊น์ง์ ํํฉ์ ๋ฐ์ดํฐ๋ก ๋ฐ์์ผ ํ๊ธฐ ๋๋ฌธ์ โถ List<map<string,integer>>๋ก ๋ค๊ณ ์์ผ ๋จ.</map<string,integer> |
์ฟผ๋ฆฌ๋ vo์ ๋์ผ resultType ์์ > ํ๋์ ํ์ map์ผ๋ก ๊ฐ์ ธ์ค๊ฒ ๋ค๊ณ ์ ์
<!-- ์๋ณ ๋งค์ถ ์ ๋ณด ์กฐํ -->
<!-- 1ํ์ map์ผ๋ก ๋ฐ๊ฒ ๋ค๊ณ ์ค์ ํ ๊ฒ. ์ฌ๋ฌ์ค์ ์์์ list๋ก ๋ฐ์์ง -->
<select id="getSaleStatusPerMonth2" resultType="HashMap">
<!-- ์๋ณ ๊ตฌ๋งค๊ฑด์ -->
SELECT SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '01', 1, 0)) AS "MONTH_01"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '02', 1, 0)) AS "MONTH_02"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '03', 1, 0)) AS "MONTH_03"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '04', 1, 0)) AS "MONTH_04"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '05', 1, 0)) AS "MONTH_05"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '06', 1, 0)) AS "MONTH_06"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '07', 1, 0)) AS "MONTH_07"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '08', 1, 0)) AS "MONTH_08"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '09', 1, 0)) AS "MONTH_09"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '10', 1, 0)) AS "MONTH_10"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '11', 1, 0)) AS "MONTH_11"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '12', 1, 0)) AS "MONTH_12"
FROM SHOP_BUY
UNION ALL
<!-- ์๋ณ ๊ตฌ๋งค ๊ธ์ก ํฉ -->
SELECT SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '01', BUY_PRICE, 0)) AS "MONTH_01"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '02', BUY_PRICE, 0)) AS "MONTH_02"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '03', BUY_PRICE, 0)) AS "MONTH_03"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '04', BUY_PRICE, 0)) AS "MONTH_04"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '05', BUY_PRICE, 0)) AS "MONTH_05"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '06', BUY_PRICE, 0)) AS "MONTH_06"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '07', BUY_PRICE, 0)) AS "MONTH_07"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '08', BUY_PRICE, 0)) AS "MONTH_08"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '09', BUY_PRICE, 0)) AS "MONTH_09"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '10', BUY_PRICE, 0)) AS "MONTH_10"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '11', BUY_PRICE, 0)) AS "MONTH_11"
, SUM(DECODE(TO_CHAR(BUY_DATE, 'MM'), '12', BUY_PRICE, 0)) AS "MONTH_12"
FROM SHOP_BUY
</select>
AdminService ๋ฉ์๋ ์์ฑ
//map์ผ๋ก ์๋ณ ๋งค์ถ ํํฉ ์กฐํ
List<Map<String, Integer>> getSaleStatusPerMonth2();
AdminServiceImpl ๋ฉ์๋ ๊ตฌํ
//map ์ฌ์ฉ ์๋ณ ๋งค์ถ ํํฉ ์กฐํ
@Override
public List<Map<String, Integer>> getSaleStatusPerMonth2() {
return sqlSession.selectList("adminMapper.getSaleStatusPerMonth2");
}
Admincontroller ์์ฑ
HashMap์ผ๋ก ๋ฐ์ ๋ฐ์ดํฐ TreeMap์ผ๋ก ๋ณ๊ฒฝํ๋ ์์ ์ด ํ์ํจ
์ด์ :
์ด๋๋ก map์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฝ์์ html์ ๋ฟ๋ฆฌ๋ฉด HashMap์ ์์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์๊ณผ ๋งค์ถ ๋ฐ์ดํฐ๊ฐ ๋ค์ฃฝ๋ฐ์ฃฝ์ผ๋ก ๋์ด.
HashMap / TreeMap ๋๊ฐ์ง ๋ค ์์ ๋ ์๋ฃ์ ์๋ฒ ์๊ณ ์ค๋ณต์ด ๋ถ๊ฐํจ.
๊ทธ๋ฌ๋ HashMap๊ณผ TreeMap ์ค๋ณต ๊ฒ์ฌ๋ฅผ ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด ๋ค๋ฆ.
TreeMap์ map ์์ ์๋ ๋ฐ์ดํฐ์ ๋น๊ตํ์ฌ ํฐ ์๋ฉด ์ค๋ฅธ์ชฝ ์์ ์๋ฉด ์ผ์ชฝ ์ด๋ฐ ํํ๋ก ์ค๋ณต ๊ฒ์ฌํ๊ธฐ ๋๋ฌธ์ ์ผ์ชฝ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ์ผ๋ฉด ์๋์ผ๋ก ์ค๋ฆ์ฐจ์์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์ ๋ ฌ๋จ.
//์๋ณ ํํฉ ํ์ด์ง
@GetMapping("/saleStatusPerMonth")
public String saleStatusPerMonth(AdminSubMenuVO adminSubMenuVO, Model model) {
//map ์ฌ์ฉ ์๋ณ ๋งค์ถ ์กฐํ ๋ฉ์๋
//๋ฐ์ดํฐ ์กฐํ ์ ์ฌ๋ฌ ๋ฐ์ดํฐ์ 1~12์๊น์ง์ ํํฉ์ ํ๋์ HashMap์ผ๋ก ๋ฐ๊ธฐ ๋๋ฌธ์
๋ฉ์๋ ์คํ ํ ๋ฐ์ดํฐ๋ list๋ก ๋ฐ์!!
List<Map<String, Integer>> mapList = adminService.getSaleStatusPerMonth2();
System.out.println("--------------------");
//mapData ๋ฝ๊ธฐ
//map ๋ฐ์ดํฐ ์ฌ๋ฌ๊ฐ ๋ค์ด์ฌ ์ ์๋ list ํต ๋ง๋ค๊ธฐ.
//๋ฐ์ดํฐ์ ์์ ๋ถ์ฌํ๊ธฐ ์ํด์ list์ ๋ด๋ ๊ฒ
List<Map<String, Integer>> resultList = new ArrayList<>();
for(Map<String, Integer> map : mapList) {
//MONTH_01์ value ๊ฐ 2๊ฐ (ํ๋งค๊ฑด์, ํ๋งค๊ธ์ก) ์ถ๋ ฅ.
//System.out.println(map.get("MONTH_01"));
//for๋ฌธ ๋๋ฉด์ mapList์์ ํ๋์ฉ ๋ฝ์ HashMap์ ๊ฐ๊ฐ TreeMap์ผ๋ก ๋ฐ๊ฟ์ค
//TreeMap์ผ๋ก ๋ฐ๊พธ๋ ์ด์ : TreeMap๋ ์์ ์์ง๋ง ์ค๋ณต ๊ฑฐ๋ฅด๋ ์๊ณ ๋ฆฌ์ฆ์ ์ํด
//๋ฐ์ดํฐ๊ฐ ์ค๋ฆ์ฐจ์์ผ๋ก ์๋ ์ ๋ ฌ๋๊ธฐ ๋๋ฌธ์
Map<String, Integer> map1 = new TreeMap<>(map);
//TreeMap์ผ๋ก ๋ฐ๋ map1 ๋ฐ์ดํฐ๋ฅผ map ๋ฐ์ดํฐ๋ฅผ ๋ด์ ์ ์๋ list์ ๋ฃ์ด์ค.
resultList.add(map1);
//map์ ๋ค์ด์๋ ๋ชจ๋ key๊ฐ ๋ค๊ณ ์ด(key > ๋ฌธ์์ด์ด๊ธฐ ๋๋ฌธ์ String).
Set<String> keySet = map1.keySet(); //Set : ๋ฐ์ดํฐ์ ์๋ฒ์ด ์๊ณ ์ค๋ณต ๋ถ๊ฐ > map ๋ฐ์ดํฐ์ key์ ์ฑ์ง ๋์ผ.
//Set์ key๊ฐ์ ๊ฐ์ง๊ณ ๋ฐ๋ณต๋ฌธ ๋๋ฆด ์ ์์ (map์ ๋ฐ๋ณต๋ฌธx)
for(String key : keySet) { //key์ ๋ํ value
System.out.println("key : " + key + " / value : " + map1.get(key) );
}
System.out.println(); //์๋ฒ์์ด ๋์ด
}
//map1 ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์๋ list๋ฅผ html๋ก
model.addAttribute("mapList", resultList);
return "content/admin/sale_status_per_month";
}
map ๋ฐ์ดํฐ ์ ๋ฝ์์ค๋์ง ์ถ๋ ฅ๋ฌธ์ผ๋ก ํ์ธ
month_01์ด๋ผ๋ key๊ฐ ๊ฐ์ง value๋ ํ๋งค๊ฑด์, ํ๋งค๊ธ์ก 2๊ฐ์ง
์ถ๋ ฅํด๋ณด๋ฉด value 2๊ฐ ๋์ด
map์ ๋ค์ด์๋ ๋ชจ๋ key๊ฐ๊ณผ value ์ถ๋ ฅํด๋ณด๋ฉด ์๋์ ๊ฐ์ด ์ถ๋ ฅ๋จ.
sale_status_per_month.html์ mapList ๋ฐ์ดํฐ ๋ฟ๋ฆฌ๊ธฐ
<!--๋ณธ๋ฌธ๋ด์ฉ(html) -->
<th:block layout:fragment="content">
<!-- map ์ฌ์ฉํ์ฌ ์๋ณ ๋งค์ถ ๋ฐ์ดํฐ ๋ฝ๊ธฐ -->
<div class="col">
<div class="row"></div>
<div class="row">
<table class="table text-center align-middle">
<thead class="table-head">
<tr>
<td></td>
<th:block th:each="month : ${#numbers.sequence(1,12)}">
<!-- ์๋ฆฟ์ ๋ง์ถฐ์ฃผ๊ธฐ -->
<td>[[${#numbers.formatInteger(month, 2)}]]์</td>
</th:block>
</tr>
</thead>
<tbody> <!-- mapList๋ฅผ ๋ฐ๋ณต ๋๋ฆฌ๋ฉด ์ฌ๋ฌ๊ฐ์ mapData -->
<tr th:each = "mapData, state :${mapList}" >
<td>[[${state.index == 0 ? 'ํ๋งค๊ฑด์' : 'ํ๋งค๊ธ์ก'}]]</td>
<!-- ์ฌ๋ฌ๊ฐ์ mapData๋ฅผ ๋ ๋ฐ๋ณต ๋๋ฆฌ๋ฉด์ ๊ฐ๊ฐ์ Data์ value ๊ฐ์ ๋ฝ์ -->
<th:block th:each="data : ${mapData}">
<td>[[${data.value}]]</td>
</th:block>
</tr>
</tbody>
</table>
</div>
</div>
</th:block>