remagine

다음 주소 api 만들어 보기 <1> 본문

업무일지

다음 주소 api 만들어 보기 <1>

remagine 2016. 11. 2. 14:08

다음 주소 api를 따라서 만들어보자


최근 정부에서는 공공데이터를 공개적으로 제공하고 있고


이를 통해 독자적인 DB를 구축해서 서비스를 제공할 수 있다.


주소 api 같은 경우 , 회사가 독자적인 DB를 가지고 있다면 유용할 수 있어서


이번에 만들기로 했다. 



1. DB 구축하기


일단 DB제공처는 행정자치부, 우체국 2군대가 있다. 


https://docs.google.com/document/d/1g8qYv1fkfzZsEX0xNHLtVKaiS8QhRiOKOdzcqnNAR-k/edit 에 짧게 분석해보았다. 


같은 검색결과를 보장한다면


더 단순한 구조의 우체국을 선택했다.


2. 우체국 Data 분석하기


 우체국 Data는 전국 17개의 시도별로 txt 파일을 제공한다. 


 제공되는 데이터는 "|" (파이프라인)으로 구분되고 


 Row수는 약 620만개


 업데이트는 1개월마다 실시되면 35만 Row가 변경,삭제,삽입된다.


 지번주소와 도로명 주소가 M:N 맵핑 처리 되지 않아


 동일한 값의 Data가 있는 문제가 있다.





작업내용


1. Data를 받아서 제공되는 api문서, data관련 문서, 주소 표기 규칙을 상세히 숙지했다. 


2. 상기 규칙과 법령에 따라 필요한 컬럼을 구분해 냈다.


3. 테이블을 만들어봤다.




4. 구분해낸 컬럼들을 법령 규칙에 따라 조합하는 쿼리를 만들어 냈다. 



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 SELECT
        ZIPCODE AS 새우편번호 ,
        sido || ' ' || sigungu ||  CASE
            WHEN eupmyun = '' THEN ''
            ELSE ' ' || eupmyun
        END ||' '|| road_name || CASE
            WHEN is_under = '2' THEN ' 공중'
            WHEN is_under = '1' THEN ' 지하'
            ELSE ''
        END ||' '|| building_num1 || CASE
            WHEN building_num2 = 0 THEN ''
            ELSE '-' || building_num2
        END || CASE
            WHEN building_detail = '' THEN ''
            ELSE '(' || building_detail || ')'
        END AS 도로명주소 ,
        sido || ' ' || sigungu || CASE
            WHEN eupmyun = '' THEN CASE WHEN (bub_dong IS NOT NULL ) THEN (' ' || bub_dong || ' ' || JIBUN1 || CASE
                    WHEN JIBUN2 = 0 THEN ''
                    ELSE '-' || JIBUN2
                END) || (CASE
                    WHEN building_detail = '' THEN ''
                    ELSE '(' || building_detail || ')'
                END)
            END
            ELSE (' ' || eupmyun || ' ' || RI || ' ' || JIBUN1 || CASE
                WHEN JIBUN2 = 0 THEN ''
                ELSE '-' || JIBUN2
            END) || CASE
                WHEN building_detail = '' THEN ''
                ELSE '(' || building_detail || ')'
            END
        END AS 지번주소
    FROM
        ZIPCODE
    WHERE
       bub_dong = '합정동'
    ORDER BY
        도로명주소
 
 
cs



더럽다...

'업무일지' 카테고리의 다른 글

하루종일 삽질하기  (0) 2017.08.07
Comments