IT 개발,관리,연동,자동화

관세청 수입신고서의 상세 항목을 바탕으로 MySQL 테이블 설계

_Blue_Sky_ 2025. 12. 19. 13:38
728x90

관세청 수입신고서의 상세 항목을 바탕으로 MySQL 테이블을 더욱 정교하게 설계해 드립니다. 실제 실무 데이터(물동량, 세액 계산, 검사 정보 등)를 처리할 수 있도록 정규화(Normalization) 단계를 높여 구성했습니다.

1. 확장된 데이터베이스 구조 계획

전체 시스템은 크게 4개의 테이블로 구성됩니다.

  • Master (수입신고 헤더): 신고 기본 정보, 화주 정보, 입항 정보
  • Item (란 상세): HS Code, 품명, 원산지 등 각 란별 정보
  • Tax (세액 상세): 관세, 부가세, 개별소비세 등 세금 종류별 상세 내역
  • Container (컨테이너 정보): 수입 화물 컨테이너 목록

2. MySQL 테이블 설계 (DDL)

(1) 수입신고 헤더 테이블

수입신고서 상단의 공통 정보를 관리합니다.\

 
CREATE TABLE imp_decl_master (
    decl_no VARCHAR(20) PRIMARY KEY COMMENT '수입신고번호 (예: 12345-23-000000X)',
    decl_date DATE NOT NULL COMMENT '신고일자',
    customs_code VARCHAR(3) COMMENT '세관코드 (예: 040)',
    dept_code VARCHAR(2) COMMENT '과코드',
    
    -- 화주 및 신고인 정보
    importer_id VARCHAR(15) COMMENT '수입자 통관고유부호',
    importer_name VARCHAR(100) COMMENT '수입자명',
    declarer_id VARCHAR(15) COMMENT '신고인 통관고유부호(관세사)',
    
    -- 입항 및 화물 정보
    bl_no VARCHAR(20) NOT NULL COMMENT 'B/L 번호',
    cargo_mgmt_no VARCHAR(20) COMMENT '화물관리번호',
    entry_port VARCHAR(5) COMMENT '입항항코드',
    vessel_name VARCHAR(100) COMMENT '선박/항공기명',
    total_package_qty INT COMMENT '총 포장갯수',
    total_weight DECIMAL(18,3) COMMENT '총 중량(KG)',
    
    -- 결제 조건
    incoterms VARCHAR(3) COMMENT '인코텀즈(FOB, CIF 등)',
    curr_code VARCHAR(3) COMMENT '결제통화',
    ex_rate DECIMAL(13,4) COMMENT '적용환율',
    
    status VARCHAR(10) DEFAULT '신고' COMMENT '진행상태(신고, 수리, 각하 등)',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

(2) 수입신고 란별 상세 테이블

수입신고서의 핵심인 '란' 단위 정보를 담습니다. 한 신고번호당 여러 란(1:N)이 존재합니다.

CREATE TABLE imp_decl_items (
    item_id BIGINT AUTO_INCREMENT PRIMARY KEY,
    decl_no VARCHAR(20) NOT NULL,
    item_seq INT NOT NULL COMMENT '란 번호 (1, 2, 3...)',
    
    hs_code VARCHAR(10) NOT NULL COMMENT 'HS부호 (10자리)',
    product_desc VARCHAR(200) COMMENT '품명(규격)',
    brand_name VARCHAR(100) COMMENT '상표명',
    origin_country VARCHAR(2) COMMENT '원산지 국가코드',
    
    qty DECIMAL(18,4) COMMENT '수량',
    qty_unit VARCHAR(3) COMMENT '단위코드',
    
    unit_price DECIMAL(18,4) COMMENT '단가',
    total_amount DECIMAL(18,4) COMMENT '금액(외화)',
    total_amount_krw DECIMAL(20,0) COMMENT '금액(원화 - 과세표준)',
    
    tax_rate_type VARCHAR(2) COMMENT '세율구분코드(A, C, F 등)',
    CONSTRAINT fk_master_decl FOREIGN KEY (decl_no) REFERENCES imp_decl_master(decl_no)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

(3) 세액 상세 테이블

각 란별로 발생하는 다양한 세종(관세, 부가세, 농특세 등)을 상세히 기록합니다.

CREATE TABLE imp_decl_taxes (
    tax_id BIGINT AUTO_INCREMENT PRIMARY KEY,
    item_id BIGINT NOT NULL,
    tax_type VARCHAR(2) COMMENT '세종코드 (01:관세, 02:개별소비세, 06:부가세 등)',
    tax_rate DECIMAL(10,5) COMMENT '세율',
    tax_amount DECIMAL(20,0) COMMENT '세액(원화)',
    CONSTRAINT fk_item_tax FOREIGN KEY (item_id) REFERENCES imp_decl_items(item_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

3. 주요 설계 특징 및 팁

  1. 데이터 타입의 정밀도:
    • DECIMAL(18, 4): 단가나 수량의 경우 소수점 아래 4자리까지 관리하여 계산 오차를 방지합니다.
    • DECIMAL(20, 0): 원화 세액이나 과세표준은 금액이 매우 클 수 있으므로 충분한 자릿수를 확보합니다.
  2. 인덱스(Index) 활용:
    • bl_no와 importer_id 컬럼에 인덱스를 생성하면 화물 추적이나 화주별 데이터 조회 성능이 비약적으로 향상됩니다.
  3. 코드 성 데이터:
    • customs_code, incoterms, tax_type 등은 관세청 표준 코드집을 참고하여 데이터 정합성을 유지해야 합니다. 별도의 코드 관리 테이블(cmm_code)을 두어 매핑하는 것을 권장합니다.

수입신고 시 세금 계산은 단순히 물건값에 세율을 곱하는 것이 아니라, 운임과 보험료를 합산한 과세가격을 기준으로 산출됩니다.

이해를 돕기 위해 '판매가가 1,000달러인 가방(관세율 8%)'을 예시로 들어 계산 과정을 정리해 드리겠습니다.


1. 기본 가정 (샘플 데이터)

항목 내용 비고
품목 가죽 가방 (HS 4202.21) 관세 8%, 부가세 10%
물품가격(FOB) $1,000 인코텀즈 FOB 기준
운임 및 보험료 $100 과세가격 포함 항목
적용 환율 1,300원 / $ 관세청 고시환율 가정

2. 단계별 세액 계산 과정

Step 1: 과세가격(CIF) 산출

우리나라는 물건값에 운송비를 합친 CIF 가격을 기준으로 세금을 매깁니다.

  • 외화 과세가격: $1,000 + $100 = $1,100
  • 원화 과세표준: $1,100 \times 1,300원 = \mathbf{1,430,000원}$

Step 2: 관세 계산

  • 계산식: 원화 과세표준 $\times$ 관세율
  • 금액: $1,430,000원 \times 8\% = \mathbf{114,400원}$

Step 3: 부가가치세 계산

부가가치세는 물건값이 아니라 **(물건값 + 관세)**를 합친 금액을 기준으로 매깁니다.

  • 부가세 과세표준: $1,430,000원(과세표준) + 114,400원(관세) = 1,544,400원$
  • 금액: $1,544,400원 \times 10\% = \mathbf{154,440원}$

Step 4: 최종 납부 세액 합계

  • 총액: $114,400원(관세) + 154,440원(부가세) = \mathbf{268,840원}$

3. DB에 저장되는 형태 (데이터 예시)

위 계산 결과를 앞서 설계한 테이블에 넣는다면 다음과 같이 데이터가 생성됩니다.

[imp_decl_items 테이블]

| item_id | hs_code | total_amount_krw (과세표준) |

| :--- | :--- | :--- |

| 101 | 4202211000 | 1,430,000 |

[imp_decl_taxes 테이블]

| tax_id | item_id | tax_type | tax_rate | tax_amount |

| :--- | :--- | :--- | :--- | :--- |

| 1 | 101 | 01 (관세) | 0.08000 | 114,400 |

| 2 | 101 | 06 (부가세) | 0.10000 | 154,440 |


💡 실무 포인트

  1. 반올림: 관세법에 따라 10원 미만은 절사합니다.
  2. 기타 세금: 술(주세), 향수(개별소비세) 등 특정 품목은 관세 외에 추가 세금이 붙으며, 계산 순서는 [과세가격 → 관세 → 개별소비세 → 교육세 → 부가세] 순으로 복잡해집니다.
  3. FTA 적용: 만약 한-미 FTA 원산지 증명이 있다면 관세율 8%가 0%로 적용되어 세금이 대폭 줄어듭니다.

수입신고에서 가장 복잡한 사례는 개별소비세, 주세, 교육세, 농어촌특별세가 모두 붙는 **'고가 및 고도수 주류(예: 위스키)'**입니다.

위스키는 세금이 세금을 낳는 '종속적 계산 구조'를 가지고 있어 로직이 매우 까다롭습니다.


1. 기본 가정 (샘플 데이터)

항목 내용 비고
품목 스카치 위스키 (HS 2208.30) 관세 20%, 주세 72%
물품가격(CIF) 10,000,000원 (물건값 + 운임 + 보험료) 합산액
적용 세율 관세(20%), 주세(72%), 교육세(30%), 부가세(10%) 교육세는 주세액의 30%

2. 단계별 세액 계산 과정 (누진 구조)

위스키와 같은 물품은 아래 순서를 엄격히 지켜야 합니다.

Step 1: 관세 (Customs Duty)

  • 계산식: 과세가격 $\times$ 관세율
  • 계산: $10,000,000 \times 20\% = \mathbf{2,000,000원}$

Step 2: 주세 (Liquor Tax)

주세는 '과세가격'에 '관세'를 더한 금액을 기준으로 매깁니다.

  • 계산식: (과세가격 + 관세) $\times$ 주세율
  • 계산: $(10,000,000 + 2,000,000) \times 72\% = \mathbf{8,640,000원}$

Step 3: 교육세 (Education Tax)

교육세는 물건값이 아니라 위에서 계산된 주세액을 기준으로 매깁니다.

  • 계산식: 주세액 $\times$ 교육세율(30%)
  • 계산: $8,640,000 \times 30\% = \mathbf{2,592,000원}$

Step 4: 부가가치세 (VAT)

마지막 부가세는 앞의 모든 금액을 다 합친 것의 10%입니다.

  • 계산식: (과세가격 + 관세 + 주세 + 교육세) $\times$ 10%
  • 계산: $(10,000,000 + 2,000,000 + 8,640,000 + 2,592,000) \times 10\% = \mathbf{2,323,200원}$

3. 최종 결과 요약

세종명 계산 금액 누계 (원가 대비 세금 비중)
과세가격 10,000,000원 -
관세 2,000,000원  
주세 8,640,000원  
교육세 2,592,000원  
부가세 2,323,200원  
총 납부세액 15,555,200원 수입가보다 세금이 약 1.5배 더 많음

4. DB 설계를 위한 복합 로직 구현 팁

이런 복잡한 계산을 DB에서 처리하거나 관리할 때는 imp_decl_taxes 테이블에 **계산 순서(Calculation Order)**와 기초 금액(Base Amount) 컬럼이 반드시 필요합니다.

[수정된 imp_decl_taxes 테이블 예시]

| tax_type | base_amount (기초금액) | tax_rate | tax_amount | 순서 |

| :--- | :--- | :--- | :--- | :--- |

| 01 (관세) | 10,000,000 | 0.20 | 2,000,000 | 1 |

| 02 (주세) | 12,000,000 (과세+관세) | 0.72 | 8,640,000 | 2 |

| 03 (교육세) | 8,640,000 (주세액) | 0.30 | 2,592,000 | 3 |

| 06 (부가세) | 23,232,000 (전체합) | 0.10 | 2,323,200 | 4 |

개발 시 주의사항:

  1. 연쇄 계산: 앞 단계의 결과값이 다음 단계의 입력값이 되므로, 프로그램 로직 구현 시 Loop를 돌며 이전 세액들을 SUM하여 다음 과세표준을 잡아야 합니다.
  2. 원 단위 절사: 각 세종별로 계산 후 마지막에 10원 미만을 버리는 처리를 각각 해줘야 최종 합계가 관세청 결과와 일치합니다.

HS 부호(HS Code)는 매년 개정되며 품목이 매우 방대하기 때문에, 이를 전체 조회하는 방법은 공공 데이터 API를 연동하거나 관세청에서 제공하는 엑셀 파일을 다운로드하는 두 가지 방법이 가장 확실합니다.


1. 관세청 '관세법령정보포털' 이용 (수동 조회)

가장 정확한 최신 데이터를 UI로 확인할 수 있는 곳입니다.

  1. 관세법령정보포털(CLIP) 접속
  2. 상단 메뉴의 [세계HS] → [관세율표] 클릭
  3. [속보] 메뉴에서 연도별 최신 관세율표를 확인하거나 엑셀 파일로 전체 다운로드가 가능합니다.

2. 공공데이터포털 API 이용 (시스템 연동)

개발 중인 MySQL 테이블에 데이터를 자동으로 밀어 넣으려면 이 방법을 추천합니다.

  • API 명칭: 관세청_국가별 HS표준코드
  • 제공기관: 관세청
  • 주요 기능: 10자리 HS Code, 품명(한글/영문), 관세율 등을 JSON/XML로 수집 가능

3. MySQL에 HS부호 마스터 테이블 구축하기

전체 데이터를 수집했다면 아래와 같은 구조로 마스터 테이블을 만들어 관리하면 효율적입니다.

CREATE TABLE cmm_hs_code (
    hs_code VARCHAR(10) PRIMARY KEY COMMENT 'HS부호(10자리)',
    hs_section VARCHAR(2) COMMENT '부(Section)',
    hs_chapter VARCHAR(2) COMMENT '류(Chapter)',
    ko_name TEXT NOT NULL COMMENT '품명(한글)',
    en_name TEXT COMMENT '품명(영문)',
    base_rate DECIMAL(5,2) COMMENT '기본세율',
    unit_code VARCHAR(5) COMMENT '수량단위',
    is_used TINYINT(1) DEFAULT 1 COMMENT '사용여부',
    updated_at DATE COMMENT '개정일자'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

4. 실무 팁: HS부호의 계층 구조

HS부호는 숫자의 길이에 따라 의미가 커집니다.

  • 앞 2자리 (Chapter): 상품의 대분류 (예: 22류 - 음료, 주류)
  • 앞 4자리 (Heading): 소분류 (예: 2208호 - 위스키 등 증류주)
  • 앞 6자리 (Sub-heading): 국제 공통 부호
  • 10자리 (HSK): 한국에서만 사용하는 세부 분류 (통관 시 필수)

전체 조회를 할 때 주의할 점: HS 코드는 매년 1월 1일자로 삭제되거나 신설되는 번호가 많습니다. 따라서 테이블 설계 시 start_date와 end_date를 추가하여 이력 관리(History)가 가능하게 설계하는 것이 실무에서 매우 중요합니다.

728x90