본문 바로가기
운영체제(OS)/Docker

postgresql18.3 로컬 주소DB 구축 (3) - 테이블 생성

by JLearn 2026. 3. 31.

DB 적재 주소데이터 다운로드

테이블을 생성하기 전에 사용될 주소 데이터를 다운로드 받습니다.

주소기반산업지원서비스에서 제공하는 건물DB, 위치정보요약DB의 전체 월 데이터입니다.


건물정보 테이블

테이블 생성 시 컬럼 데이터 타입은 문자열 길이가 1인 경우에 CHAR(1), 2이상인 경우는 VARCHAR로 정의하였습니다. 또한, 생성일시와 같은 시간은 UTC를 저장하는 TIMESTAMPTZ를 정의하였습니다.

----------------------------------------------------------------
-- 건물정보테이블
----------------------------------------------------------------
-- DROP TABLE juso.juso_master;
CREATE TABLE juso.juso_master (
    -- 주소 체계 정보
    legal_emd_code         VARCHAR(10),          -- 1. 법정동코드
    sido_name              VARCHAR(40),          -- 2. 시도명
    sigungu_name           VARCHAR(40),          -- 3. 시군구명
    legal_emd_name         VARCHAR(40),          -- 4. 법정읍면동명
    legal_ri_name          VARCHAR(40),          -- 5. 법정리명
    is_mountain            CHAR(1),              -- 6. 산여부 (0:대지, 1:산)
    jibun_main_no          INTEGER,              -- 7. 지번본번(번지)
    jibun_sub_no           INTEGER,              -- 8. 지번부번(호)
    road_name_code         VARCHAR(12),          -- 9. 도로명코드 (시군구5+도로명7)
    road_name              VARCHAR(80),          -- 10. 도로명
    is_basement            CHAR(1),              -- 11. 지하여부 (0:지상, 1:지하 등)
    building_main_no       INTEGER,              -- 12. 건물본번
    building_sub_no        INTEGER,              -- 13. 건물부번
    building_name_bld      VARCHAR(40),          -- 14. 건축물대장 건물명
    building_name_detail   VARCHAR(100),         -- 15. 상세건물명

    -- PK: 건물관리번호
    manage_no          	   VARCHAR(25),          -- 16. 건물관리번호 (PK)

    -- 행정/우편 정보
    emd_serial_no          VARCHAR(2),           -- 17. 읍면동일련번호
    admin_emd_code         VARCHAR(10),          -- 18. 행정동코드
    admin_emd_name         VARCHAR(40),          -- 19. 행정동명
    zip_code               VARCHAR(5),           -- 20. 우편번호
    zip_serial_no          CHAR(3),              -- 21. 우편일련번호
    bulk_delivery_name     VARCHAR(40),          -- 22. 다량배달처명

    -- 변동 정보
    move_reason_code       VARCHAR(2),           -- 23. 이동사유코드
    announcement_date      VARCHAR(8),           -- 24. 고시일자
    prev_road_address      VARCHAR(25),          -- 25. 변동전도로명주소
    sigungu_building_name  VARCHAR(40),          -- 26. 시군구용 건물명
    is_apartment           CHAR(1),              -- 27. 공동주택여부
    basic_area_no          VARCHAR(5),           -- 28. 기초구역번호
    is_detail_address      CHAR(1),              -- 29. 상세주소여부 (0:미부여, 1:부여)
    remarks1               VARCHAR(15),          -- 30. 비고1
    remarks2               VARCHAR(15),          -- 31. 비고2

    -- 위경도 정보
    latitude               DOUBLE PRECISION,
    longitude              DOUBLE PRECISION,
    
    -- 위경도 변환용
    geom_wgs84             GEOMETRY(Point, 4326),
    
    -- 시스템 관리 필드
    created_at             TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
    updated_at             TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
    
    PRIMARY KEY (manage_no)
);

-- 검색 성능 최적화를 위한 인덱스 (도로명주소 검색용)
CREATE INDEX idx_juso_master_road_name_building_main_no_building_sub_no
ON juso.juso_master (road_name, building_main_no, building_sub_no);

-- 한글 검색 확장설치
CREATE EXTENSION IF NOT EXISTS pg_trgm;

