Seongwon Lim

[OpenAPI] 코로나19 감염 현황 OpenAPI를 이용하여 활용하기 본문

OpenAPI

[OpenAPI] 코로나19 감염 현황 OpenAPI를 이용하여 활용하기

limsw 2022. 5. 8. 17:13
반응형

서론

이번 글에서는 공공데이터포털 웹사이트에서 제공하는 OpenAPI 사용 방법에 대해서 알아보고 해당 사이트에서 제공하는 여러 OpenAPI들 중에서 보건복지부 코로나19 감염 현황 데이터를 가져오는 예시를 들어보고자 한다.

 

공공데이터포털 국가에서 보유하고 있는 다양한 데이터를 개방하여 사용자들이 데이터를 쉽고 용이하게 활용하거나 사용할 수 있도록 수많은 데이터를 제공하고 있다.

공공데이터포털 회원가입

공공데이터포털에서 제공하는 OpenAPI를 사용하기 위해서는 해당 사이트의 계정이 필요하다.

 

 

해당 주소로 접속하여 회원가입을 진행할 수 있으며 네이버, 카카오를 이용한 로그인도 가능하므로 참고하길 바란다.

OpenAPI 사용 방법

로그인이 완료되었다면 메인 페이지의 상단 탭에 있는 데이터 찾기 메뉴에서 데이터 목록 탭을 클릭한다.

 

그리고 위와 같이 검색어 키워드로 코로나를 검색 후 검색 조건에는 오픈 API 탭을 클릭한다. 코로나에 관련된 OpenAPI는 총 42건이 존재하는 것을 확인할 수 있으며 필자는 공공데이터활용지원센터_보건복지부 코로나19 감염 현황 API를 사용할 것이다.

 

  • 여기를 클릭하면 해당 API 주소로 접속할 수 있다.

 

이제 해당 주소에 어떤 내용이 있는지 살펴보자.

해당 OpenAPI에 대한 여러 정보들이 나와있다. 데이터 포맷은 XML 형식인 것을 보아 결과가 XML 형태로 반환된다는 것을 알 수 있다.


다음으로 상세 기능에는 데이터를 받기 위해 요청할 서비스 URL 주소가 있다.
위에 보이는 http://openapi...주소에 요청하여 데이터를 가져올 수 있으며 아래에서 예시로 다룰 것이다.

다음으로 요청을 보낼 때 항목구분 옵션에서 옵션에서 필수로 되어있는 변수들은 데이터 요청 시 반드시 필요한 변수라는 것을 의미한다.

그 아래에는 언어별로 해당 OpenAPI를 쉽게 사용할 수 있도록 샘플 코드가 작성되어 있다.

위 사진은 파이썬의 샘플 코드이며 이후에 예시를 통해서 자세하게 살펴보고자 한다. 데이터를 사용하기 위해서는 페이지 상단의 활용신청 버튼을 클릭하면 된다.

 

OpenAPI 개발계정 신청하기

OpenAPI 사용을 위해서는 해당 API 활용 목적을 명시해야 한다.

실제 서비스에 사용하고자 할 때에는 어떤 서비스에 어떻게 사용할 것인지 자세하게 명시하는 것이 좋으며 필자는 예시를 들어보고자 하는 것이므로 간단하게 적고 넘어갔다.

활용 신청에 성공하면 위와 같은 메시지를 볼 수 있다. 특정 API의 경우 승인이 되기까지 시간이 걸릴 수 있는데 필자가 예시로 사용한 API는 승인 대기 없이 바로 승인이 완료되었다.

이처럼 활용 중인 Open API가 1건 있는 것을 확인할 수 있으며 아래에 사용자가 사용하고 있는 API가 무엇이 있는지 목록으로 나타나는 것을 볼 수 있다.

API 사용하기

해당 API를 클릭하여 들어가면 API에 대한 상세 정보를 확인할 수 있다.

 

서비스를 사용하기 위한 서비스 정보 탭을 살펴보도록 하자.

 

일반 인증키는 하나의 인증 수단이라고 생각하면 된다. REST 요청 시에 헤더에 해당 인증키를 담아서 요청을 보내야 API를 사용할 수 있다.

 

그 외에는 API에 대한 여러 정보들이 있으며 일일 트래픽 또한 제한하고 있는 것을 확인할 수 있었다. 이제 실제로 API를 사용해보자.

 

포스트맨을 이용하여 OpenAPI 사용하기

윗부분의 요청 변수(Request Parameter) 부분을 보면 서비스키(ServiceKey) 항목이 필수로 된 것을 확인할 수 있다.
따라서 요청을 보낼 때 서비스URL 주소 뒤에 해당 항목을 파라미터로 붙여서 요청한다.

 

요청은 다음과 같이 보낼 수 있다.

요청 주소는 위에서 OpenAPI 상세 정보 부분을 다루었을 때 있었던 서비스URL 주소이다.

 

더보기

