์‡ผํ•‘๋ชฐ ํ”„๋กœ์ ํŠธ(14) ๊ด€๋ฆฌ์ž ๋ฉ”๋‰ด - ์ฃผ๋ฌธ ๊ด€๋ฆฌ - ์›”๋ณ„ ๋งค์ถœ ํ˜„ํ™ฉ

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>