23.07.27 / [Spring boot] HashMap vs LinkedHashMap 순서가 보장되는 Map
[ 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}]