공동주택 공시가격 DB 저장하기

2024. 2. 15. 20:01Database

공동주택 공시가격 조회

 

준비

공동주택 공시가격을 조회하기 위해 했던 데이터 저장 과정을 남겨요.
간단한 용어 설명과 왜 저장하기로 했는지부터 알아봐요.
 
특정 공동주택의 특정 연도에 해당하는 공시가격을 조회하는 기능이 필요한데요. 예를 들어, 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 

 
설정:

# 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' 카테고리의 다른 글

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
JOIN  (0) 2020.07.28