[Mybatis] DB HashMap으로 가져올때 순서 유지하는 방법

Mybatis를 이용해서 HashMap으로 데이터를 가져오면 순서가 뒤바뀔 수있다.

HashMap은 순서를 유지하지 않고, key-value 값으로만 가져오기 때문이다.

다음과 같은 쿼리가 있다고 가정해보자

 	<select id="selectBookCountByYear" resultType="hashMap">
	SELECT 
	(SELECT COUNT(*) FROM book WHERE YEAR(regdate) = '2016') AS '2016',
	(SELECT COUNT(*) FROM book WHERE YEAR(regdate) = '2017') AS '2017',
	(SELECT COUNT(*) FROM book WHERE YEAR(regdate) = '2018') AS '2018',
	(SELECT COUNT(*) FROM book WHERE YEAR(regdate) = '2019') AS '2019',
	(SELECT COUNT(*) FROM book WHERE YEAR(regdate) = '2020') AS '2020'
 	</select>

해당 데이터를 호출하고 entryset으로 for문을 돌리면

Map<String,Object> dataList = bookService.selectBookCountByYear();
ArrayList<Map<String,Object>> resultList = new ArrayList<>();
for (Entry<String, Object> entry : dataList.entrySet()) {
  int value = Integer.parseInt(entry.getValue().toString());
  Map<String,Object> hashMap = new HashMap<>();
  hashMap.put("name", entry.getKey());
  hashMap.put("value", entry.getValue());
  resultList.add(hashMap);
}

resultList.stream().forEach( a -> System.out.println(a.get("name")+", "+a.get("value"));

다음과 같은 순서를 알 수 없는 결과가 나타난다(매번 바뀜)

name value
2017 2890
2016 1132
2019 3306
2018 1207
2020 4598

column 순서를 유지하면서 가져오는 방법은 mybatis 쿼리문에서 resultType을 변경하면된다

기존 hashMap -> java.util.LinkedHashMap

그냥 linkedHashMap을 사용하면 classNotFound Exception이 발생한다.

 	<select id="selectBookCountByYear" resultType="java.util.LinkedHashMap">
	SELECT 
	(SELECT COUNT(*) FROM book WHERE YEAR(regdate) = '2016') AS '2016',
	(SELECT COUNT(*) FROM book WHERE YEAR(regdate) = '2017') AS '2017',
	(SELECT COUNT(*) FROM book WHERE YEAR(regdate) = '2018') AS '2018',
	(SELECT COUNT(*) FROM book WHERE YEAR(regdate) = '2019') AS '2019',
	(SELECT COUNT(*) FROM book WHERE YEAR(regdate) = '2020') AS '2020'
 	</select>

순서대로 잘 작동한다.

name value
2016 1132
2017 2890
2018 1207
2019 3306
2020 4598