공휴일 API 연동

Jang Seok Woo·2021년 8월 9일
0

Android Studio

목록 보기
16/20

달력에 공휴일 정보를 넣으려 하다보니 일일이 수작업을 할 수는 없었다.

구글링하면 2200년까지? 누군가 정리해둔 파일이 있긴하던데

그건 내가 원하는 방법이 아니다. 실력도 키울겸 공휴일 API를 연동해보록 하겠다.

https://www.data.go.kr/dataset/15012690/openapi.do

이번에도 역시 문제가 생겼었는데, API는 연동할 때마다 새로운 문제를 맞이한다.

지난번에 정리한 API 정리시 주의할 점을 보면

1. Response DataType.

2. CLEARTEXT communication to apis.data.go.kr not permitted by network security policy...

3 .com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $

4. java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $

5. key값 오류

가 있었는데 2번부터 5번은 한가지 문제에서 체인으로 발생한 문제들이었고 결국 URI encoding된 값을 키로 사용하여 방향을 잘못 선택하게되면 무한한 늪에 빠질 수 있는 오류였다.

오늘은 도대체 데이터 구조도 잘 만들었고, 몇번을 다시봐도 잘 만들었고,
다른 오류가 뜨는것도 아닌데, OkHttp 로깅을 통해 확인해도 receive가 200이 뜨면서 데이터를 받는데는 성공하는데 왜 데이터가 내가 설계한 클래스에 들어오지 않는가.. 에 대해 알아보도록 하겠다.

공휴일은 우선 매달 1개가 있는 경우가 있고, 여러개가 있는 경우가 있다. POSTMAN으로 보내본 결과 공휴일 API의 경우 다음과 같이 결과가 나온다.

{
    "response": {
        "header": {
            "resultCode": "00",
            "resultMsg": "NORMAL SERVICE."
        },
        "body": {
            "items": {
                "item": {
                    "dateKind": "01",
                    "dateName": "광복절",
                    "isHoliday": "Y",
                    "locdate": 20210815,
                    "seq": 1
                }
            },
            "numOfRows": 10,
            "pageNo": 1,
            "totalCount": 1
        }
    }
}
{
    "response": {
        "header": {
            "resultCode": "00",
            "resultMsg": "NORMAL SERVICE."
        },
        "body": {
            "items": {
                "item": [
                    {
                        "dateKind": "01",
                        "dateName": "어린이날",
                        "isHoliday": "Y",
                        "locdate": 20210505,
                        "seq": 1
                    },
                    {
                        "dateKind": "01",
                        "dateName": "부처님오신날",
                        "isHoliday": "Y",
                        "locdate": 20210519,
                        "seq": 1
                    }
                ]
            },
            "numOfRows": 10,
            "pageNo": 1,
            "totalCount": 2
        }
    }
}

위와 아래의 차이를 바로 알겠는가?

            "items": {
                "item": [
                   {
            "items": {
                "item": {

여기 잘 보면 [ 가 있다.

공휴일이 그 달에 1개 있을 경우 1개의 item을 보내주느라 배열이 아니라 그냥 변수가 된다?

2개 이상일 경우엔 리스트고

그럼 나는 response를 받을 데이터 구조를 어떻게 만들어야 하는가?

고민을 하다가 나는 이렇게 해결했다.

success로 데이터를 받게 되면 바로 처리하면되고,

1달에 공휴일이 하루 뿐이라서 failure로 떨어지게 되면, retrofit을 사용해서, 새로 만든 다른 response구조체(items가 배열이 아닌 그냥 변수)를 이용해 다시 request를 날린다..

해당 부분 코드는 올리지 않아도 무슨 말인지 이해할 것이라 생각한다.

profile
https://github.com/jsw4215

0개의 댓글