오랜기간의 프로젝트를 마치고 올해 1월초부터 한 일주일동안 휴가를 보냈었습니다. 그 휴가중에 중국의 우한에서 새로운 바이러스에 대한 소식을 아주 흘러가듯이 뉴스를 통해서 들었는데... 이제 겨우 2달남짓 지난 이 시점에서 너무나 많은 일들이 벌어졌습니다.
그 바이러스 이름은 참으로 여러가지 이름으로 바뀌고 결국은 WHO(World Health Organization)에 등재되어 관리되는 이름은 [Coronavirus disease (COVID-2019)] 입니다. 지금도 각 현장에서 힘들게 코로나바이러스의 확산을 방지하고자 노력하시는 관계부처, 의료계, 자원봉사자 모든분들에게 감사의 말씀들 드리고 싶습니다.
이 코로나19로 지금 가장 현실감있게 다가오는 문제는 바로 마스크라고 할 수 있습니다. 매년 미세먼지, 초미세먼지로 자의반 타의반으로 마스크는 계속 소비가 되고있었으나, 이는 지금처럼 필수의 느낌은 아니였습니다. 왜냐하면, 적어도 저만해도 아이가 있는 집에서 주로 아이의 건강상의 우려로 접근하는 그 이상도 그 이하도 아니였기 때문입니다. 그러니 필요할때 한번에 100개씩 저렴한 가격에 주문이 가능하고, 아무때나 내가 필요할때 언제나 가격을 비교하며 살 수 있는 물품이였죠.
하지만 코로나19의 특성상 감염자의 비말을 통해서 전파가 가능하고, 그 전염성이 너무 세기 때문에... 회사를 비롯한 많은 사람이 밀집된 공간에서는 위험성이 크다는 문제가 있습니다. 이와 맞물려 마스크의 중요성이 대두되고, 지금처럼 마스크를 사기조차 힘든 상황이 되었습니다.
예전에 천원남짓한 가격이 형성된 마스크 시장은 4000원 이상으로 올라도 없어서 사기가 힘든 지경에 이르렀고, 결국 정부에서 공적 마스크를 제공하고 현재 지정된 곳에서 제한된 수량으로 구매가 가능하게 되었습니다. 더군다나 지금은 마스크 요일제를 3/9부터 시행하여 운영중입니다.
출생년도를 기준으로 끝자리가 위에 해당되는 요일에 가면 공적 마스크를 살 수 있고, 주중에 못산 사람들은 출생년도에 상관없이 토요일/일요일에 구매가 가능한 방식입니다. 단, 전 주에 사지못했다고 그 다음주에 2매가 아닌 4매를 살 수는 없습니다.
이렇다보니, 실제로 약국이나 하나로마트 등을 가보면 구매를 하기위한 줄이 어마무시하게 들어섭니다. 저도 약국 판매가 시작하기 40분전부터 기다려서 겨우 구매를 했는데, 그 뒤에선 분들은 그마저도 못사고 돌아서는 분들도 많았습니다. 그래서 정부에서 각 판매처의 정보를 [공공데이터포탈]에서 제공을 시작하였습니다.
1. Open API
정부에서 사회기반에 해당하는 데이터를 공공의 목적으로 제공을 하는데... 이는 전자정부체제가 도입되면서 꽤 예전부터 진행된 부분입니다. 예전에 글에서 공공데이터포탈에 대해서 사용법을 한번 다루었었습니다.
2019/12/04 - [SpringBoot] - [Spring Boot] 14. USE other REST API (1)
이번에 제공하기 시작한 공적 마스크 판매정보는 기존과는 다르게 정보를 제공합니다. 예전에는 활용요청을 한 후 개인별 인증키를 통해서 해당 Open API를 사용하게 되는데, 이번에는 그런 개인별 인증키 없이 바로 Rest API URL주소로 바로 JSON데이터를 받을 수 있습니다.
이는 현재 사태의 심각성을 고려하여, 빠른 개발을 위해 중간 과정을 최소화 하고 필요한 사람들에게 자유롭게 기회를 주기 위함이라고 생각이 됩니다. 그럼 공공데이터 포털을 들어가 보겠습니다.
위의 링크를 들어가게되면, 가장 최상단 팝업으로 공적 마스크 판매 정보 제공화면으로 이동할 수 있도록 안내 합니다.
클릭해서 들어가면 바로 사용할 수 있게 해당 API의 정보를 제공해줍니다.
(제공주기) 건강보험심사평가원의 데이터 제공 주기와 한국정보화진흥원의 데이터 가공(좌표 결합 등) 과정을 거치게 되므로 판매처별 정보는 5~10분 정도의 반영시간 차이가 있습니다.
(제공방법) 판매처별 공적마스크 재고 정보는 4단계 구간(100개 이상, 99~30개, 29~2개, 1~0개)으로 구분하여 제공됩니다.
(제공내용) 판매처명, 유형(약국, 우체국, 농협하나로마트), 주소, 입고일시, 재고구간, 생성일시 등
(제공기관) 건강보험심사평가원
이제 해당 API에 대한 정보를 찾았으니, 제공하는 정보와 해당 정보의 JSON형태를 알아보겠습니다.
2. API 기본정보 확인하기
참고문서라고 써있는 MS워드 파일은 확인해보면, 기존 인증을 받고 사용하는 API문서에 비해서 상당히 최소의 정보만 제공합니다. 그 만큼 사태의 심각성을 파악하여, 양질의 데이터를 제공하는데 노력하고 문서에 들이는 시간을 최소화 했다고 생각이 됩니다.
대신 Link URL이라고... 제공하는 부분이 있는데, 바로 이것이 예전에 글을 작성했던 Swagger 입니다. Swagger는 Open API Specification (OAS)를 위한 프레임워크로 이는 Project내 API에 대한 Spec의 자동화 관리할 수 있는 도구입니다. 세부적인 내용은 아래 링크로 확인 해주세요~
2019/11/11 - [SpringBoot] - [Spring Boot] 06. Swagger 구성하기
그럼 [공적 마스크 판매 현황 조회 API]의 Swagger를 확인해 보겠습니다.
총 4가지의 API를 제공하네요.
- stores - 약국, 우체국, 농협 등의 마스크 판매처 정보 제공 (마스크 재고 관련 정보는 제공하지 않음)
- sales - 마스크 재고 상태 등의 판매 정보 제공 (판매처 관련 정보는 제공하지 않음)
- storesByGeo - 중심 좌표를 기준으로 반경 안에 존재하는 판매처 및 재고 상태 등의 판매 정보 제공
- storesByAddr - 주소를 기준으로 해당 구 또는 동내에 존재하는 판매처 및 재고 상태 등의 판매 정보 제공
따라서 이 4가지를 가지고 개발이 가능합니다. 그 중에서 stores로 테스트를 해보겠습니다.
https://8oi9s0nnth.apigw.ntruss.com/corona19-masks/v1/stores/json?page=1&perPage=500
위와 같이 한번에 받아오고자 하는 데이터 수와 페이지 수를 넣어서 보내면 됩니다. 그렇게 되면 아래와 같이 총 500개의 판매처 정보가 따라오게 됩니다.
{
"count": 500,
"page": "1",
"storeInfos": [{
"addr": "충청남도 홍성군 갈산면 상촌로 12-1,",
"code": "34840559",
"lat": 36.6029863,
"lng": 126.5489114,
"name": "신신약국",
"type": "01"
}, {
"addr": "대구광역시 달서구 달구벌대로 1736 1층 (두류동)",
"code": "37844571",
"lat": 35.856678,
"lng": 128.5552778,
"name": "밝은온누리약국",
"type": "01"
}, {
"addr": "충청남도 보령시 남대천로 58 (대천동)",
"code": "34833323",
"lat": 36.3487417,
"lng": 126.5935343,
"name": "지애약국",
"type": "01"
}, {
"addr": "경북 고령군 쌍림면 대가야로 608 ",
"code": 5038300744,
"lat": 35.6791963,
"lng": 128.2422529,
"name": "고령쌍림우체국",
"type": "02"
}, {
"addr": "부산광역시 금정구 서동로 168 송월빌딩 1층 102호 (서동)",
"code": "21839824",
"lat": 35.2144484,
"lng": 129.1047754,
"name": "굿모닝약국",
"type": "01"
}, {
"addr": "경상남도 함양군 함양읍 한들로 143",
"code": "38827077",
"lat": 35.5197038,
"lng": 127.7321179,
"name": "평화약국",
"type": "01"
}, {
"addr": "충청남도 태안군 태안읍 중앙로 33 (한국통신)",
"code": "34831185",
"lat": 36.755742,
"lng": 126.293988,
"name": "이화약국",
"type": "01"
}, {
"addr": "서울특별시 강남구 압구정로 108 1층 7호 (신사동)",
"code": "11889446",
"lat": 37.5228904,
"lng": 127.0206138,
"name": "가로수길약국",
"type": "01"
}, {
"addr": "대구광역시 달성군 화원읍 비슬로 2582",
"code": "37827219",
"lat": 35.8035575,
"lng": 128.4993463,
"name": "화원약국",
"type": "01"
}, {
"addr": "서울특별시 중구 동호로 171 (신당동)",
"code": "11836890",
"lat": 37.5534585,
"lng": 127.0112461,
"name": "다나약국",
"type": "01"
},
이제 사용방법은 알았으니, 이 API를 가지고 본격적인 개발을 시작해 보겠습니다.
-Ayotera Lab-
댓글