본문 바로가기
python

주소 API (Python 예시)

by Redking

웹 개발을 하다 보면 사용자의 주소를 받아보아야 하는 일이 생긴다. 하지만 고객들에게 직접 입력 받다 보면 데이터의 정합성이 깨질 수 있고 잘못된 주소가 입력될 수 있다. 그러므로 행정안전부에서는 개발자들이 사용할 수 있는 주소 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' 카테고리의 다른 글

Django ORM  (0) 2021.12.03
Python 따옴표 어떻게 쓰면 좋을가?  (0) 2021.11.16

댓글