포스트맨에서 확인해보았을 때, 필요했던 준비물들은
URL, params, api key값 이였다. 고대로 가져와서 java에서 사용해보자
첫번째로 메서드안에서 작업을 하자. return 값은 어떻게 받아올지 아직 모르겠으니, string으로하고 나중에 변경하자
private final String url = "http://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService/getHoliDeInfo"
private String getHolidays() {
String serviceKey = env.getProperty("holiday.apiKey");
String currentYear = new SimpleDateFormat("yyyy").format(new Date());
String currentMonth = new SimpleDateFormat("MM").format(new Date());
URI requestURI = new URI(url + "?ServiceKey=" + serviceKey + "&solYear=" + currentYear + "&solMonth=" + currentMonth + "&_type=" + "json");
String holidayDate = restTemplate.getForObject(requestURI, String.class);
Map<String, Object> jsonMap = JSONUtils.readValue(holidayDate, Map.class);
}
{
"response": {
"header": {
"resultCode": "00",
"resultMsg": "NORMAL SERVICE."
},
"body": {
"items": {
"item": {
"dateKind": "01",
"dateName": "광복절",
"isHoliday": "Y",
"locdate": 20230815,
"seq": 1
}
},
"numOfRows": 10,
"pageNo": 1,
"totalCount": 1
}
}
}
결과 값 json형태 (내가 DTO를 안만든이유)
이어서
Map<String, Object> response = jsonMap.get("response");
Map<String, Object> body = jsonMap.get("body");
if (body.get("items").toString() == "") {
return new ArrayList<>();
}
Map<String, Object> items = (Map<String, Object>) body.get("items");
Object item = items.get("item");
if (item instanceof Map) {
itemList = new ArrayList<>();
itemList.add((Map<String, Object>) item);
} else if (item instanceof List) {
itemList = (List<Map<String, Object>>) item;
} else {
itemList = new ArrayList<>();
}
return itemList;
response, body 값 까지는 불변이다.
items에는 item을 담는데 item 안에 월에대한 값들이 담긴다.
예를들어 2023년도 기준으로 8월은 15일(광복절), 9월 28, 29, 30일(추석), 11월 공휴일 없음 이렇게 담긴다.
11월 공휴일이 없는 달
공휴일이 없는 11월인 경우에는 item이 없다보니 items == "" 로 반환한다.
그래서 공휴일이 없는 날에는 String "" 값을 List로 변환하지 못해
클래스 캐스팅 오류발생한다.
8월 공휴일이 한개인 달
공휴일이 한개일대는 response, body처럼 Map<String, Object> item 으로 반환한다.
9월 공휴일이 여러개인 달
9월에는 추석이 있어 여러개인 공휴일일때는 List로 반환을 한다. List<Map<String, Object>> 를 사용해서 반환해줘야한다.
그래서 이런 가변적인 return 값 자료형때문에 Object인 Java에서 최상위 클래스를 사용하여 다양한 객체유형에 맞춰 받아줄 수 있게 유연하게 데이터 클래스를 처리할 수 있게 Object를 사용했다.
그리고 instanceof 연산자를 사용하여 객체유형에 따라 조건을 맞춰 값을 return하였다.
이렇게 함으로써 공휴일의 유무조건에 따라 사용하는 법을 살펴보았다.