-
법정동코드 조회하기etc 2023. 10. 22. 21:00
법정동코드를 DB로 만들면서 있던 과정을 적어봐요.
먼저 법정동코드 규칙은 10자리 숫자, 시도(2) + 시군구(3) + 읍면동(3) + 리(2) 로 이루어져 있어요.
시작은 오피스텔 매매 실거래 정보를 가져와서 데이터베이스에 저장하고 싶었어요.
저장할 때 법정동코드가 필요한데 오피스텔 매매 실거래 정보 API 응답값에 다른 정보는 존재하지만 법정동코드는 없어요.
https://www.data.go.kr/data/15058452/openapi.do
# response { '거래금액': '14,000', '거래유형': '중개거래', '건축년도': '1989', '년': '2023', '단지': '요진오피스텔쉐레이', '법정동': '구기동', '시군구': '종로구', '월': '10', '일': '8', '전용면적': '31.05', '중개사소재지': '서울종로구', '지번': '110-1', '지역코드': '11110', '층': '5', '해제사유발생일': '', '해제여부': '' }
결국 응답값으로 받아오는 데이터로 법정동코드를 알아내야 해요.
지역코드 + 법정동을 조합하면 될 것 같아요.
외부 라이브러리가 있긴 한데 공식적으로 제공하는 API 가 없네요.
https://www.code.go.kr/stdcode/regCodeL.do
외부 라이브러리가 마음에 안 들어서 테이블을 만들어서 쓰기로 해요.
어쨌든 법정동코드를 조회하기 위한 목적이니 검색이 잘 되어야 해요.
데이터베이스로 MySQL 을 쓰고 있는데 Full-Text index 를 쓰면 괜찮지 않을까 싶어요.
https://dev.mysql.com/doc/refman/8.0/en/innodb-fulltext-index.html
CREATE FULLTEXT INDEX legal_dong_search_idx ON legal_dong (name);
사이트에서 제공하는 파일을 다운로드해서 파싱해서 데이터를 넣어주고 검색해 봐요.
먼저 아래 질의로 로그를 찍어봤는데 잘 되는가 싶다가 몇몇 곳에서 문제가 보여요.
SELECT * FROM legal_dong WHERE MATCH(name) AGAINST('후암동');
검색 실패하는 애들 규칙을 보니까 법정동명이 2글자예요.
제한이 걸려있나 찾아보니 MySQL Full-Text 인덱스는 최소 단어 길이를 갖는다고 해요.
https://dev.mysql.com/doc/refman/8.0/en/fulltext-fine-tuning.html#fulltext-word-length
SHOW VARIABLES LIKE 'innodb_ft_min_token_size';
AWS RDS 에서는 직접 수정을 할 수 없어 파라미터 그룹에 수정하고 적용해 봐요.
AWS RDS Aurora 는 Innodb 만 지원하는데 파라미터 그룹에서 innodb_ft_min_token_size 수정할 수가 없네요.
실패했어요...
결국 다시 돌고 돌아 처음부터 테이블을 만들어요.
테이블 구조를 초기 생각에서 바꾸고 쓰기로 해요.
다운로드한 파일의 값에는 법정동명(name), 법정동코드(code) 뿐인데 검색하기 쉽게 regional_code, smallest_area_name 을 잘라서 넣어줘요.
CREATE TABLE legal_dong ( id BIGINT auto_increment NOT NULL, code CHAR(10) NOT NULL, name varchar(64) NOT NULL, regional_code CHAR(5) NOT NULL, smallest_area_name varchar(32) NOT NULL )
1. 법정동명 + 법정동코드로 검색
SELECT * FROM legal_dong WHERE smallest_area_name = '' and regional_code = ''
2. 법정동명 % 연산자 + 법정동코드로 검색
API 응답값의 법정동 필드에 가끔 (오창읍 각리, 배방읍 장재리) 와 같이 최하지역명이 아니게 올 때가 있는데 이때는 따로 처리해 줘요.
SELECT * FROM legal_dong WHERE name LIKE '%후암동' and regional_code = ''
돌고돌긴 했는데 어쨌든 문제를 해결했어요.
쓰는 기술들이 익숙하지 않아서 삽질이 좀 많았어요.
full-text index 사용하기 전에 좀 더 읽어보고 접근하던가, 처음부터 테이블 구조로 문제를 해결하는 방향으로 생각해 볼걸 그랬어요.
다음에 만나요.
'etc' 카테고리의 다른 글
도로명은 (로, 길)으로 끝나나요? (2) 2023.11.07 csview (0) 2023.10.30 pbcopy (0) 2023.07.07 github commit 메시지 (2) 2023.04.27 Webstorm screen flickering (0) 2023.01.01