법정동코드 조회하기

2023. 10. 22. 21:00etc

법정동코드를 DB로 만들면서 있던 과정을 적어봐요.

 

먼저 법정동코드 규칙은 10자리 숫자, 시도(2) + 시군구(3) + 읍면동(3) + 리(2) 로 이루어져 있어요.

 

시작은 오피스텔 매매 실거래 정보를 가져와서 데이터베이스에 저장하고 싶었어요.

저장할 때 법정동코드가 필요한데 오피스텔 매매 실거래 정보 API 응답값에 다른 정보는 존재하지만 법정동코드는 없어요.

https://www.data.go.kr/data/15058452/openapi.do

 

국토교통부_오피스텔 매매 신고 조회 서비스

부동산 거래신고에 관한 법률에 따라 신고된 주택의 실거래 자료를 제공

www.data.go.kr

# response
{
    '거래금액': '14,000',
    '거래유형': '중개거래',
    '건축년도': '1989',
    '년': '2023',
    '단지': '요진오피스텔쉐레이',
    '법정동': '구기동',
    '시군구': '종로구',
    '월': '10',
    '일': '8',
    '전용면적': '31.05',
    '중개사소재지': '서울종로구',
    '지번': '110-1',
    '지역코드': '11110',
    '층': '5',
    '해제사유발생일': '',
    '해제여부': ''
}

 

 

결국 응답값으로 받아오는 데이터로 법정동코드를 알아내야 해요.

지역코드 + 법정동을 조합하면 될 것 같아요.

 

외부 라이브러리가 있긴 한데 공식적으로 제공하는 API 가 없네요.

https://www.code.go.kr/stdcode/regCodeL.do

 

법정동코드목록조회 - 행정표준코드관리시스템

정상적으로 로그아웃하지 않았거나, 동일 사용자가 로그인한 상태입니다. 강제로 로그인 하시겠습니까? (강제 로그인 시 다시 로그인을 하셔야 합니다.)

www.code.go.kr

 

외부 라이브러리가 마음에 안 들어서 테이블을 만들어서 쓰기로 해요.

어쨌든 법정동코드를 조회하기 위한 목적이니 검색이 잘 되어야 해요.

데이터베이스로 MySQL 을 쓰고 있는데 Full-Text index 를 쓰면 괜찮지 않을까 싶어요.

https://dev.mysql.com/doc/refman/8.0/en/innodb-fulltext-index.html

 

MySQL :: MySQL 8.0 Reference Manual :: 15.6.2.4 InnoDB Full-Text Indexes

15.6.2.4 InnoDB Full-Text Indexes Full-text indexes are created on text-based columns (CHAR, VARCHAR, or TEXT columns) to speed up queries and DML operations on data contained within those columns. A full-text index is defined as part of a CREATE TABLE st

dev.mysql.com

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

 

MySQL :: MySQL 8.0 Reference Manual :: 12.9.6 Fine-Tuning MySQL Full-Text Search

12.9.6 Fine-Tuning MySQL Full-Text Search MySQL's full-text search capability has few user-tunable parameters. You can exert more control over full-text searching behavior if you have a MySQL source distribution because some changes require source code mo

dev.mysql.com

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