CREATE INDEX idx_juso_master_geom_wgs84_gist 
ON juso.juso_master USING GIST (geom_wgs84);

-- 인덱스 갱신 및 통계
ANALYZE juso.juso_master;

관련지번 테이블

----------------------------------------------------------------
-- 관련지번 테이블
----------------------------------------------------------------
-- DROP TABLE juso.juso_related_jibun;
CREATE TABLE juso.juso_related_jibun (
     -- 지번 정보
    legal_emd_code         VARCHAR(10),          -- 1. 법정동코드
    sido_name              VARCHAR(40),          -- 2. 시도명
    sigungu_name           VARCHAR(40),          -- 3. 시군구명
    legal_emd_name         VARCHAR(40),          -- 4. 법정읍면동명
    legal_ri_name          VARCHAR(40),          -- 5. 법정리명
    is_mountain            CHAR(1),              -- 6. 산여부 (0:대지, 1:산)
    jibun_main_no          INTEGER,              -- 7. 지번본번(번지)
    jibun_sub_no           INTEGER,              -- 8. 지번부번(호)

    -- PK 구성 (이미지상 PK1~PK5 복합키)
    road_name_code         VARCHAR(12),          -- 9. 도로명코드 (PK1)
    is_basement            CHAR(1),              -- 10. 지하여부 (PK4)
    building_main_no       INTEGER,              -- 11. 건물본번 (PK2)
    building_sub_no        INTEGER,              -- 12. 건물부번 (PK3)
    jibun_serial_no        INTEGER,              -- 13. 지번일련번호 (PK5)

    -- 변동 정보
    move_reason_code       VARCHAR(2),           -- 14. 이동사유코드

    -- 시스템 관리 필드
    created_at             TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
    updated_at             TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,

    -- 복합 기본키 설정
    PRIMARY KEY (road_name_code, building_main_no, building_sub_no, is_basement, jibun_serial_no)
);

-- 인덱스 갱신 및 통계
ANALYZE juso.juso_related_jibun;

도로명 코드

----------------------------------------------------------------
-- 도로명 코드
----------------------------------------------------------------
-- DROP TABLE juso.road_name_code;
CREATE TABLE juso.road_name_code (
    -- PK 구성 (이미지상 PK1, PK2)
    sigungu_code           VARCHAR(5),           -- 1. 시군구코드 (PK1)
    road_name_no           VARCHAR(7),           -- 2. 도로명번호 (PK1)
    road_name              VARCHAR(80),          -- 3. 도로명
    road_name_en           VARCHAR(80),          -- 4. 영문도로명
    emd_serial_no          VARCHAR(2),           -- 5. 읍면동일련번호 (PK2)

    -- 도로명 정보
    sido_name              VARCHAR(40),          -- 6. 시도명
    sigungu_name           VARCHAR(40),          -- 7. 시군구명
    emd_type               CHAR(1),              -- 8. 읍면동구분 (0:읍면, 1:동, 2:미부여)
    emd_code               CHAR(3),              -- 9. 읍면동코드
    emd_name               VARCHAR(40),          -- 10. 읍면동명

    -- 상위 도로명 정보
    upper_road_name_no     VARCHAR(7),           -- 11. 상위도로명번호
    upper_road_name        VARCHAR(80),          -- 12. 상위도로명

    -- 상태 및 이력 정보
    is_used                CHAR(1),              -- 13. 사용여부 (0:사용, 1:미사용)
    history_reason_code    CHAR(1),              -- 14. 변경이력사유 (0~4, 9)
    history_info           VARCHAR(14),          -- 15. 변경이력정보

    -- 영문 명칭
    sido_name_en           VARCHAR(40),          -- 16. 영문시도명
    sigungu_name_en        VARCHAR(40),          -- 17. 영문시군구명
    emd_name_en            VARCHAR(40),          -- 18. 영문읍면동명

    -- 일자 정보
    announcement_date      VARCHAR(8),           -- 19. 고시일자 (YYYYMMDD)
    expiration_date        VARCHAR(8),           -- 20. 말소일자 (YYYYMMDD)

    -- 시스템 관리 필드
    created_at             TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
    updated_at             TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,

    -- 복합 기본키 설정
    -- 이미지 비고란에 따라 시군구코드(5)+도로명번호(7)가 실제 도로명코드(12자리) 역할을 함
    PRIMARY KEY (sigungu_code, road_name_no, emd_serial_no)
);

