웹 개발을 하다 보면 사용자의 주소를 받아보아야 하는 일이 생긴다. 하지만 고객들에게 직접 입력 받다 보면 데이터의 정합성이 깨질 수 있고 잘못된 주소가 입력될 수 있다. 그러므로 행정안전부에서는 개발자들이 사용할 수 있는 주소 API를 공개했다. 직접 주소 API를 개발하지 못하는 이유는 주소는 생길 수도 있고 없어질 수도 있으므로 유지보수 측면에서 어렵다는 점이 있지만 행정안전부에서 DB를 제공하고 있으므로 구현이 불가능하지는 않다.
이 글에서는 행정안전부에서 제공한 도로명 주소 검색 API를 먼저 다루고 이를 어떻게 구현해야 하는지 이어서 작성할 예정이다.
API의 서비스 개요
- 다양한 시스템 환경 적용 가능
- 개발언어, 플랫폼 제약없음
- DB 구축 및 현행화에 대한 부담 없음
- 실시간 주소 검색 가능
- 신청 즉시 이용 가능
- 각 서비스당 1개의 승인키 부여
검색 기능 소개
https://www.juso.go.kr/addrlink/addrLinkApi.do?currentPage=1&countPerPage=10 &keyword=**인천 남구 주안동 125&confmKey=승인키&hstryYn=Y
위에 작성된 링크는 API의 기본적인 사용방법이다.
https://www.juso.go.kr/addrlink/addrLinkApi.do** 주소에 변수를 파라미터로 넣어 요청을 보내면 결과를 XML 또는 JSON 포맷으로 넘겨 받을 수 있으며 경우에 따라 에러가 발생해 에러 코드를 받아야 할 때도 있다.
응답 결과 (JSON)
{
"results": {
"common": {
"totalCount": "1",
"currentPage": "1",
"countPerPage": "10",
"errorCode": "0",
"errorMessage": "정상"
},
"juso": [
{
"roadAddr": "서울특별시 마포구 성암로 301 (상암동)",
"roadAddrPart1": "서울특별시 마포구 성암로 301",
"roadAddrPart2": "(상암동)",
"jibunAddr": "서울특별시 마포구 상암동 1595 한국지역정보개발원(KLID Tower)",
"engAddr": "301, Seongam-ro, Mapo-gu, Seoul",
"zipNo": "03923",
"admCd": "1144012700",
"rnMgtSn": "114403113012",
"bdMgtSn": "1144012700115950000000001",
"detBdNmList": "",
"bdNm": "한국지역정보개발원(KLID Tower)",
"bdKdcd": "0",
"siNm": "서울특별시",
"sggNm": "마포구",
"emdNm": "상암동",
"liNm": "",
"rn": "성암로",
"udrtYn": "0",
"buldMnnm": "301",
"buldSlno": "0",
"mtYn": "0",
"lnbrMnnm": "1595",
"lnbrSlno": "0",
"emdNo": "03"
}
]
}
}
```
응답 결과 (XML)
<?xml version="1.0" encoding="UTF-8"?>
<results>
<common>
<totalCount>1</totalCount>
<currentPage>1</currentPage>
<countPerPage>10</countPerPage>
<errorCode>0</errorCode>
<errorMessage>정상</errorMessage>
</common>
<juso>
<roadAddr>서울특별시 마포구 성암로 301 (상암동)roadAddr> <roadAddrPart1>서울특별시 마포구 성암로 301</roadAddrPart1>
<roadAddrPart2>(상암동)</roadAddrPart2>
<jibunAddr>서울특별시 마포구 상암동 1595 한국지역정보개발원(KLID Tower)
</jibunAddr>
<engAddr>301, Seongam-ro, Mapo-gu, Seoul</engAddr>
<zipNo>03923</zipNo>
<admCd>1144012700</admCd>
<rnMgtSn>14403113012</rnMgtSn>
<bdMgtSn>1144012700115950000000001</bdMgtSn>
<detBdNmList></ detBdNmList>
<bdNm>한국지역정보개발원(KLID Tower)</bdNm>
<bdKdcd>0</bdKdcd>
<siNm>서울특별시</siNm>
<sggNm>마포구</sggNm>
<emdNm>상암동</emdNm>
<liNm></liNm>
<rn>성암로</rn>
<udrtYn>0</udrtYn>
<buldMnnm>301</buldMnnm>
<buldSlno>0</buldSlno>
<mtYn>0</mtYn>
<lnbrMnnm>1595</lnbrMnnm>
<lnbrSlno>0</lnbrSlno>
<emdNo>03</emdNo>
</juso>
</results>
Simple Example Code (Python)
def address_api(keyword, count_per_page, current_page, **kwargs): # 필수 값 3가지를 인자로 넘김
urls = 'http://www.juso.go.kr/addrlink/addrLinkApi.do'
confmKey = '행정안전부에서 넘겨주는 승인키' # 필수 값 승인키
params = {
'keyword': keyword,
'countPerPage': count_per_page,
'currentPage': current_page,
'confmKey': confmKey,
}
if kwargs: # 필수 값이 아닌 변수를 params에 추가
for key, value in kwargs.items():
params[key] = value
params_str = urllib.parse.urlencode(params) # dict를 파라미터에 맞는 포맷으로 변경
url = '{}?{}'.format(urls, params_str)
response = urllib.request.urlopen(url) # Request 객체로 urlopen을 호출하면 요청된 URL에 대한 응답 객체를 반환
result_xml = response.read().decode('utf-8') # response를 읽고 utf-8로 변형
return HttpResponse(result_xml, content_type='application/xhtml+xml') # xml로 조회
'python' 카테고리의 다른 글
FCO 수수료 계산 코드 (3) | 2024.10.08 |
---|---|
Django ORM (0) | 2021.12.03 |
Python 따옴표 어떻게 쓰면 좋을가? (0) | 2021.11.16 |
댓글