ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 공동주택 공시가격 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 

     
    설정:

    # 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
킹수빈닷컴