Programmings

Google Clound & WSL2 Ubuntu 20.04 개발환경 설정

개요

  • GCP에서 개발환경을 설정하도록 한다.
  • Local PC에서 GCP로 접속을 하도록 한다.

사전준비

  • WSL2 Ubuntu 설치 과정은 여기에서 다루지 않는다.

Untitled

개발환경 설치

  • Python3 설치한다. (본인에게 맞는 언어를 선택한다)
sudo apt update
sudo apt install -y python3 python3-pip
python3

최신 버전(417.0.1) gcloud CLI 설치

$ sudo apt-get install apt-transport-https ca-certificates gnupg
  • 패키지 소스로 gcloud CLI 배포 URI를 추가합니다. 배포판에서 서명 옵션을 지원하는 경우 다음 명령어를 실행합니다.
$ echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list
  • Google Cloud 공개 키를 가져옵니다. 배포판의 apt-key 명령어가 --keyring 인수를 지원하는 경우 다음 명령어를 실행합니다.
$ curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key --keyring /usr/share/keyrings/cloud.google.gpg add -
  • gcloud CLI를 업데이트하고 설치합니다.
$ sudo apt-get update && sudo apt-get install google-cloud-cli

Shell 재시작 후 설치 확인

  • 다음 명령어를 통해 설치가 정상적으로 되었는지 확인한다.
$ exec -l $SHELL
$ gcloud version
Google Cloud SDK 419.0.0
alpha 2023.02.17
beta 2023.02.17
bq 2.0.85
bundled-python3-unix 3.9.16
core 2023.02.17
gcloud-crc32c 1.0.0
gsutil 5.20

