TEAM PROJECT

23.07.27 / [Spring boot] HashMap vs LinkedHashMap 순서가 보장되는 Map

낫쏘링 2023. 7. 27. 15:08
728x90

[ 1. 구현 ]

- 스크립트단에서 테이블 태그 생성 후 데이터 받아와 동적으로 넣어주는 코드 필요
- 테이블 태그에 들어갈 <th>태그의 텍스트 노드에 데이터베이스의 컬럼명을 바로 넣어주고자 함
for(let list of pointStandardList){
    for(let arr in list){
         const addTh = $(`<th>${arr}</th>`);
            $('thead').find('tr').append(addTh);
    }	
}

// 조회 결과를 담은 리스트 변수 = pointStandardList
// 리스트 변수에서 자바스크립트 for of와 for in을 통해 컬럼명을 담은 변수 = arr

- 컬럼과 데이터의 순서를 정해서 테이블에 넣어주고 싶었음
  (유효기간코드 / 유효기간 / 사용유무 / 최초등록일 / 관리자ID / 최종수정일 )
  SELECT 할 때 SQL에서는 작성한 순서대로 출력되기 때문에 쿼리 순서를 이용하면 될 거라고 생각했음....
<select id="getPointExpireStandard" parameterType="map" resultType="map">
    SELECT
        point_expire_standard_code AS '유효 기간 코드',
        point_expire AS '유효 기간',
        CASE 
           WHEN code_use = 'Y' THEN '사용가능'
           WHEN code_use = 'N' THEN '사용불가능'
        END AS '코드 사용 유무',	
        set_datetime AS '최초 등록일',
        admin_id AS '관리자 ID',
        up_datetime AS '최종 수정일'			
    FROM
        point_expire_standard
    ORDER BY CAST(SUBSTRING_INDEX(point_expire_standard_code,'code',-1) AS UNSIGNED)
    <if test="currentFirstIndex != null and currentFirstIndex > -1">
        LIMIT #{currentFirstIndex},#{rowPerPage};
    </if>	
</select>

 

[ 2. 문제점 ]

[ MySQL 실행 결과  - 내가 원하는 순서로 출력됐다.]

[ 백엔드 실행 결과  - 아니 데이터가 담긴 순서가....? ]

화면에서 코드사용유무/유효기간코드/관리자ID/최초등록일/최종수정일/유효기간 순서대로 출력되어버린다... 

pointStandardList :
[{코드 사용 유무=사용가능, 유효 기간 코드=point_expire_standard_code1, 관리자 ID=adminid001, 최초 등록일=2023-01-15, 최종 수정일=2023-01-15, 유효 기간=3},
{코드 사용 유무=사용불가능, 유효 기간 코드=point_expire_standard_code2, 관리자 ID=adminid002, 최초 등록일=2023-01-16, 최종 수정일=2023-01-16, 유효 기간=4},
{코드 사용 유무=사용불가능, 유효 기간 코드=point_expire_standard_code3, 관리자 ID=adminid002, 최초 등록일=2023-01-17, 최종 수정일=2023-01-17, 유효 기간=5},
{코드 사용 유무=사용불가능, 유효 기간 코드=point_expire_standard_code4, 관리자 ID=adminid002, 최초 등록일=2023-01-18, 최종 수정일=2023-01-18, 유효 기간=6}]

 

[ 3. 문제 해결 ]

[ HashMap과 LinkedHashMap의 차이 ]

  • HashMap : 순서가 보장되지 않는 Map 내장객체
  • LinkedHashMap : 순서가 보장되는 Map 내장객체
1. mapper.xml (dao) 에서 결괏값 타입을 LinkedHashMap으로 바꿔준다.
    (여기까지만 수정해줘도 리스트가 순서대로 담긴다.....
     이유는 아마도 LinkedHashMap이 HashMap에서 상속받아 HashMap의 모든 메소드를 사용할 수 있기 때문.....?)
// 수정 전
<select id="getPointExpireStandard" parameterType="map" resultType="map">

// 수정 후
<select id="getPointExpireStandard" parameterType="map" resultType="java.util.LinkedHashMap">​

2. 하지만 확실하게 하기 위해서 객체 생성도 수정해준다.

// 수정 전
Map<String,Object> paramMap = new HashMap<String,Object>();	

// 수정 후
Map<String,Object> paramMap = new LinkedHashMap<String,Object>();​

 

 

내가 원하던 순서대로 담겼다!!

pointStandardList :
[{유효 기간 코드=point_expire_standard_code1, 유효 기간=3, 코드 사용 유무=사용가능, 최초 등록일=2023-01-15, 관리자 ID=adminid001, 최종 수정일=2023-01-15},
{유효 기간 코드=point_expire_standard_code2, 유효 기간=4, 코드 사용 유무=사용불가능, 최초 등록일=2023-01-16, 관리자 ID=adminid002, 최종 수정일=2023-01-16},
{유효 기간 코드=point_expire_standard_code3, 유효 기간=5, 코드 사용 유무=사용불가능, 최초 등록일=2023-01-17, 관리자 ID=adminid002, 최종 수정일=2023-01-17},
{유효 기간 코드=point_expire_standard_code4, 유효 기간=6, 코드 사용 유무=사용불가능, 최초 등록일=2023-01-18, 관리자 ID=adminid002, 최종 수정일=2023-01-18}]

 

728x90