-- 검색 성능 향상을 위한 인덱스
-- 도로명 이름으로 검색 시 필요
CREATE INDEX idx_road_name_code_road_name ON juso.road_name_code (road_name);

-- 인덱스 갱신 및 통계
ANALYZE juso.road_name_code;

위치정보요약 테이블

----------------------------------------------------------------
-- 위치정보요약 테이블
----------------------------------------------------------------
-- DROP TABLE juso.juso_location_summary;
CREATE TABLE juso.juso_location_summary (
    -- 주소 및 건물 정보
    sigungu_code           VARCHAR(5),           -- 1. 시군구코드
    ent_serial_no          VARCHAR(10),          -- 2. 출입구일련번호
    legal_emd_code         VARCHAR(10),          -- 3. 법정동코드 (PK5: 시군구5+읍면동3+00)
    sido_name              VARCHAR(40),          -- 4. 시도명
    sigungu_name           VARCHAR(40),          -- 5. 시군구명
    emd_name               VARCHAR(40),          -- 6. 읍면동명
    road_name_code         VARCHAR(12),          -- 7. 도로명코드 (PK1: 시군구5+도로명7)
    road_name              VARCHAR(80),          -- 8. 도로명
    is_basement            CHAR(1),              -- 9. 지하여부 (PK4)
    building_main_no       INTEGER,              -- 10. 건물본번 (PK2)
    building_sub_no        INTEGER,              -- 11. 건물부번 (PK3)
    building_name          VARCHAR(40),          -- 12. 건물명
    zip_code               VARCHAR(5),           -- 13. 우편번호
    building_usage_type    VARCHAR(100),         -- 14. 건물용도분류 (복수 존재 시 콤마 구분)
    is_building_group      CHAR(1),              -- 15. 건물군여부 (0:단독, 1:건물군)
    admin_emd_name         VARCHAR(40),          -- 16. 관할행정동명 (참고용)

    -- 좌표 정보 (GRS80 UTM-K)
    ent_x                  NUMERIC(15, 6),       -- 17. X좌표
    ent_y                  NUMERIC(15, 6),       -- 18. Y좌표

    -- 변동 정보
    move_reason_code       VARCHAR(2),           -- 19. 이동사유코드 (31, 34, 63)

    -- 위경도 변환용
    geom_wgs84             GEOMETRY(Point, 4326),
    
    -- 시스템 관리 필드
    created_at             TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
    updated_at             TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,

    -- 복합 기본키 설정
    PRIMARY KEY (road_name_code, building_main_no, building_sub_no, is_basement, legal_emd_code)
);

-- 좌표 기반 검색(반경 검색)을 위한 인덱스
CREATE INDEX idx_juso_location_summary_ent_x_ent_y ON juso.juso_location_summary (ent_x, ent_y);

-- 인덱스 갱신 및 통계
ANALYZE juso.juso_location_summary;

PostGIS 확장기능 설치

바로 WGS84로 저장해도 되지만, 원본 좌표계(5179)로 Geometry를 만든 뒤 변환합니다.

-- 1. PostGIS 확장 기능 활성화 (최초 1회)
CREATE EXTENSION IF NOT EXISTS postgis;
CREATE EXTENSION IF NOT EXISTS pg_trgm;

-- 2. 테이블에 공간 컬럼 추가 (존재하지 않는 경우)
-- ALTER TABLE juso.juso_location_summary 
-- ADD COLUMN geom_wgs84 GEOMETRY(Point, 4326); -- 위경도 변환용

-- geom_wgs84 컬럼(GEOMETRY 타입)에 생성
CREATE INDEX idx_juso_location_summary_geom_wgs84_gist 
ON juso.juso_location_summary
USING GIST (geom_wgs84);

-- 3. 인덱스 갱신 및 통계
ANALYZE juso.juso_location_summary;

댓글