시작하기

  • 시작하려면 [gcloud init](https://cloud.google.com/sdk/gcloud/reference/init?hl=ko)을 실행합니다.
$ gcloud init
Welcome! This command will take you through the configuration of gcloud.

Your current configuration has been set to: [default]

You can skip diagnostics next time by using the following flag:
  gcloud init --skip-diagnostics

Network diagnostic detects and fixes local network connection issues.
Checking network connection...done.                                                                      
Reachability Check passed.
Network diagnostic passed (1/1 checks passed).

You must log in to continue. Would you like to log in (Y/n)?  Y

Go to the following link in your browser:

    https://accounts.google.com/o/oauth2/auth?response_type=...

Enter authorization code: your_code
You are logged in as: [your_email@gmail.com].

Pick cloud project to use: 
 [1] Enter a project ID
 ...
 [2] Create a new project
Please enter numeric choice or text value (must exactly match list item):  

Your current project has been set to: [your_project_name].

...

Some things to try next:

* Run `gcloud --help` to see the Cloud Platform services you can interact with. And run `gcloud help COMMAND` to get help on any gcloud command.
* Run `gcloud topic --help` to learn about advanced features of the SDK like arg files and output formatting
* Run `gcloud cheat-sheet` to see a roster of go-to `gcloud` commands.

WM 설정

  • 아래 화면에서 VM을 선택한다.

Untitled

Matplotlib 한글폰트 적용 예제 - Windows 10

강의소개

  • 인프런에서 Streamlit 관련 강의를 진행하고 있습니다.
  • 인프런 : https://inf.run/YPniH

개요

  • 한글폰트를 다운로드 받아서 matplotlib에 적용하는 코드를 작성해본다.
  • 주요 코드를 기억해서 업무에 활용해보도록 한다.

폰트 다운로드

Untitled

  • 스크롤을 내리면 TTF 다운로드 버튼을 클릭한다.

Untitled

폰트 설치

  • 다운로드 받은 폰트를 압축을 푼다.

Untitled

가계금융복지조사 데이터 수집

개요

  • 통계청(https://mdis.kostat.go.kr/) 에서는 마이크로데이터를 제공하고 있음
  • 해당 사이트에서 회원가입은 필수로 진행해야 한다.

MDIS 다운로드 서비스 이용

  • 2022년 기준 가계금융복지조사 데이터를 다운로드 받는다.
  • 다운로드 서비스/소득소비자산/가계금융복지조사/가구마스터(제공)/2022년도를 아래와 같이 순차적으로 클릭한다.

Untitled

Untitled

Untitled

  • 다운로드받을 데이터의 형태와 해당 데이터를 입수할 때 필요한 ‘통계 툴 읽기 스크립트’를 선택한다.
  • Python 스크립트는 제공하지 않아서, R로 선택을 한다.

Untitled

Untitled

Untitled

  • 위 그림에서 마이페이지를 클릭한다.

Untitled

Untitled

Docker Streamlit Sample

개요

  • 도커를 활용하여 Streamlit 배포를 진행해본다.
  • Dockerfile의 의미에 대해 이해한다.

Dockerfile

  • Docker 이미지를 빌드하기 위한 일련의 명령어를 포함하는 텍스트 파일
  • 컨테이너에서 애플리케이션이 실행될 때 필요한 환경과 종속성을 정의하는 방법을 제공
  • 패키지 설치, 파일 복사 및 환경 변수 설정 등의 지시어가 포함

사전준비

소스코드 예제

  • 소스코드는 크게 아래와 같이 작성했다.
  • 먼저 app.py는 아래와 같다.
import numpy as np 
import pandas as pd 
import matplotlib 
import sklearn 
import scipy
import plotly
import streamlit as st

def main():
    st.write(np.__version__)
    st.write(pd.__version__)
    st.write(matplotlib.__version__)
    st.write(sklearn.__version__)
    st.write(scipy.__version__)
    st.write(plotly.__version__)

if __name__ == "__main__":
    main()
  • 그 다음은 requirements.txt 파일을 작성한다.
streamlit
numpy
scipy
pandas
matplotlib
plotly
scikit-learn
  • 작성된 코드가 잘 실행되는지 로컬호스트에서 확인을 한다.
$ streamlit run app.py 

  You can now view your Streamlit app in your browser.

  Local URL: http://localhost:8501
  Network URL: http://192.168.0.49:8501

Untitled

Docker 기본 문법

무작정 도커 시작하기

  • dockerUbuntu를 설치하고 실행해본다.
  • 현재 파일 목록들을 살펴본다.
  • 빠져 나올 때는 EXIT를 실행한다.
C:\Users\human>docker run -it ubuntu:18.04
Unable to find image 'ubuntu:18.04' locally
18.04: Pulling from library/ubuntu
72d9f18d70f3: Pull complete
Digest: sha256:a3765b4d74747b5e9bdd03205b3fbc4fa19a02781c185f97f24c8f4f84ed7bbf
Status: Downloaded newer image for ubuntu:18.04
root@7a7a49e2d83e:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@7a7a49e2d83e:/#
  • 현재 도커 컨테이너 리스트를 확인한다.
$ docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED        STATUS         PORTS     NAMES
7a7a49e2d83e   ubuntu:18.04   "/bin/bash"   18 hours ago   Up 5 minutes             practical_euler
  • STATUS가 Docker 컨테이너 재진입
docker exec -it 7a7a49e2d83e /bin/bash
  • 현재 운영중인 도커를 멈추고 싶다면 아래와 같이 작성한다.
docker stop 7a7a49e2d83e
  • 재활성화 하고 싶다면 아래와 같이 작업한다.
docker start 7a7a49e2d83e

컨테이너 이미지화

$ docker login -u your_id
Password:
Login Succeeded
Authenticating with existing credentials...
Login Succeeded

Logging in with your password grants your terminal complete access to your account.
For better security, log in with a limited-privilege personal access token. Learn more at https://docs.docker.com/go/access-tokens/
  • 기존 컨테이너 ID 7a7a49e2d83e를 이미지로 변환한다.
    • 새로운 Repository 이름은 mlearn 이라고 한다.
    • 태그 이름은 latest 라고 한다.
docker commit 7a7a49e2d83e your_id/mlearn:latest
  • 도커 이미지가 만들어졌는지 확인한다.
  • ubuntu 이미지를 다운받았기 때문에 size가 비슷한 것을 확인할 수 있다.
$ docker images
REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
your_id/mlearn    latest    b26bdf7b071e   29 minutes ago   63.1MB
ubuntu            18.04     5d2df19066ac   2 weeks ago      63.1MB
hello-world       latest    feb5d9fea6a5   16 months ago    13.3kB
  • 도커 이미지를 push 하도록 한다.
docker push your_id/mlearn:latest

호스트 OS의 홈 폴더 마운트하기

  • 호스트 OS의 홈 폴더를 마운트 하기 위해서는 컨테이너 실행 시 -v 옵션을 지정한다.
    • : 기준으로 왼쪽은 로컬 PC, 오른쪽은 가상환경 내 경로임을 잊지 말자.
$ docker run -it -v C:\Users\human\Desktop\dockerhome:/home mlearn
  • home 폴더에서 temp 폴더를 생성하면 아래와 같이 폴더가 만들어지는 것을 확인한다.
root@5c950356cfc3:/# cd home/
root@5c950356cfc3:/home# mkdir temp

Untitled

Git 배치파일 Windows

개요

배치파일 생성하기

  • 프로젝트 폴더에 배치파일을 실행한다.
  • 파일명은 submit.bat 로 지정했다.
set root=C:\Users\human\Desktop\streamlit-predictions
call git add .
call git commit -m "updated from batch file"
call git push

배치파일 실행하기

  • 우선 해당 폴더에서 submit.bat 파일을 더블클릭한다.

Untitled

  • 더블 클릭하면 자동으로 배치파일이 실행되면서 해당 명령어들이 순차적으로 돌아가는 것을 확인할 수 있다.

Untitled

Streamlit & ChatGPT API 배포 예제

강의소개

  • 인프런에서 Streamlit 관련 강의를 진행하고 있습니다.
  • 인프런 : https://inf.run/YPniH

개요

API Key 생성

  • 아래 화면에서 View API Keys를 클릭한다.

Untitled

  • 아래 화면에서 Create new secret key 버튼을 클릭한다.

Untitled

지도시각화 예제 - QGIS를 활용한 geojson 파일 만들기

강의소개

  • 인프런에서 Streamlit 관련 강의를 진행하고 있습니다.
  • 인프런 : https://inf.run/YPniH

Installation

  • Map 시각화를 위한 주요 라이브러리를 설치한다.
pip install numpy pandas matplotlib seaborn jupyterlab geopandas pydeck

Enabling pydeck for Jupyter

  • Jupyter는 더 복잡한 서버/클라이언트 상호 작용을 허용할 수 있다.
  • 사용자 또는 시스템 관리자가 주피터에서 사용할 수 있도록 pydeck를 사용하도록 설정해야 한다.
  • 바이너리 데이터 전송, 데이터 선택 및 시간 경과에 따른 데이터 업데이트는 파이덱이 주피터 환경에서 사용 가능한 경우에만 대화식으로 작동할 수 있다.
  • Jupyter 노트북의 Pydeck를 활성화하려면:
$ jupyter nbextension install --sys-prefix --symlink --overwrite --py pydeckInstalling your_url -> pydeckRemoving: your_urlSymlinking:your_url -> your_url- Validating: ok    To initialize this nbextension in the browser every time the notebook (or other app) loads:          jupyter nbextension enable pydeck --py --sys-prefix
jupyter nbextension enable --sys-prefix --py pydeck
Enabling notebook extension pydeck/extensionRequires...
      - Validating: ok

법정동 병합 데이터 만들기

QGIS 설치

  • 설치는 다음과 같다.

Untitled

Streamlit 라이브러리를 활용한 배포 예제 - sqlite

강의소개

  • 인프런에서 Streamlit 관련 강의를 진행하고 있습니다.
  • 인프런 : https://inf.run/YPniH

개요

  • 간단한 프로젝트라도 DB와 연동하는 작업은 매우 중요하다.
  • 클라우드 DB를 사용하기 위해서는 클라우드 회원가입 등 번거로운 절차를 거쳐야 하며, 또한 비용도 추가될 수도 있다.
  • SQLite를 사용하면 간단한 DB 작업도 진행할 수 있다.
  • Streamlit + SQLite 연동 작업을 간단히 하도록 해본다.

SQLite

  • 데이터 핸들링을 하기 위해서는 Python 기초 문법, Pandas 라이브러리를 배워야 한다.
  • Pandas는 본 블로그에서 CSV 파일을 읽고 저장을 하는데 사용을 하게 된다.
  • SQLite는 입문자가 시작할 수 있는 가장 간단한 DB이다.
  • 개별 PC에 로컬 파일을 생성하며, 이 파일에 대해 PostgresDB와 거의 동일한 쿼리를 실행할 수 있습니다.
  • 웹싸이트 : https://sqlite.org/index.html

Streamlit

  • Python으로 웹을 가장 빠르게 만드는 방법은 Streamlit 이다.
  • 다중 페이지 등을 제작할 수 있는 방법론이 나오기도 했다.
  • 가장 좋은 장점은 SQLite를 사용할 수 있다는 점이다.

Streamlit Code

  • 우선 전체 코드를 작성하도록 한다.
import sqlite3
import streamlit as st
import pandas as pd
import os

def create_connection(db_file):
    """ create a database connection to the SQLite database
        specified by the db_file
    :param db_file: database file
    :return: Connection object or None
    """
    conn = None
    try:
        conn = sqlite3.connect(db_file)
    except Exception as e:
        st.write(e)

    return conn

def create_database():
    st.markdown("# Create Database")

    st.write("""A database in SQLite is just a file on same server. 
    By convention their names always end in .db""")

    db_filename = st.text_input("DB Filename")
    create_db = st.button('Create Database')

    if create_db:
        if db_filename.endswith('.db'):
            conn = create_connection(db_filename)
            st.write(conn) # success message?
        else: 
            st.write('DB filename must end with .db, please retry.')

def upload_data():
    st.markdown("# Upload Data")
    # https://discuss.streamlit.io/t/uploading-csv-and-excel-files/10866/2
    sqlite_dbs = [file for file in os.listdir('.') if file.endswith('.db')]
    db_filename = st.selectbox('DB Filename', sqlite_dbs)
    table_name = st.text_input('Table Name to Insert')
    conn = create_connection(db_filename)
    uploaded_file = st.file_uploader('Choose a file')
    if uploaded_file is not None:
        #read csv
        try:
            df = pd.read_csv(uploaded_file)
            df.to_sql(name=table_name, con=conn)
            st.write('Data uploaded successfully. These are the first 5 rows.')
            st.dataframe(df.head(5))

        except Exception as e:
            st.write(e)

def run_query():
    st.markdown("# Run Query")
    sqlite_dbs = [file for file in os.listdir('.') if file.endswith('.db')]
    db_filename = st.selectbox('DB Filename', sqlite_dbs)

    query = st.text_area("SQL Query", height=100)
    conn = create_connection(db_filename)

    submitted = st.button('Run Query')

    if submitted:
        try:
            query = conn.execute(query)
            cols = [column[0] for column in query.description]
            results_df= pd.DataFrame.from_records(
                data = query.fetchall(), 
                columns = cols
            )
            st.dataframe(results_df)
        except Exception as e:
            st.write(e)

    st.sidebar.markdown("# Run Query")

page_names_to_funcs = {
    "Create Database": create_database,
    "Upload Data": upload_data,
    "Run Query": run_query,
}

selected_page = st.sidebar.selectbox("Select a page", page_names_to_funcs.keys())
page_names_to_funcs[selected_page]()

코드 설명 1 - Python Packages

  • 코드는 다음과 같다.
import sqlite3
import streamlit as st
import pandas as pd
import os
  • sqlite3os는 Python의 내장 패키지이며 별도로 설치할 필요가 없다.
  • pandasstreamlit 라이브러리는 pip install ~ 로 설치를 해야 한다.

코드 설명 2 - create_connection(db_file)

  • 코드는 다음과 같다.
def create_connection(db_file):
    """ create a database connection to the SQLite database specified by the db_file
    :param db_file: database file
    :return: Connection object or None
    """
    conn = None
    try:
        conn = sqlite3.connect(db_file)
    except Exception as e:
        st.write(e)

    return conn
  • 해당 함수의 역할은 db_file 파라미터 값을 받으면 sqlite3.connect 연동이 되도록 설계 한다.
  • 만약, 해당 DB file이 정상적으로 연결이 되면 conn 저장이 되도록 한다.
  • 만약, 없다면 예외처리로 진행한다.

코드 설명 3 - create_database ()

  • 코드는 다음과 같다.
def create_database():
    st.markdown("# Create Database")

    st.write("""A database in SQLite is just a file on same server. 
    By convention their names always end in .db""")

    db_filename = st.text_input("DB Filename")
    create_db = st.button('Create Database')

    if create_db:
        if db_filename.endswith('.db'):
            conn = create_connection(db_filename)
            st.write(conn) # success message?
        else: 
            st.write('DB filename must end with .db, please retry.')
  • Create Database 버튼을 클릭하면
    • DB명이 정상적으로 db명.db 처럼 들어오게 되면 database가 생성이 된다.
    • 만약, 잘못된 이름이 입력되면 에러 메시지를 내보내어 다시 입력하도록 한다.

코드 설명 4 - update_data()

  • 코드는 다음과 같다.
def upload_data():
    st.markdown("# Upload Data")
    # https://discuss.streamlit.io/t/uploading-csv-and-excel-files/10866/2
    sqlite_dbs = [file for file in os.listdir('.') if file.endswith('.db')]
    db_filename = st.selectbox('DB Filename', sqlite_dbs)
    table_name = st.text_input('Table Name to Insert')
    conn = create_connection(db_filename)
    uploaded_file = st.file_uploader('Choose a file')
    if uploaded_file is not None:
        #read csv
        try:
            df = pd.read_csv(uploaded_file)
            df.to_sql(name=table_name, con=conn)
            st.write('Data uploaded successfully. These are the first 5 rows.')
            st.dataframe(df.head(5))

        except Exception as e:
            st.write(e)
  • 위 코드는 csv 파일을 업로드하여 특정 DB에 테이블로 추가하는 코드이다.
  • sqlite_dbs 객체는 저장된 .db 종류를 보여준다. 즉, 데이터베이스를 지정하는 코드라고 보면 된다.
  • table_name 객체는 사용자가 직접 테이블 이름을 입력한다.
  • uploaded_file 객체는 파일을 업로더 하도록 도와준다.
  • if 조건문은 정상적으로 파일이 업로드가 되면, pandas 데이터 프레임으로 읽고, table로 해당 객체를 저장하는 명령어를 의미한다.

코드 설명 5 - run_query()

  • 코드는 다음과 같다.
def run_query():
    st.markdown("# Run Query")
    sqlite_dbs = [file for file in os.listdir('.') if file.endswith('.db')]
    db_filename = st.selectbox('DB Filename', sqlite_dbs)

    query = st.text_area("SQL Query", height=100)
    conn = create_connection(db_filename)

    submitted = st.button('Run Query')

    if submitted:
        try:
            query = conn.execute(query)
            cols = [column[0] for column in query.description]
            results_df= pd.DataFrame.from_records(
                data = query.fetchall(), 
                columns = cols
            )
            st.dataframe(results_df)
        except Exception as e:
            st.write(e)

    st.sidebar.markdown("# Run Query")
  • 위 코드는 DB명을 지정 후, 쿼리를 작성하도록 하는 것이다.
  • Run Query 버튼을 클릭하면, 해당 쿼리를 실행한다.
  • 이 때, 실행 결과는 크게 세가지로 나눠서 진행이 된다.
    • 쿼리 실행 시, cols 객체는 결과 테이블의 컬럼명을 리스트로 저장한다.
    • 쿼리 실행 시, query.fetchall() 각 데이터를 리스트로 저장한다.
  • 각 쿼리는 from_records를 통해서 데이터 프레임으로 저장된다.

코드 설명 6 - 사이드바

  • 코드는 다음과 같다.
def main():
    page_names_to_funcs = {
        "Create Database": create_database,
        "Upload Data": upload_data,
        "Run Query": run_query,
    }

    selected_page = st.sidebar.selectbox("Select a page", page_names_to_funcs.keys())
    page_names_to_funcs[selected_page]()

if __name__ == '__main__':
    main()
  • page_names_to_funcs 딕셔너리 value 값에 저장된 것은 지정한 사용자 정의 함수이다.

시연 이미지

  • Create Database 화면이다.

Untitled

서울시 부동산 실거래가 정보 API 크롤링 2 - 크롤링편 (XML)

개요

  • Open API를 통해서 부동산 실거래가 정보를 pandas 데이터프레임으로 변환하는 코드를 구현한다.

요청인자 확인

Untitled

  • 샘플 URL은 크게 2가지를 제공한다.
    • 서울시 부동산 실거래가 정보
    • 서울시 부동산 실거래가 정보(마곡일성트루엘플래닛)
  • 출력 예제는 다음과 같다.
<?xml version="1.0" encoding="UTF-8"?>
<tbLnOpendataRtmsV>
<list_total_count>2639192</list_total_count>
<RESULT>
<CODE>INFO-000</CODE>
<MESSAGE>정상 처리되었습니다</MESSAGE>
</RESULT>
<row>
<ACC_YEAR>2023</ACC_YEAR>
<SGG_CD>11545</SGG_CD>
<SGG_NM>금천구</SGG_NM>
<BJDONG_CD>10100</BJDONG_CD>
<BJDONG_NM>가산동</BJDONG_NM>
<LAND_GBN>1</LAND_GBN>
<LAND_GBN_NM>대지</LAND_GBN_NM>
<BONBEON>0776</BONBEON>
<BUBEON>0000</BUBEON>
<BLDG_NM>가산대명벨리온</BLDG_NM>
<DEAL_YMD>20230127</DEAL_YMD>
<OBJ_AMT>12300</OBJ_AMT>
<BLDG_AREA>16.28</BLDG_AREA>
<TOT_AREA>25.630000</TOT_AREA>
<FLOOR>8</FLOOR>
<RIGHT_GBN/>
<CNTL_YMD/>
<BUILD_YEAR>2017</BUILD_YEAR>
<HOUSE_TYPE>오피스텔</HOUSE_TYPE>
<REQ_GBN>중개거래</REQ_GBN>
<RDEALER_LAWDNM>서울 금천구</RDEALER_LAWDNM>
</row>
<row>
<ACC_YEAR>2023</ACC_YEAR>
<SGG_CD>11500</SGG_CD>
<SGG_NM>강서구</SGG_NM>
<BJDONG_CD>10500</BJDONG_CD>
<BJDONG_NM>마곡동</BJDONG_NM>
<LAND_GBN>1</LAND_GBN>
<LAND_GBN_NM>대지</LAND_GBN_NM>
<BONBEON>0793</BONBEON>
<BUBEON>0000</BUBEON>
<BLDG_NM>유림트윈파크</BLDG_NM>
<DEAL_YMD>20230127</DEAL_YMD>
<OBJ_AMT>13900</OBJ_AMT>
<BLDG_AREA>19.99</BLDG_AREA>
<TOT_AREA>30.300000</TOT_AREA>
<FLOOR>6</FLOOR>
<RIGHT_GBN/>
<CNTL_YMD/>
<BUILD_YEAR>2015</BUILD_YEAR>
<HOUSE_TYPE>오피스텔</HOUSE_TYPE>
<REQ_GBN>중개거래</REQ_GBN>
<RDEALER_LAWDNM>서울 강서구</RDEALER_LAWDNM>
</row>
<row>
<ACC_YEAR>2023</ACC_YEAR>
<SGG_CD>11500</SGG_CD>
<SGG_NM>강서구</SGG_NM>
<BJDONG_CD>10300</BJDONG_CD>
<BJDONG_NM>화곡동</BJDONG_NM>
<LAND_GBN>1</LAND_GBN>
<LAND_GBN_NM>대지</LAND_GBN_NM>
<BONBEON>1115</BONBEON>
<BUBEON>0034</BUBEON>
<BLDG_NM>casagio</BLDG_NM>
<DEAL_YMD>20230127</DEAL_YMD>
<OBJ_AMT>22100</OBJ_AMT>
<BLDG_AREA>29.98</BLDG_AREA>
<TOT_AREA>21.430000</TOT_AREA>
<FLOOR>2</FLOOR>
<RIGHT_GBN/>
<CNTL_YMD/>
<BUILD_YEAR>2019</BUILD_YEAR>
<HOUSE_TYPE>연립다세대</HOUSE_TYPE>
<REQ_GBN>직거래</REQ_GBN>
<RDEALER_LAWDNM/>
</row>
<row>
<ACC_YEAR>2023</ACC_YEAR>
<SGG_CD>11320</SGG_CD>
<SGG_NM>도봉구</SGG_NM>
<BJDONG_CD>10600</BJDONG_CD>
<BJDONG_NM>방학동</BJDONG_NM>
<LAND_GBN>1</LAND_GBN>
<LAND_GBN_NM>대지</LAND_GBN_NM>
<BONBEON>0632</BONBEON>
<BUBEON>0023</BUBEON>
<BLDG_NM>(632-23)</BLDG_NM>
<DEAL_YMD>20230126</DEAL_YMD>
<OBJ_AMT>12500</OBJ_AMT>
<BLDG_AREA>41.58</BLDG_AREA>
<TOT_AREA>30.760000</TOT_AREA>
<FLOOR>1</FLOOR>
<RIGHT_GBN/>
<CNTL_YMD/>
<BUILD_YEAR>1986</BUILD_YEAR>
<HOUSE_TYPE>연립다세대</HOUSE_TYPE>
<REQ_GBN>직거래</REQ_GBN>
<RDEALER_LAWDNM/>
</row>
<row>
<ACC_YEAR>2023</ACC_YEAR>
<SGG_CD>11410</SGG_CD>
<SGG_NM>서대문구</SGG_NM>
<BJDONG_CD>11200</BJDONG_CD>
<BJDONG_NM>대현동</BJDONG_NM>
<LAND_GBN>1</LAND_GBN>
<LAND_GBN_NM>대지</LAND_GBN_NM>
<BONBEON>0101</BONBEON>
<BUBEON>0007</BUBEON>
<BLDG_NM>혜우</BLDG_NM>
<DEAL_YMD>20230126</DEAL_YMD>
<OBJ_AMT>80000</OBJ_AMT>
<BLDG_AREA>129.27</BLDG_AREA>
<TOT_AREA>0.000000</TOT_AREA>
<FLOOR>10</FLOOR>
<RIGHT_GBN/>
<CNTL_YMD/>
<BUILD_YEAR>1996</BUILD_YEAR>
<HOUSE_TYPE>아파트</HOUSE_TYPE>
<REQ_GBN>직거래</REQ_GBN>
<RDEALER_LAWDNM/>
</row>
</tbLnOpendataRtmsV>

Untitled