시작하기 전에
아래의 내용은 제가 3월 11일부터 3월 17까지 라이브 코로나 맵 기술 자원봉사를 하면서 느낀 점을 담은 글입니다.
BGM = Taylor Swift - Call It What You Want
들으면서 보시면... 더 잘 읽히지 않을까요?
어쩌다?
여느 때처럼 솔룩스 온라인 회의를 끝내고 임원진들과 잡담을 하는데, 회장 친구가 나에게 자신이 소속된 라이브 코로나 맵
개발 팀에서 자원봉사자 3기를 모집 중이라고 전해주었다. 그간 조금씩 열심히 쌓아온 실력을 테스트할 기회라고 생각하여 바로 대표님께 페이스북 메세지를 보냈고, 그 다음 날 바로 3기 자원봉사자로 참여하게 되었다. 내가 짠 코드가 좋은 일에 쓰인다니... 이것만큼 좋은 일이 어디 있겠는가.
여긴 누구고 나는 어디인가
그렇다. 나는 들어가자마자 큰 혼란에 빠졌다. 코딩을 시작한 이후로 다른 프로그래머들과 디자이너와 기획자와 협업하는 게 처음이었던 나는 머릿속이 새하얘졌다. 게다가 내 역할이 제대로 명시되지 않은 채로 코드를 읽고 부족한 부분을 스스로 찾아 기여하는 것은 참 막막했다. 설상가상으로 대학에 온지도 얼마 되지 않아 나와 나이 차이가 많이 나는 사람들을 만날 기회가 거의 없었는데, 고등학생부터 회사 대표까지 넓은 나이 스펙트럼의 사람들과 협업해야 한다니. 슬슬 무서워지기 시작했다.
카카오톡 단톡방에 모인 다른 3기 자원봉사자들께서는 다들 슬슬 자신의 역할을 찾아가시길래, 나도 우선 내 역할을 정해야겠다는 생각이 들었지만 우선 이 사이트가 어떻게 돌아가는지 알아야겠다는 생각에 github에 들어가서 코드부터 읽기 시작했다.
웹 쪽으로는 아는 것이 없으니 html과 css 코드는 과감하게 생각하고, 데이터를 긁어오는 python 코드를 유심히 살펴보았다. 질병관리본부와 존스홉킨스의 웹사이트에서 각각 국내/해외 감염자 현황을 긁어오고 있었다. 눈에 띄었던 것은 크롤러를 사용하지 않고 수기로 입력된 데이터가 있었다는 것이다. 국내/해외 총 감염자 현황과 제주도로 들어오는 입도객 등은 수기로 입력되고 있었다. '이 부분을 좀 손볼까?' 하는 생각에 파이참을 켜고 from bs4... 를 적는 순간 데이터 위에 쓰여진 주석을 보았다. 민감한 데이터니 크롤링하지 않고 수기로 입력해야 한다고??
(봉사 6일차... 지금은 크롤러로 긁어오도록 바뀌었다.)
결국 나는 무엇을 했는가
마음을 접은 나는 다른 일들을 알아보던 중 전국의 의료기관의 정보를 찾아보았다. 공공데이터포털 사이트에서 전국의 보건의료기관, 국민안심병원, 선별진료소 현황을 볼 수 있었다. 각 기관별로 지역, 시군구, 주소, 구분, 전화번호 등 대부분의 정보가 기록되어 있었는데, 문제는 이것을 지도상에 표현하기 위해서는 경도, 위도 정보가 필요하다는 것이다. 눈에 불을 켜고 할 일을 찾고 있던 나는 속으로 "아싸" 를 외치며 전국 보건소, 국민안심병원, 선별진료소 공공데이터에 위도, 경보를 추가하여 지도 상에 표시가 가능하도록 하자고 결심했다.
양이 워낙 많은지라, 팀을 모아 세 명이서 각 데이터를 나누어 정보를 추가하기로 했다. 나는 선별진료소 전체와 보건소 3488개 중 1999개를 맡았고, 바로 작업을 시작했다.
구글 맵스에 주소 검색 -> 경도 위도 정보 get 하는 과정을 자동화하는 매크로를 만들어볼까 하다가 왠지 관련된 API가 존재할 것 같아 검색해 보았고, 역시나 네이버 클라우드 플랫폼에서 주소를 입력하면 좌표를 포함한 상세정보를 제공하는 Geocoding API를 제공하고 있었다. 게다가 월 300만 회 무료!
총 변환할 데이터가 3000개도 되지 않았기 때문에 API를 사용하는 데 전혀 문제될 것이 없었던 나는 바로 코드를 짜기 시작했다.
import urllib.request
import urllib.parse
import json
# 본인의 Application key 값을 입력해 줍니다.
client_id = "" # your client id
client_secret = "" # your client secret
# 주소 정보를 포함한 json 파일을 불러옵니다.
with open("selective_clinic.json", "r", encoding='UTF-8') as f:
data = json.load(f)
for d in data:
url = "https://naveropenapi.apigw.ntruss.com/map-geocode/v2/geocode"
query = "?query=" + urllib.parse.quote(d["주소 "]) # d의 key value로 주소가 담긴 key를 넘겨줍니다.
url_query = url + query
# Open API 검색 요청 개체 설정, 네이버 개발자센터의 정책 때문에 꼭 추가해야 합니다.
request = urllib.request.Request(url_query)
request.add_header("X-NCP-APIGW-API-KEY-ID", client_id)
request.add_header("X-NCP-APIGW-API-KEY", client_secret)
# 검색 요청 및 처리
response = urllib.request.urlopen(request)
res_code = response.getcode()
if res_code == 200:
# 정상적으로 실행된 경우
response_json = json.loads(response.read())
d['x'] = response_json["addresses"][0]["x"]
d['y'] = response_json["addresses"][0]["y"]
else:
# 에러가 발생한 경우
print("An error has occurred; error code:", res_code)
# 위도, 경도 정보를 추가한 새로운 data 파일 저장
print(json.dumps(data, indent="\t", ensure_ascii=False))
with open('selective_clinic_with_x_y.json', 'w', encoding='utf-8') as make_file:
make_file.write(json.dumps(data, indent='\t', ensure_ascii=False))
생각보다 엄청 간단한 코드다. 작년 여름방학 때 뭐라도 만들어 보자며 수강했던 인프런의 크롤링 강의가 큰 도움이 되었다(크롤링 강의였지만 API 사용 방법도 가르쳐 주셨다). 반환되는 JSON 양식에 맞춰 어느 item을 가져올 지만 주의하면 된다. 아주 잘 돌아가는 코드를 보니 오랜만에 흐뭇한 미소가 지어졌다. 항목이 300개 정도 되는 선별진료소 json 파일은 약 5분 정도 소요되었고, 1999개짜리 보건소 json 파일은 밥 먹고 왔더니 다 돌아져 있었다.
완성된 json 파일을 팀 notion에 올리고, 의기양양하게 단톡방에 상황을 보고했다. 여러 분께서 수고하셨다며 귀여운 이모티콘들을 보내시는데, 내 코드가 누군가에게 도움이 될 거라는 생각에 가슴이 뭉클해졌다. 데이터 분석을 전담하신 어느 분께서는 우리나라의 의료 현황에 대해서 중요한 데이터셋이 될 거라고 말씀해 주셨는데, 그 말이 앞으로의 나에게 큰 원동력이 될 것 같다. 나같은 조무래기도 세상에 도움이 될 수 있구나!(지금은 공공데이터포털에서 api로 각 의료기관의 위도, 경도 정보를 제공해 주더라 ㅠㅠ)
대표님의 허락을 맡고 LiveCoronaDetector github에 데이터를 push했다. 내가 처음으로 남의 repository에 push를 하는 순간이었다!
(브랜치를 파서 pull request를 날리는 방법도 고려했는데, 모든 봉사자 분들이 master branch에 바로 commit, push를 하셔서 나도 그렇게 했다...)
중간 평가
봉사활동에 속도를 붙이기 시작하려는 순간, 개강당해버렸다. 전공 + 전공 관련 수업이 5개라 시간을 잘 낼 수 있을지 모르겠다. 그래도 한 번 시작한 거 제대로 해내고 싶은데 말이다. 그래서 지금 4일치 강의를 2일만에 몰아 들으려고 하고 있는데... 잘 모르겠다. 일단 열심히 하자.
'끄적' 카테고리의 다른 글
ICPC Sinchon 활동 회고 (1) (6) | 2021.04.03 |
---|---|
[회고] 유난히 힘들었던 2학년 2학기 되돌아보기 (3) | 2021.01.24 |
[회고]뒤늦게 2학년 1학기를 되돌아보며 (2) | 2020.10.19 |
test (0) | 2020.09.06 |
(긴글주의) 좌충우돌 Mazassumnida 개발기 (7) | 2020.09.01 |