[ 3. OPEN API 사용하기 ] 자바에서 특일정보 open api사용하기

Question Murder·2023년 8월 15일
0

포스트맨에서 확인해보았을 때, 필요했던 준비물들은
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);
    
    
}
  1. 일단 필요한 url은 변수로 생성해주었고,
  2. service key값도 직접 코드에 넣는 것 보다는 application.yml 배치 공통파일에서 값을 넣어줘서 key로 불러와서 value를 부르는 형식으로 값을 넣어준다.
  3. 필요한 파라미터인 year, month값도 현재 년도와 월 값들은 원하는 형식으로 불러와
  4. requestURI 변수에다가 파라미터를 넘겨
  5. restTemplate.getForObject()에 url, responseType 을 넘겨주었다.
    이렇게 했을시에 정상작동하는 것을 보았다.
  • 아쉬운 점은 responseType에 대한 DTO를 만들지 못했다는 점이다.
    responseType을 String.class 로 하여 공휴일 return 값을 문자열로 받겠다는 뜻인데, DTO로 했을경우 DTO클래스를 넣어주면, 자동으로 맵핑되어 값을 더 깔끔하게 받는 장점이 있다.
  1. 결과값이 문자열이니 사용하기쉽게 json형태로 형변환해주자 (jsonMap)
{
    "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하였다.

이렇게 함으로써 공휴일의 유무조건에 따라 사용하는 법을 살펴보았다.

profile
물음표 살인마

0개의 댓글

관련 채용 정보