http://openapi.data.go.kr/openapi/service/rest/Covid19/getCovid19InfStateJson?ServiceKey=

ServiceKey= 다음에 개발계정을 생성하고 받은 일반 인증키값을 복사해서 붙여넣으면 된다.

 

결과 확인하기

분명히 인증키를 잘 넣어서 요청했는데 계속 에러가 나와서 홈페이지에서 미리보기를 통해 요청을 보내보니까 위와 같은 에러가 나왔다.

 

서비스키가 아직 등록되지 않았다는 뜻인데 문의하기 페이지에서 동일한 오류 글을 찾아보니까 제공기관에 따라서 동기화 시간이 상이하기 때문에 키가 등록되기 까지 시간이 걸릴 수도 있다고 한다.

 

SERVICE KEY IS NOT REGISTERED ERROR

  • 인증키 장애로 잘못된 인증키를 넣어 호출 시 발생합니다. 예외적으로 서비스 신청(승인), 인증키 발급(재발급 포함)하는 경우 해당 정보가 기관 서버로 동기화되지 않아 발생할 수 있으며, 동기화는 약 1시간 정도 소요될 수 있습니다.

 

그래서 조금 기다린 다음 다시 요청을 보냈다.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<response>
    <header>
        <resultCode>00</resultCode>
        <resultMsg>NORMAL SERVICE.</resultMsg>
    </header>
    <body>
        <items>
            <item>
                <createDt>2022-02-13 08:50:26.798</createDt>
                <deathCnt>7081</deathCnt>
                <decideCnt>1350630</decideCnt>
                <seq>788</seq>
                <stateDt>20220213</stateDt>
                <stateTime>00:00</stateTime>
                <updateDt>null</updateDt>
            </item>
        </items>
        <numOfRows>10</numOfRows>
        <pageNo>1</pageNo>
        <totalCount>1</totalCount>
    </body>
</response>

응답 코드 200과 함께 XML 형식으로 된 데이터가 반환되었다. 서비스키를 제외한 다른 옵션은 추가하지 않았으므로 데이터가 1개만 반환된 것 같다. 옵션을 추가하지 않았을 때는 당일 날짜 기준으로 데이터를 가져오는 것 같았다. 누적 사망자, 누적 확진자, 데이터 생성 날짜 등의 정보가 들어가 있는 것을 확인할 수 있다.

 

SERVICE KEY IS NOT REGISTERED ERROR 에러 메시지가 계속 나타날 때

 

인증 키를 발급 받고 어느정도 시간이 지난 후에도 계속해서 동일한 에러 메시지가 나타난다면 다른 해결 방법을 사용하여 에러를 해결할 수 있다.

  • 인증 키 새로 발급받기
  • 요청을 보낼 때 일반 인증키를 디코딩된 인증 키를 사용하기

여러 옵션 추가하기

여러 쿼리 변수를 추가하기 위해서는 뒤에 요청 주소 뒤에 &기호를 이용하여 사용할 변수를 추가하면 된다. 예를 들어 데이터 생성일 시작범위(startCreateDt), 데이터 생성일 종료범위(endCreateDt)을 추가하고 싶다면 기존 주소에서 &startCreateDt=...&endCreateDt=... 이런 식으로 쿼리 변수를 추가하면 된다.

 

필자는 시작 날짜를 2022/02/10, 종료 날짜를 2022/02/11으로 변경하기 위해 다음과 같이 주소를 변경 후 요청을 보냈다.

 

결과는 다음과 같이 2개의 item을 반환한 것을 확인할 수 있었다.

파이썬으로 구현하기

파이썬으로 구현하기 위해 OpenAPI에서 제공하는 샘플 코드를 이용하기로 했다.

import requests
from bs4 import BeautifulSoup

url = 'http://openapi.data.go.kr/openapi/service/rest/Covid19/getCovid19InfStateJson'
params ={'serviceKey' : '서비스키', 'pageNo' : '1', 'numOfRows' : '10', 'startCreateDt' : '20200310', 'endCreateDt' : '20200315' }

response = requests.get(url, params=params)
soup = BeautifulSoup(response.content, 'html.parser')

deathCnt = soup.select('items > item > deathcnt')
createDt = soup.select('items > item > createdt')

for death, create in zip(deathCnt, createDt):
    print("등록 날짜:", create.text, "누적 사망자 수:", death.text)

서비스키 부분에 사용자의 인증 키를 붙여 넣으면 된다. 그 이외의 옵션은 사용자 필요에 맞게 커스텀 할 수 있으며 필자는 샘플 코드를 그대로 활용하기로 했다.

 

그리고 XML 형식으로 받아온 결과를 BeautifulSoup 라이브러리를 이용해서 파싱한 뒤 누적 사망자 수, 데이터 등록 날짜 결과를 가져오기 위해 위와 같이 코드를 구현했다.

날짜 범위가 2020/03/10 ~ 2020/03/15 이었으므로 5쌍의 데이터를 잘 가져온 것을 확인할 수 있었다.

Comments