-
공동주택 공시가격 DB 저장하기Database 2024. 2. 15. 20:01
공동주택 공시가격 조회
준비
공동주택 공시가격을 조회하기 위해 했던 데이터 저장 과정을 남겨요.
간단한 용어 설명과 왜 저장하기로 했는지부터 알아봐요.
특정 공동주택의 특정 연도에 해당하는 공시가격을 조회하는 기능이 필요한데요. 예를 들어, A 아파트 110동 1203호 2020년 공시가격을 조회하고 싶어요.
요구사항에 맞게 제공하는 OpenAPI 가 없었고, 다른 방식으로 서버에서 요청을 보내는 방법은 막혀있어 클라이언트에서 우회해서 조회하고 있었어요.
데이터 텍스트파일은 제공해주고 있었는데 양이 너무 많아서 이걸 저장해도 되나 싶어서 안 하고 있다가, 최근에 다른 일로 데이터를 다시 보는데 저장해도 되겠다 싶은 생각이 들어 진행하기로 했어요.
먼저 공시가격이 무엇인지, 왜 필요한지 간단하게 알아봐요.
용어 설명
저는 종부세 및 재산세 계산을 해야하는데 이때 공시가격이 필요해요.
공시가격은 이렇게 국세 및 지방세의 부과기준으로 쓰여요.
특히 지금 이 포스팅에서 다루고 있는 공동주택 공시가격은 이름 그대로 공동주택에 대하여 공시한 공동주택의 가격을 말해요.
공동주택이라 함은 주택법 제2조 제3호의 규정에 의한 아파트, 연립주택, 다세대주택을 말해요.
여기서 아파트, 연립주택, 다세대주택의 뜻이 모호할 수 있는데요.
위에서 알려준 주택법 제2조 제3호의 규정을 보면 아래와 같이 안내해 줘요.
“공동주택”이란 건축물의 벽ㆍ복도ㆍ계단이나 그 밖의 설비 등의 전부 또는 일부를 공동으로 사용하는 각 세대가 하나의 건축물 안에서 각각 독립된 주거생활을 할 수 있는 구조로 된 주택을 말하며, 그 종류와 범위는 대통령령으로 정한다.
그 종류와 범위는 건축법 시행령에서 찾아볼 수 있고 결론만 보자면 아래와 같이 정리할 수 있어요.- 아파트
- 주택으로 쓰는 층수가 5개 층 이상인 주택
- 연립주택
- 주택으로 쓰는 1개 동의 바닥면적 합계가 660제곱미터 초과, 층수가 4개 층 이하인 주택
- 다세대주택
- 주택으로 쓰는 1개 동의 바닥면적 합계가 660제곱미터 이하, 층수가 4개층 이하인 주택
이 정도면 공동주택 공시가격이 뭔지, 왜 필요한지 어느 정도 알 것 같아요.
이제 데이터를 저장해 봐요.
저장
공시가격 데이터는 여기서 받을 수 있어요.
데이터 사이즈
공시가격 정보 데이터는 위의 형식과 같아요.
데이터 조작 없이 원본 데이터를 넣을 거고 어림잡아서 한 레코드에 어느 정도 데이터 사이즈가 필요한지 알아봐요.
자료타입이 3종류 (char(n), varchar(n), number) 가 있어요.
CHAR(n): n byte
CHAR(1) * 2, CHAR(4) * 3, CHAR(10) * 1
고정적으로 총 24byte 가 필요해요.
INT: 4 byte
고정적으로 총 20byte 가 필요해요.
VARCHAR(n): n byte + (1 or 2) byte
(1 or 2) byte 는 length prefix plus data 를 뜻해요.
고정 44byte, 유동적인 varchar 는 160byte 정도로 어림잡아 하나의 레코드는 200byte 가 필요하다고 계산해요.
2006년부터 2023년까지의 데이터는 대략 2억 건이에요.
그러면 2억 * 200byte 로 약 37기가 필요한 걸 알 수 있어요.#!/bin/bash set -e cd /Users/subin.lee/Desktop/data/부동산/공동주택_공시가격 tot=0 for file in *.csv do lc=$(cat "$file" | wc -l) tot=$((tot + lc)) done echo "total lc: $tot" # total lc: 209658858
UTF-8 encoding
#!/bin/bash set -e cd /Users/subin.lee/Desktop/data/부동산/공동주택_공시가격 for file in *.csv do year=$(echo $file | cut -d' ' -f 1) iconv -f cp949 -t UTF-8 "$file" > "data/${year}.csv" done
- 텍스트가 깨져서 다운로드한 파일들을 UTF-8 로 변환해 줘요.
- 명세서에는 EUC-KR 로 인코딩 되어 있다고 하지만 EUC-KR 는 실패하고 CP949 를 사용해야 해요.
LOAD DATA
- 준비한 csv 파일들을 table 에 저장해요.
- 대용량 데이터여서 LOAD DATA Statement 를 사용할게요.
설정:- https://dev.mysql.com/doc/refman/8.0/en/load-data-local-security.html
- 서버
- 저는 homebrew 로 설치해서 /opt/homebrew/etc 에서 my.cnf 파일을 수정할 수 있어요.
- 클라이언트
- 실행할 때 --local-infile=1 옵션을 추가해요.
# my.cnf local-infile=1
#!/bin/bash set -e DATABASE=kingsubin USERNAME=kingsubin PASSWORD='kingsubin' TABLE=kingsubin cd /Users/subin.lee/Desktop/data/부동산/공동주택_공시가격/data for FILE in *.csv do echo "Processing $FILE file..." mysql --local-infile=1 -u $USERNAME -p"$PASSWORD" $DATABASE -e " LOAD DATA LOCAL INFILE '"$FILE"' INTO TABLE $TABLE FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\n' IGNORE 1 ROWS (기준연도,기준월,법정동코드,도로명주소,시도,시군구,읍면,동리,특수지코드,본번,부번,특수지명,단지명,동명,호명,전용면적,공시가격,단지코드,동코드,호코드);" done
끝
- 전부 저장하고 사이즈를 측정해 보니 38GB(따로 bigint type 의 id 도 포함되어 있어요.) 정도 나오고 충분히 저장할만 한 것 같아요.
- 다 적고 보니까 별거 아닌 일을 의식의 흐름대로 너무 자세하게 적은것 같은데 자주 하는일이 아니라 제가 다음에 봐야할 것 같아요.
'Database' 카테고리의 다른 글
MongoDB Atlas Search (2) 2024.05.01 mysql whitespace to null (0) 2024.02.14 MySQL wait_timeout (0) 2023.10.27 PostgreSQL collate 한글 컬럼 정렬 (2) 2023.04.04 PostgreSQL Index (2) 2023.02.26 - 아파트