SAP 수입 통관 부대비 다차원 분석 리포트 — 예정 대비 차이를 요인으로 가르고 통관 라인까지 내려가 보는 수입 원가 점검
큐브 집계 · 끌어다 놓는 축 구성 · 칸에서 통관 라인까지의 드릴스루 · 예정 대비 차이와 여덟 가지 요인분해 · 행에 남는 변동 사유 · 숫자를 모델에 맡기지 않는 AI 분석 · 하루 한 번 도는 AI 에이전트 — 소개 영상과 실제 화면 33종, 그리고 CDS 코드까지
소개 영상블로그 목차 순서대로 · 자막 포함
도입 포인트 — 이 리포트를 사용해야 하는 이유
수입 담당자가 월말에 받는 질문은 대체로 한 줄입니다. “통관 부대비가 왜 예정보다 많이 나왔습니까?” 통관 부대비는 수수료, 검사비, 보관·하역비, 서류·내륙운송비가 한 덩어리로 들어와서, 합계만 봐서는 관세사 단가가 올랐는지, 검사 구분이 바뀌었는지, 보관 일수가 늘었는지, 예정에 없던 통관이 끼었는지 알 수 없습니다. 지금 방식은 구매 오더, 입고, 송장 화면(ME23N · MIGO · MIRO)과 관세사 청구서를 엑셀에서 맞붙이는 것입니다. 그 사이 차원이 하나 바뀔 때마다 표를 새로 만들어야 하고, 합계가 어긋나면 어느 쪽이 맞는지부터 다툽니다.
이 리포트는 그 자리를 메웁니다. 통관 라인을 큐브로 한 번 묶어 두고, 관세사 · 검사 구분 · 통관 신고월 · 공급사 같은 차원을 끌어다 놓는 것만으로 같은 숫자를 다른 모양으로 펼칩니다. 칸을 누르면 그 금액을 만든 통관 라인이 열리고, 예정과 실적의 차이는 여덟 가지 요인으로 나뉘어 어디부터 점검할지 보여 줍니다. 관련 기준서는 IAS 2 재고자산(K-IFRS 제1002호)으로, 통관 부대비를 재고 취득원가에 넣는 판단을 점검하는 자료로 씁니다. 문단 번호는 원문 확인 전이라 적지 않습니다.
핵심 포인트 일곱 가지
| 핵심 포인트 | 고객이 얻는 것 | 지금 방식이라면 |
|---|---|---|
| ① 축을 바꿔도 숫자가 갈라지지 않는 피벗 | 관세사 · 검사 구분 · 통관 신고월 · 공급사 같은 차원을 끌어다 놓아 행 3단계 · 열 2단계로 봅니다. 모든 축이 같은 큐브에서 나오므로 합계가 어긋날 자리가 없습니다. | 축마다 리포트를 따로 만들고, 합계가 다르면 숫자를 맞추는 회의부터 엽니다. |
| ② 칸에서 통관 라인까지 한 번에 | 숫자 칸을 누르면 그 금액을 만든 통관 라인이 열리고, 라인 합계가 칸 금액과 같은지 바로 보입니다. | 리포트를 닫고 구매·입고·송장 화면을 열어 조건을 손으로 다시 맞춥니다. |
| ③ 예정 대비 차이를 여덟 요인으로 | 통관 물량 · 외화 단가 · 환율 · 수수료율 · 검사 단가 · 보관 일수 · 서류·내륙 단가 · 미계획 통관으로 가릅니다. 합이 총차이와 같은지 화면이 매번 검산합니다. | 엑셀로 밤새 나누고, 합계가 맞는지 다시 손으로 맞춥니다. |
| ④ 차이 사유가 행에 남는다 | 사유가 조회 범위와 행 경로에 묶여 저장되어, 축을 바꾸거나 다시 조회해도 같은 행이면 따라옵니다. | 같은 질문을 매달 다시 하고, 지난달 답은 메일함에서 찾습니다. |
| ⑤ 사람이 열지 않아도 도는 점검 | 관세사 수수료율 · 공급사 긴급 통관률 · 예정 초과 같은 규칙에 걸리면 받을 역할의 눈으로 다시 적어 대기함에 올립니다. 하루 한 번만 돕니다. | 비용이 튄 달에 아무도 화면을 열지 않으면 그대로 마감됩니다. |
| ⑥ 점검 회의용 보고서를 바로 | 보고 있는 범위의 요약 · 핵심 발견 · 워터폴 · 표를 담은 PowerPoint 보고서가 브라우저에서 바로 만들어집니다. | 화면을 캡처하고 숫자를 옮겨 적어 보고서를 다시 만듭니다. |
| ⑦ 숫자는 모델에 맡기지 않는 AI | 금액과 비율은 서비스가 계산하고 해설은 읽기만 합니다. 모델을 연결하지 않아도 규칙 기반 해설이 같은 근거로 나옵니다. | AI 가 만든 숫자를 점검 자료에 써도 되는지부터 따져야 합니다. |
사례로 보는 효과
검증용 샘플 데이터(2026년 4월~9월, 통관 라인 3,000건)에서 통관 부대비는 실적 8.50억원, 예정 7.49억원으로 +1.01억원(+13.5%) 차이가 났습니다. 합계만 보면 “조금 많다”로 끝나지만, 여덟 요인으로 가르면 모양이 달라집니다.
| 요인 | 금액(원) | 읽는 법 |
|---|---|---|
| 예정 통관 부대비 | 749,000,145 | 기준 |
| 통관 물량 | +26,816,125 | 통관한 수량이 예정보다 많음 |
| 외화 단가 | +374,238 | 거의 영향 없음 |
| 환율 | +274,404 | 거의 영향 없음 |
| 수수료율 | +3,005,620 | 관세사 수수료율이 예정보다 높음 |
| 검사 단가 | −17,989,150 | 검사 구분이 예정과 달라진 라인에서 비용이 줄어듦 |
| 보관 일수 | +23,167,606 | 보관 일수가 예정보다 길어짐 |
| 서류·내륙 단가 | +3,224,403 | 소폭 증가 |
| 미계획 통관 | +61,895,915 | 예정에 없던 통관 196라인의 부대비 |
| 실적 통관 부대비 | 849,769,306 | 요인 합 = 총차이, 검산 0원 |
가장 큰 몫은 물량이나 단가가 아니라 예정에 없던 통관(+6,190만원)이고, 그다음이 보관 일수(+2,317만원)와 통관 물량(+2,682만원)입니다. 같은 범위를 대사식으로 따져 보면 큐브 합계와 원천 라인 합계는 측정값 8개 모두 차이 0, 라인 3,000건의 부대비 합 검사도 차이 0건입니다. 그래서 “숫자가 맞는가”를 따지는 회의 대신 “예정에 없던 통관은 왜 생겼는가”를 이야기할 수 있습니다.
도입하면 달라지는 것
- 월말 점검 준비 — 차이 표 · 요인분해 · 사유 · 보고서가 한 화면에서 나와 엑셀 취합과 캡처가 줄어듭니다.
- 회의의 주제 — “어느 숫자가 맞나”가 아니라 “무엇을 확인할 것인가”로 옮겨 갑니다.
- 다음 달로 이어지는 기록 — 사유와 레이아웃이 남아 같은 설명을 다시 하지 않습니다.
- 놓치는 날이 없는 점검 — 화면을 열지 않아도 규칙에 걸린 항목이 대기함에 올라갑니다.
이런 회사에 맞습니다
수입 비중이 크고 관세사 · 포워더 · 보관업체를 여러 곳 쓰면서, 통관 부대비를 엑셀로 모아 월마감 때 원가에 반영하는 제조 · 유통 회사입니다. 외화 결제 통화가 여러 개이거나 통관지가 여러 곳이라 차원이 많을수록, 구매 · 물류 · 자금 · 재무 담당이 서로 다른 질문으로 같은 숫자를 볼수록 효과가 큽니다.
실행 화면
실제로 돌아가는 화면 33종을 순서대로 싣습니다. 그림을 누르면 크게 볼 수 있고, 화면마다 무엇을 하는 자리이고 왜 그렇게 두었는지를 아래에 적었습니다. 숫자는 모두 같은 자료에서 나온 것이라 화면끼리 서로 맞춰 보셔도 됩니다.
사용 방법
- 조회조건 입력 — 회사코드(필수)와 시작 · 종료 통관 신고월(필수, 기본 6개월)을 확인합니다. 차원 값(관세사 · 공급사 · 출항국 · 자재그룹 · 통화 · 검사 구분 등)은 선택이며 비우면 전체입니다.
- 조회 — 조회 버튼은 조회조건 영역 오른쪽 끝에 있습니다. 입력 칸에서 Enter 를 눌러도 조회됩니다. 열 때 자동 조회는 기본으로 지정하고 자동 조회를 켠 레이아웃에서만 일어납니다.
- 요약 확인 — 임원 요약에서 역할(재무 · 구매 · 물류 · 자금 책임자)을 고르면 먼저 볼 지표와 예정보다 많은 곳 · 적은 곳이 나옵니다.
- 탭 · 축 이동 — 레이아웃 보드에서 차원을 행 · 열 · 풀로 끌어 놓고, 표시 항목 · 금액 단위 · 비교 · 임계를 바꿉니다. 서버를 다시 부르지 않습니다.
- 행 · 칸 클릭 — 행 이름은 그 범위의 요인분해를, 숫자 칸은 통관 라인 목록을 엽니다. 사유 버튼으로 차이 원인을 남깁니다.
- 내보내기 — 표 위 CSV 로 현재 피벗을, 통관 라인 창의 CSV 로 라인 목록을 내려받습니다. AI 분석 창에서는 PPTX 보고서를 받습니다.
무엇으로 만들었나
| 자리 | 무엇 | 왜 그렇게 두었나 |
|---|---|---|
| 화면 컨트롤 | OpenUI5 표준 컨트롤(트리 테이블 · 다이얼로그 · 분할 레이아웃)과 직접 그린 SVG 차트 | 사내망에서 외부 차트 라이브러리 반입 심사를 거치지 않고, 표와 차트가 같은 행 경로를 공유합니다. |
| 집계 · 판정 로직 | 브라우저의 큐브 재집계(축 변경) + 서비스의 금액 계산(요인분해 · 해설 · 에이전트) | 축을 바꿀 때는 재조회 없이 즉시, 금액이 걸린 계산은 한 곳(서비스)에서만 하므로 화면 · AI · 보고서의 숫자가 같습니다. |
| OData 서비스 구성 | 큐브 · 예정 · 통관 원천 라인 · 차원 · 측정값 · 계산항목 · 검산 · 사유 · 레이아웃 · 에이전트를 엔티티셋으로 읽고, 요인분해 · 해설 · 에이전트 실행은 펑션으로 호출 | 조회조건은 모두 표준 필터 객체로 보내고, 쓰기는 사유 · 레이아웃 · 규칙에만 열어 둡니다. |
| 테마 | sap_horizon | SAP 표준 화면과 같은 시각 언어로 오갈 때 이질감이 없도록. |
앱 정보
| 항목 | 내용 |
|---|---|
| 솔루션 | 수입 솔루션 |
| 업무 영역 | 구매(MM) · 수입 통관 비용 분석 |
| 관련 기준서 · 대상 영역 | IAS 2 재고자산(K-IFRS 제1002호) |
| SAP 표준 T-code | ME23N · MIGO · MIRO · MB51 · FBL1N |
| Namespace | zui5.impclear |
| 화면 성격 | 다차원 분석 리포트 |
| 테마 | sap_horizon |
처음 열었을 때 — 비어 있는 틀에서 첫 피벗까지
처음 열면 조회조건과 레이아웃 보드만 보이는 빈 틀입니다. 조회하면 피벗과 차트가 한꺼번에 나타나고, 차원을 끌어 옮기면 서버 호출 없이 표가 바뀝니다.

회사코드와 통관 신고월 범위가 기본값으로 채워져 있고, 조회 버튼은 조회조건 영역 오른쪽 끝에 있습니다. 조건 입력 칸에서 Enter 를 눌러도 조회됩니다.

숫자는 백만원 단위이며 합계 열이 맨 오른쪽에 있습니다. 표 위의 요약 영역이 접혀 있으면 펼쳐 지표를 함께 볼 수 있습니다.

차원을 끌어서 다른 영역에 놓으면 표가 바로 다시 그려집니다. 이때 서버에는 아무 요청도 가지 않으며, 총합은 어느 배치에서도 같습니다.

행은 최대 3개, 열은 최대 2개 차원까지 놓을 수 있습니다. 차원 옆 버튼으로 값을 골라 범위를 좁힐 수 있습니다.

모두 접으면 표와 차트가 화면 대부분을 차지해 많은 행을 한 번에 볼 수 있습니다. 다시 펼치면 입력한 값이 그대로 남아 있습니다.
경영 요약 — 역할마다 먼저 보는 지표가 다르다
같은 큐브를 누가 보느냐에 따라 먼저 볼 지표가 다릅니다. 역할을 고르면 행 축과 측정값이 함께 바뀌어, 재무 · 구매 · 물류 · 자금 책임자가 각자 첫 화면에서 자기 질문의 답을 봅니다.

증감은 예정과 비교한 값이며 색은 차이 모드의 임계를 따릅니다. 역할을 바꾸면 기본 행 축과 측정값이 함께 바뀝니다.

같은 큐브를 다른 질문으로 읽는 것이며 별도 조회는 일어나지 않습니다. 표의 숫자는 아래 피벗과 같은 값입니다.

보관 일수가 길어 비용이 커진 곳이 위쪽에 올라옵니다. 어느 곳이 예정보다 적게 쓰였는지도 함께 보입니다.

통화마다 환율 요인이 따로 계산되어, 환율 영향이 큰 통화를 바로 찾을 수 있습니다. 외화 금액은 원화로 환산한 값만 더합니다.
축 전환과 범위 — 같은 큐브를 다른 모양으로
행은 3단계, 열은 2단계까지 쌓을 수 있고 차원 값은 여러 개 골라 범위를 좁힙니다. 조합이 너무 많아지면 표를 그리지 않고 안내를 띄웁니다.

열 조합이 36개를 넘으면 표를 그리지 않고 안내를 띄웁니다. 행 축도 같은 방식으로 단계를 쌓습니다.

값 이름과 함께 그 값에 속한 통관 라인 수가 보입니다. 고른 값만 표와 차트, 요약, 드릴스루에 똑같이 적용됩니다.

줄어든 범위의 합계는 큐브 합계를 그 조건으로 다시 더한 값입니다. 조건은 표 위 한 줄에 요약됩니다.

차트가 필요 없으면 줄이고, 표를 넓게 보려면 반대로 끕니다. 좁은 화면에서는 차트가 표 아래로 내려갑니다.
칸에서 통관 라인까지 — 숫자의 근거를 내려가 본다
표의 숫자를 믿을 수 있는지는 칸에서 원천까지 내려가 봐야 알 수 있습니다. 칸을 누르면 통관 라인이 열리고, 칸 금액과 라인 합계가 같다는 표시가 붙습니다.

위쪽의 칸 금액과 라인 합계가 같으면 일치로 표시됩니다. 라인이 많으면 일정 단위로 나누어 읽고 전체 보기로 이어서 읽을 수 있습니다.

표준 구매·입고·송장 화면에서 같은 문서를 찾아 대조할 수 있도록 번호를 그대로 보여줍니다. CSV 로 내려받을 수 있습니다.

차이는 모두 0 이어야 하며, 어긋나면 그 월을 점검 대상으로 봅니다. 큐브를 믿어도 되는지 확인하는 마지막 장치입니다.
계산항목 — 비율과 원가를 같은 표로
측정값을 계산항목으로 바꾸면 같은 표가 비율과 원가로 읽힙니다. 소계와 합계도 각 칸의 분자 · 분모를 따로 더한 뒤 나눠서 계산합니다.

부대비율은 통관 부대비 합계를 과세가격으로 나눈 값입니다. 소계와 합계 칸도 각 칸의 분자·분모를 따로 더한 뒤 나눠서 계산합니다.

운임과 관세 같은 다른 원가 요소는 다른 화면에서 더합니다. 계산식은 계산항목 목록에서 확인할 수 있습니다.
예정 대비 차이 — 같은 표가 점검 회의 자료가 된다
비교를 예정 대비로 바꾸면 같은 표가 점검 회의 자료가 됩니다. 금액과 비율이 모두 임계를 넘을 때만 색이 입혀지고, 차이는 요인으로 쪼개지며, 이유는 행에 남습니다.

금액과 비율이 모두 임계를 넘는 칸만 빨강(예정보다 많음) 또는 초록(예정보다 적음)으로 칠합니다. 임계는 화면에서 바꿀 수 있고 기본값은 100만원과 10퍼센트입니다.

붉은 막대는 부대비를 늘린 요인, 초록 막대는 줄인 요인입니다. 막대 합과 총차이는 검산 줄에서 같은지 확인합니다.

위 화면은 한 관세사의 예정 120.4백만원에서 실적 135.6백만원까지의 요인입니다. 전체 범위로 버튼으로 돌아옵니다.

그때의 차이 금액과 비율이 함께 저장됩니다. 원인 유형은 요인분해의 요인 이름과 같습니다.

새로 고친 뒤 다시 조회해도 사유가 남아 있고, 같은 범위를 열면 다시 보입니다. 같은 행의 사유는 수정과 삭제가 가능합니다.
AI 분석과 보고서 — 규칙으로 읽고 근거를 붙인다
AI 분석은 지금 보고 있는 범위를 규칙으로 읽어 요약 · 핵심 발견 · 근거를 내놓습니다. 금액은 서비스가 계산한 값만 쓰므로 모델을 끄면 같은 숫자의 규칙 기반 해설이 나옵니다.

모델이 연결되어 있지 않아도 규칙 기반 해설이 나오며, 모든 숫자는 서비스가 계산한 값만 씁니다. 발견 옆 버튼으로 사유 입력창을 바로 열 수 있고, 검토용 PPT 보고서를 내려받을 수 있습니다.
AI 에이전트 — 정해 둔 규칙이 먼저 찾는다
AI 에이전트는 정해 둔 규칙으로 스스로 조회해 걸린 항목을 역할별 대기함에 올립니다. 하루 한 번 제한은 화면이 아니라 서비스의 기록이 판정합니다.

임계값과 사용 여부를 바꿔 저장할 수 있습니다. 규칙은 수수료율, 긴급 통관률, 예정 초과, 요인 영향 등을 봅니다.

실행 기록에는 점검한 규칙 수와 걸린 수가 남습니다. 보고는 역할별로 나뉩니다.

실행 기록에는 완료와 제한 상태가 나란히 보입니다. 화면을 열어 둔 동안의 자동 실행도 같은 제한을 따릅니다.
레이아웃 저장과 복원 — 열자마자 내 화면
축 배치 · 측정값 · 임계 · 역할 · 조회조건을 이름 붙여 저장해 두면 다음에 열 때 그 배치로 시작합니다. 기본으로 지정하고 자동 조회를 켜면 열자마자 조회된 상태입니다.

기본으로 지정하고 자동 조회를 켤 수 있습니다. 자동 조회는 기본으로 지정한 레이아웃에서만 선택됩니다.

같은 이름으로 저장하면 덮어씁니다. 기본으로 지정한 항목은 목록에서 표시됩니다.

위 화면은 통관지별 보관·하역 비중 레이아웃입니다.
좁은 화면과 한계 — 휴대폰 폭과 범위 상한
390px 폭에서는 차트가 표 아래로 내려가 휴대폰에서도 같은 리포트를 봅니다. 열 조합 36개 · 행 노드 1,500개 상한을 넘으면 안내가 나옵니다.

열 축을 줄이거나 차원 값을 골라 범위를 좁히면 다시 그려집니다. 행은 1,500개 노드가 상한입니다.

제목은 줄어들고 AI 분석·AI 에이전트·레이아웃 버튼은 그대로 남습니다. 가로 스크롤은 표 안에만 생깁니다.

요약 영역과 드릴스루 창도 같은 방식으로 한 열이 됩니다. 기능은 넓은 화면과 같습니다.
화면 뒤에서 일어나는 일
조회 버튼을 누르면 화면은 큐브(차원 조합 × 측정값), 예정, 검산 자료를 한 번에 읽어 브라우저에서 피벗을 만듭니다. 이후 축을 옮기거나 값을 고르면 읽어 온 큐브를 다시 집계할 뿐 서버를 부르지 않습니다. 금액이 걸린 계산 — 요인분해, AI 해설, 에이전트 점검 — 은 서비스 한 곳에서만 하고 화면은 그 결과를 읽어 표시합니다.
통관 라인 하나의 부대비 산출
| 단계 | 산식 | 비고 |
|---|---|---|
| 과세가격 | 수량 × 외화 단가 × 환율 | 라인마다 원 단위 반올림 |
| 통관 수수료 | 과세가격 × 수수료율(%) ÷ 100 | 관세사별 수수료율 |
| 검사비 | 수량 × 검사 단가 | 검사 구분(전량 · 선별 · 서류 · 무검사)에 따라 단가가 다름 |
| 보관·하역비 | 수량 × 보관 단가 × 보관 일수 | 일수는 입항부터 허가까지 |
| 서류·내륙운송비 | 수량 × 서류 단가 | |
| 통관 부대비 | 수수료 + 검사비 + 보관·하역비 + 서류·내륙운송비 | IAS 2 취득원가 판단의 점검 자료 |
판정 규칙
| 판정 조건 | 결과 상태 | 사용자 조치 |
|---|---|---|
| 실적 − 예정이 금액 임계(기본 100만원) 이상이고 비율도 임계(기본 10%) 이상, 예정보다 많음 | 빨강 — 점검 필요 | 행을 눌러 요인분해 → 칸을 눌러 통관 라인 확인 → 사유 기록 |
| 같은 크기로 예정보다 적음 | 초록 | 절감 요인이 일회성인지 확인 |
| 금액 · 비율 중 하나만 넘음 | 표시 없음 | 임계를 낮춰 다시 보거나 추이를 확인 |
| 큐브 합계와 통관 라인 합계가 다름 | 점검 필요 | 해당 월 원천 라인과 큐브 생성 기준 확인 |
| 에이전트 규칙의 지표가 임계를 넘음 | 대기함에 보고 | 역할 담당자가 확인하고 사유를 남김 |
| 같은 날 에이전트 두 번째 실행 | 제한(LIMITED) | 새 보고 없이 기록만 남음 |
요인분해 — 순차 치환
실적과 예정의 차이를 아래 순서로 한 요인씩 예정 값에서 실적 값으로 바꿔 가며 변화량을 구합니다. 마지막에 예정에 없던 통관의 부대비를 더하면 총차이와 정확히 같아지고, 화면은 이 등식을 “검산: 요인 합 − 총차이 = 0원”으로 매번 보여 줍니다.
통관 물량 → 외화 단가 → 환율 → 수수료율 → 검사 단가 → 보관 일수 → 서류·내륙 단가 → 미계획 통관
조회조건
| 조건 | 필수 | 기본값 | 비고 |
|---|---|---|---|
| 회사코드 | 필수 | 1000 | |
| 시작 · 종료 통관 신고월 | 필수 | 2026.04 ~ 2026.09 | 시작이 종료보다 늦으면 안내 |
| 차원 값(관세사 · 공급사 · 출항국 · 자재그룹 · 플랜트 · 결제 통화 · 검사 구분 · 통관 방식 · 통관지) | 선택 | 전체 | 여러 값 선택 가능 |
| 비교 · 표시 항목 · 금액 단위 · 임계 | 선택 | 실적 · 통관 부대비 · 백만원 · 100만원/10% | 재조회 없이 바뀜 |
결과 컬럼
| 컬럼 | 의미 | 산출식 |
|---|---|---|
| 행 경로 | 선택한 행 차원의 단계별 값 | |
| 통관 신고월 열 | 월별 값 | 선택한 측정값 또는 계산항목 |
| 합계 | 행 전체 | 칸 값의 합(비율은 분자 · 분모를 따로 더한 뒤 계산) |
| 예정 | 같은 차원의 예정 값 | 예정 대비 모드에서 표시 |
| 차이 · 증감률 | 실적 − 예정, 그 비율 | 임계를 넘을 때만 색 |
좁은 화면에서 달라지는 것
조회조건 · 축 보드 · 요약 · 표 · 차트가 한 열로 쌓이고 차트는 표 아래로 내려갑니다. 표는 가로로 밀어서 보고, 통관 라인 창은 화면 폭에 맞춰 열립니다. 기능은 넓은 화면과 같습니다.
파일 구성
(앱 폴더)
├─ index.html · Component.js · manifest.json
├─ view/ Main.view.xml · fragment/ (Drill · Reason · Ai · Agent · Layout)
├─ controller/ Main.controller.js · BaseController.js
├─ model/ cube.js · chart.js · pptx.js · layout.js · formatter.js · ErrorHandler.js
├─ i18n/ · css/
├─ odata/ (서비스 로직 · 메타데이터 · 데이터)
├─ media/ 소개 영상 · 대표 장면
└─ readme.html
SAP 표준 기능 확장 포인트
이 리포트는 SAP 표준을 대체하지 않습니다. 표준이 이미 잘하는 일은 표준에 맡기고, 표준이 끊기는 자리만 이어 붙이는 쪽으로 만들었습니다. 표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 조회 · 검증 관점을 더해 확장합니다.
표준으로 되는 것과 안 되는 것
| 하고 싶은 일 | 표준 화면으로 충분한 부분 | 이 앱이 더하는 관점 |
|---|---|---|
| 구매 오더 · 입고 · 송장 한 건 확인 | ME23N · MIGO · MIRO · MB51 로 문서 단위 조회 | 여러 건을 관세사 · 검사 구분 · 신고월로 묶어 한 표에서 비교 |
| 관세사 · 운송사 지급 항목 확인 | FBL1N 공급업체 항목 | 지급 이전에 통관 부대비를 예정과 견줘 점검 |
| 예정 부대비 조건 확인 | ME23N 구매 오더 조건 | 예정 합계와 실적 합계의 차이를 요인으로 분해 |
| 어느 라인이 비싼가 | 송장 단위 금액 확인 | 칸에서 통관 라인까지 내려가며 합계가 칸과 같은지 확인 |
| 차이의 원인 | 표준에 요인 분해 화면 없음(보통 엑셀) | 여덟 요인으로 가르고 검산 줄로 확인 |
T-code 별 연계 지점
| T-code | 이름 | 연계 |
|---|---|---|
| ME23N | 구매 오더 조회 | 이 앱이 이어받는 것: 구매 오더 번호 · 품목 · 수량 · 단가 · 예정 부대비 조건. 대사 지점: 라인의 수량 · 단가와 PO 품목. 오가는 방법: 이 앱의 통관 라인 → ME23N 에서 같은 PO 확인. 표준에 남길 일: 발주 변경과 승인. |
| MIGO | 입고 | 입고 일자(수령일)와 자재 문서를 라인의 수령일과 대조. 표준에 남길 일: 입고 전기 자체. |
| MIRO | 송장 검증 | 관세사 · 운송사 송장의 계획 · 비계획 부대비용을 라인 금액과 대조. 표준에 남길 일: 송장 검증과 지급 차단 관리. |
| MB51 | 자재 문서 조회 | 입고 문서의 수량 · 금액과 라인의 통관 수량을 대조. |
| FBL1N | 공급업체 항목 조회 | 관세사 · 운송사별 미지급 · 지급 항목과 이 앱의 관세사별 금액을 견줌. 표준에 남길 일: 지급 처리. |
운영으로 전환해도 기존 표준 리포트를 없애야 하는 것은 아닙니다. 법정 신고, 감사 대응, 회계 처리는 표준 화면이 계속 담당하고, 이 화면은 그 앞단에서 점검 대상을 좁히는 조회 · 검증 도구로 둡니다.
S/4HANA 분석 스택과의 자리
S/4HANA 의 CDS 분석 쿼리와 Fiori 분석 앱, Analysis for Office 는 정해진 분석 질문을 빠르게 답하는 데 좋습니다. 이 리포트는 그 위에서 “차원을 마음대로 옮겨 보고, 칸에서 원천까지 내려가고, 예정과의 차이를 요인으로 가르는” 탐색 쪽을 맡습니다. 같은 CDS 큐브를 서비스로 노출해 두면 표준 분석 도구와 이 화면이 같은 숫자를 봅니다. 구체적인 표준 Fiori 앱 이름은 환경마다 달라 확인 필요로 둡니다.
확장 포인트 — 운영에서 실제로 손대는 자리
| 자리 | 무엇을 정하나 | 비고 |
|---|---|---|
| 부대비용 조건 유형 | 구매 오더 조건 · 송장의 계획 · 비계획 부대비용 중 어느 유형을 통관 부대비로 읽을지 | 고객사마다 다름 — 확인 필요 |
| 통관 라인 원천 | 통관 문서(신고 · 허가 · 검사 정보)를 SAP 어디에 두는지 | 무역 모듈 · 확장 필드 · 외부 시스템 연계 |
| 차원 매핑 | 관세사 · 검사 구분 · 통관 방식 · 통관지 코드와 이름 | 확장 필드 또는 매핑 테이블 |
| 예정 부대비 원천 | 예정 값을 구매 오더 조건에서 올지 별도 계획 테이블에서 올지 | 예정 기준을 정하지 않으면 차이가 흔들림 |
| 권한 | 플랜트 · 구매 조직 기준으로 볼 수 있는 범위 | DCL 로 집계 단계에 적용 |
| 환율 기준 | 과세가격 환산 환율의 유형과 시점 | 샘플은 가정값 |
분석 지표 정의
| 지표 | 산식 · 판정 기준 | 대응 기능 | 원천 데이터 | 비고 |
|---|---|---|---|---|
| 통관 부대비 | 수수료 + 검사비 + 보관·하역비 + 서류·내륙운송비 | 피벗 · 요약 | 통관 원천 라인 | IAS 2 취득원가 판단의 점검 자료 |
| 부대비율 | 통관 부대비 ÷ 과세가격 × 100 | 계산항목 | 큐브 | - |
| 수수료율 | 통관 수수료 ÷ 과세가격 × 100 | 계산항목 · 에이전트 | 큐브 | 관세사별 비교 |
| 긴급 통관률 | 긴급(야간 · 휴일) 라인 ÷ 통관 라인 × 100 | 계산항목 · 에이전트 | 큐브 | 공급사별 감시 |
| 요인별 차이 | 순차 치환, 합 = 총차이 | 워터폴 · 요인분해 | 큐브 + 예정 | 검산 줄 |
CDS 구성
이 사례의 화면은 통관 라인 3,000건에서 만든 큐브 20,640행을 브라우저가 들고 묶습니다. 데모라서 되는 일이고, 운영 데이터에서는 그렇게 하지 않습니다. 운영으로 올릴 때 가장 먼저 하는 일은 집계를 CDS 로 내리는 것입니다. 아래는 그때 만드는 뷰를 레이어 순서대로 적은 것입니다.
코드는 스케치입니다. 필드 이름과 표준 뷰 이름은 릴리스와 환경에 따라 다르므로 그대로 붙여 넣기 전에 View Browser(F2170) 로 실제 이름을 확인해야 합니다. 특히 통관 라인의 원천(통관 신고 · 허가 · 검사 정보를 SAP 어디에 두는지)은 고객사마다 달라 확인 필요로 표시했습니다.
뷰 레이어 구성
| 레이어 | 뷰 | 하는 일 | 왜 나누나 |
|---|---|---|---|
| 기준 | zclr_cost_map | 조건 유형 → 부대비 항목(수수료 · 검사 · 보관 · 서류) 매핑 | 조건 유형은 고객사마다 다릅니다. 코드에 박으면 늘어날 때마다 개발자를 부르게 됩니다. |
| 원천 | ZI_ClrDeclaration | 통관 라인 한 행 + 구매 오더 품목 + 관세사 · 검사 구분 | 큐브와 드릴스루가 같은 원천 하나를 보게 합니다. |
| 큐브(실적) | ZI_ClrActualCube | 통관 라인을 차원 조합으로 집계 | 화면이 들고 묶던 일을 DB 로 내립니다. |
| 큐브(예정) | ZI_ClrPlanCube | 구매 오더 조건의 예정 부대비를 같은 키 모양으로 집계 | 키가 어긋나면 예정이 실적 옆에 붙지 않고 따로 뜹니다. |
| 큐브(통합) | ZI_ClrCube | 실적 + 예정 + 차이 | 차이를 화면에서 빼지 않고 여기서 한 번만 정의합니다. |
| 쿼리 | ZC_ClrCostQuery | 행 · 열 기본 배치와 계산 측정값 | 표준 Fiori 분석 앱과 Analysis for Office 가 그대로 띄웁니다. |
| 권한 | ZI_CLRCUBE (DCL) | 회사코드 · 플랜트 · 구매 조직 | 집계를 읽는 자리에 걸어야 뺄셈으로 새지 않습니다. |
| 노출 | ZI_ClrCostService_O2 | 서비스 정의 + 바인딩(OData V2) | 이 앱이 읽는 엔티티셋 이름은 그대로 두고 원천만 바꿉니다. |
① 부대비 항목 매핑 테이블
리포트의 모든 금액이 이 표에서 갈립니다. 구매 오더 조건이나 송장의 부대비용 유형 중 어느 것을 수수료로, 어느 것을 검사비로 읽을지 정하는 자리라 운영 전환에서 가장 먼저 합의해야 하는 항목입니다. 유효기간을 둔 이유는 조건 체계가 바뀌어도 과거 숫자가 흔들리지 않게 하기 위해서입니다.
" ────────────────────────────────────────────────────────────────
" zclr_cost_map — 조건 유형 → 통관 부대비 항목 매핑 (투명 테이블)
" 코드에 박지 않는 이유 : 조건 유형은 고객사마다 다르고 늘어난다.
" ────────────────────────────────────────────────────────────────
@EndUserText.label : '통관 부대비 항목 매핑'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #C " 고객 유지 — 전송(TR)으로 옮긴다
@AbapCatalog.dataMaintenance : #ALLOWED " SM30 뷰를 함께 만들어 둔다
define table zclr_cost_map {
key mandt : mandt not null;
key kschl : kscha not null; " 조건 유형 (확인 필요 — 고객사별)
key valid_to : abap.dats not null;
item_kind : abap.char(4); " FEE 수수료 · INSP 검사 · STOR 보관 · DOC 서류
planned : abap.char(1); " X = 구매 오더의 예정 조건, 공백 = 송장 실적
sort_no : abap.int4;
}
② 통관 라인 원천 뷰
큐브와 드릴스루가 함께 읽는 한 행 = 통관 라인입니다. 통관 신고 · 허가 · 검사 정보를 어디에 두는지는 환경마다 다릅니다. 무역 모듈, 확장 필드, 외부 통관 시스템 연계 중 하나이므로 아래 zclr_decl 자리는 확인 필요 항목입니다. 구매 오더 품목과의 연결 키(번호 · 품목)만은 유지해야 ME23N 대조가 됩니다.
" ────────────────────────────────────────────────────────────────
" ZI_ClrDeclaration — 통관 라인 (원천)
" zclr_decl : 통관 신고 · 허가 · 검사 정보를 담은 고객사 테이블 (확인 필요)
" ────────────────────────────────────────────────────────────────
@AbapCatalog.viewEnhancementCategory : [#NONE]
@AccessControl.authorizationCheck : #CHECK
@EndUserText.label : '통관 라인'
@Analytics.dataCategory : #DIMENSION
@ObjectModel.representativeKey : 'ClearanceNo'
define view entity ZI_ClrDeclaration
as select from zclr_decl as Decl
inner join I_PurchaseOrderItem as Poi " 뷰 이름은 릴리스 확인
on Poi.PurchaseOrder = Decl.ebeln
and Poi.PurchaseOrderItem = Decl.ebelp
{
key Decl.clr_no as ClearanceNo,
key Decl.clr_item as ClearanceItem,
Decl.ebeln as PurchaseOrder,
Decl.ebelp as PurchaseOrderItem,
Poi.CompanyCode as Bukrs,
Poi.Plant as Werks,
Poi.Material as Matnr,
Decl.bl_no as BlNo,
Decl.broker as Broker, " 관세사
Decl.insp_kind as InspKind, " 전량 · 선별 · 서류 · 무검사
Decl.customs as Customs, " 통관지
Decl.decl_date as DeclDate,
Decl.recv_date as RecvDate,
Decl.urgent as UrgentFlag, " 긴급(야간 · 휴일)
Decl.qty as Qty,
Decl.price_fc as PriceFc,
Decl.currency as Currency,
Decl.rate as ExchRate
}
③ 실적 큐브
차원 조합마다 한 행입니다. group by 에 올린 필드가 곧 리포트에서 쓸 수 있는 차원입니다. 여기에 없는 차원은 화면에서도 쓸 수 없으므로 처음에 넉넉히 잡아 두되, 차원을 늘릴수록 행이 곱으로 늘어 집계 효과가 줄어드는 점은 감안합니다. 이 앱의 차원은 열한 가지(관세사 · 검사 구분 · 통관지 · 공급사 · 통관 신고월 · 분기 · 플랜트 · 자재그룹 · 통화 · 출항국 · 통관 방식)입니다.
" ────────────────────────────────────────────────────────────────
" ZI_ClrActualCube — 실적 큐브
" 통관 라인의 부대비를 DB 에서 더해 올린다.
" 화면이 들고 묶던 일을 여기로 내리는 것이 운영 전환의 핵심이다.
" ────────────────────────────────────────────────────────────────
@AbapCatalog.viewEnhancementCategory : [#NONE]
@AccessControl.authorizationCheck : #CHECK " ← DCL 을 반드시 붙인다
@EndUserText.label : '통관 부대비 큐브 (실적)'
@Analytics.dataCategory : #CUBE
define view entity ZI_ClrActualCube
as select from ZI_ClrDeclaration as Decl
association [0..*] to ZI_ClrCostLine as _Cost " 라인별 부대비 (송장 기준)
on _Cost.ClearanceNo = $projection.ClearanceNo
{
key Decl.Bukrs as Bukrs,
key left( cast( Decl.DeclDate as abap.char(8) ), 6 ) as Period, " 통관 신고월
key Decl.Broker as Broker,
key Decl.InspKind as InspKind,
key Decl.Customs as Customs,
key Decl.Werks as Werks,
key cast( 'A' as abap.char(1) ) as RecordType, " A 실적 / P 예정
" ── 파생 차원 — 라인에는 없다. 큐브에서 만든다.
concat( 'Q', cast( division( cast( substring( cast( Decl.DeclDate as abap.char(8) ), 5, 2 )
as abap.int4 ) + 2, 3, 0 ) as abap.char(1) ) ) as Quarter,
" ── 측정값
@DefaultAggregation : #SUM
@Semantics.amount.currencyCode : 'Waers'
sum( _Cost.FeeAmt ) as FeeAmt, " 통관 수수료
@DefaultAggregation : #SUM
sum( _Cost.InspAmt ) as InspAmt, " 검사비
@DefaultAggregation : #SUM
sum( _Cost.StorAmt ) as StorAmt, " 보관·하역비
@DefaultAggregation : #SUM
sum( _Cost.DocAmt ) as DocAmt, " 서류·내륙운송비
@DefaultAggregation : #SUM
sum( cast( Decl.Qty as abap.dec(15,3) )
* Decl.PriceFc * Decl.ExchRate ) as GoodsAmt, " 과세가격
@DefaultAggregation : #SUM
count( * ) as LineCnt,
@Semantics.currencyCode : true
max( Decl.Currency ) as Waers
}
group by
Decl.Bukrs, Decl.DeclDate, Decl.Broker, Decl.InspKind, Decl.Customs, Decl.Werks
④ 예정 큐브
실적과 같은 키 모양으로 맞추는 것이 전부입니다. 예정 값을 구매 오더 조건에서 올지, 별도 계획 테이블에서 올지가 운영에서 반드시 걸리는 질문입니다. 여기가 정해지지 않으면 “예정이 왜 이 숫자냐” 가 끝나지 않습니다.
" ────────────────────────────────────────────────────────────────
" ZI_ClrPlanCube — 예정 큐브
" 예정 부대비 = 구매 오더 조건(planned = 'X' 로 매핑된 유형)을 같은 차원으로 집계
" 예정 기준을 정하지 않으면 차이가 흔들린다 → 운영 전환 첫 합의 항목
" ────────────────────────────────────────────────────────────────
@AbapCatalog.viewEnhancementCategory : [#NONE]
@AccessControl.authorizationCheck : #CHECK
@EndUserText.label : '통관 부대비 큐브 (예정)'
@Analytics.dataCategory : #CUBE
define view entity ZI_ClrPlanCube
as select from ZI_ClrDeclaration as Decl
association [0..*] to ZI_ClrPlanCond as _Plan " 구매 오더 조건 (확인 필요)
on _Plan.PurchaseOrder = Decl.PurchaseOrder
and _Plan.PurchaseOrderItem = Decl.PurchaseOrderItem
{
key Decl.Bukrs as Bukrs,
key left( cast( Decl.DeclDate as abap.char(8) ), 6 ) as Period,
key Decl.Broker as Broker,
key Decl.InspKind as InspKind,
key Decl.Customs as Customs,
key Decl.Werks as Werks,
key cast( 'P' as abap.char(1) ) as RecordType,
@DefaultAggregation : #SUM
sum( _Plan.FeeAmt ) as FeeAmt,
@DefaultAggregation : #SUM
sum( _Plan.InspAmt ) as InspAmt,
@DefaultAggregation : #SUM
sum( _Plan.StorAmt ) as StorAmt,
@DefaultAggregation : #SUM
sum( _Plan.DocAmt ) as DocAmt
}
group by
Decl.Bukrs, Decl.DeclDate, Decl.Broker, Decl.InspKind, Decl.Customs, Decl.Werks
⑤ 실적 + 예정 통합 큐브
화면의 예정 대비 차이는 여기서 한 번만 정의합니다. 같은 키로 맞물린 두 큐브를 합치고, 한쪽에만 있는 키(예정에 없던 통관)도 놓치지 않도록 union 으로 합칩니다. 이 앱이 “미계획 통관” 요인을 따로 두는 이유가 이 구조입니다.
" ────────────────────────────────────────────────────────────────
" ZI_ClrCube — 실적 + 예정 통합
" join 이 아니라 union : 예정 없이 실적만 있는 키(미계획 통관)도 살린다.
" ────────────────────────────────────────────────────────────────
@AbapCatalog.viewEnhancementCategory : [#NONE]
@AccessControl.authorizationCheck : #CHECK
@EndUserText.label : '통관 부대비 큐브 (통합)'
@Analytics.dataCategory : #CUBE
define view entity ZI_ClrCube
as select from ZI_ClrActualCube
{
key Bukrs, key Period, key Broker, key InspKind, key Customs, key Werks, key RecordType,
@DefaultAggregation : #SUM FeeAmt,
@DefaultAggregation : #SUM InspAmt,
@DefaultAggregation : #SUM StorAmt,
@DefaultAggregation : #SUM DocAmt
}
union all
select from ZI_ClrPlanCube
{
key Bukrs, key Period, key Broker, key InspKind, key Customs, key Werks, key RecordType,
FeeAmt, InspAmt, StorAmt, DocAmt
}
⑥ 분석 쿼리
행 · 열 기본 배치와 계산 측정값을 정의합니다. 표준 Fiori 분석 앱과 Analysis for Office 가 이 쿼리를 그대로 띄우므로, 이 앱을 쓰지 않는 사용자에게도 같은 숫자가 나갑니다. 부대비율 · 수수료율은 분자와 분모를 따로 더한 뒤 나누는 계산 측정값이어야 소계가 맞습니다.
" ────────────────────────────────────────────────────────────────
" ZC_ClrCostQuery — 분석 쿼리
" ────────────────────────────────────────────────────────────────
@AccessControl.authorizationCheck : #CHECK
@EndUserText.label : '통관 부대비 분석'
@Analytics.query : true
define view entity ZC_ClrCostQuery
as select from ZI_ClrCube
{
@AnalyticsDetails.query.axis : #ROWS Broker,
@AnalyticsDetails.query.axis : #ROWS InspKind,
@AnalyticsDetails.query.axis : #COLUMNS Period,
@Consumption.filter.selectionType : #SINGLE Bukrs,
@EndUserText.label : '통관 부대비'
@AnalyticsDetails.query.axis : #COLUMNS
FeeAmt + InspAmt + StorAmt + DocAmt as AddCost,
@EndUserText.label : '수수료율(%)'
@AnalyticsDetails.query.formula : 'FeeAmt * 100 / GoodsAmt'
cast( 0 as abap.dec(7,3) ) as FeeRate
}
⑦ 권한 (DCL)
권한은 집계를 읽는 자리에 겁니다. 합계에서 한 지점을 빼면 남의 숫자가 계산으로 나오기 때문입니다. 이 앱의 역할(재무 · 구매 · 물류 · 자금 책임자)은 화면의 첫 지표를 고르는 용도이고, 접근 통제는 아래 DCL 이 맡습니다.
@EndUserText.label : '통관 부대비 큐브 권한'
@MappingRole : true
define role ZI_CLRCUBE {
grant select on ZI_ClrActualCube
where ( Bukrs ) = aspect pfcg_auth ( M_BEST_BSA, BUKRS, ACTVT = '03' )
and ( Werks ) = aspect pfcg_auth ( M_BEST_WRK, WERKS, ACTVT = '03' );
}
⑧ 서비스 정의와 바인딩
큐브와 원천을 서비스로 노출합니다. 이 앱의 엔티티셋 이름(큐브 · 예정 · 통관 원천 라인 …)은 그대로 두고 데이터 원천만 바꾸는 것이 운영 전환의 목표입니다. 화면 코드가 달라지지 않는지는 서비스 메타데이터를 앞뒤로 비교해 확인합니다.
@EndUserText.label : '통관 부대비 분석 서비스'
define service ZI_ClrCostService {
expose ZI_ClrCube as CubeSet;
expose ZI_ClrDeclaration as ItemSet;
expose ZC_ClrCostQuery;
}
" 바인딩 : ZI_ClrCostService_O2 — OData V2 - UI (ADT 에서 Publish)
운영 시점에 해야 할 일
개발보다 정하는 일이 많습니다. 아래 표의 왼쪽은 대부분 코딩이 아니라 합의입니다.
| 해야 할 일 | 무엇을 정하나 | 정하지 않으면 | 누가 |
|---|---|---|---|
| 부대비 조건 유형 매핑 | 수수료 · 검사 · 보관 · 서류에 해당하는 조건 유형. 예정(구매 오더 조건)과 실적(송장 부대비용)을 각각 어떤 유형으로 읽을지 | 리포트 숫자가 관세사 청구서와 어긋나 첫 회의에서 막힙니다 | 구매 · 회계 담당 |
| 통관 라인 원천 확정 | 통관 신고 · 허가 · 검사 정보를 담는 곳(무역 모듈 · 확장 필드 · 외부 시스템) | 큐브를 만들 원천이 없습니다 — 확인 필요 | 수입 담당 · IT |
| 예정 기준 확정 | 예정 값을 구매 오더 조건에서 올지 별도 계획에서 올지, 변경 시 어느 시점 값을 기준으로 둘지 | “예정이 왜 이 숫자냐” 가 반복됩니다 | 구매 · 원가 |
| 차원 코드 정리 | 관세사 · 검사 구분 · 통관 방식 · 통관지의 코드와 이름 | 같은 관세사가 여러 이름으로 갈립니다 | 구매 · 물류 |
| 환율 기준 | 과세가격 환산 환율의 유형(고시 · 평균 · 신고일)과 시점 | 환율 요인이 의미를 잃습니다 | 자금 · 회계 |
| 차원 범위 확정 | 큐브 group by 에 올릴 차원 | 나중에 뷰를 고치고 다시 전송해야 합니다 | 현업 · IT |
| 권한 설계 | 회사코드 · 플랜트 · 구매 조직 중 무엇으로 자를지. 전사 합계를 누구까지 볼지 | 뺄셈으로 남의 사업장 숫자가 새어 나갑니다 | 권한 담당 · 보안 |
| 성능 기준 잡기 | 한 번 조회가 몇 초까지 허용되는지, 큐브 행이 몇 건까지 나오는지 | 운영 첫날 “느리다” 로 되돌아옵니다 | Basis · IT |
| 대사 체계 | 표준 화면(MB51 · FBL1N)과 맞출 항목과 주기 | 숫자를 믿지 않아 아무도 쓰지 않습니다 | 회계 |
| 서비스 활성화 · 주소 교체 | 서비스 바인딩을 게시하고(/IWFND/MAINT_SERVICE 또는 바인딩 게시), 화면 설정 파일(manifest.json)의 서비스 주소를 새 주소로 바꿉니다 | 화면이 샘플 서비스를 계속 읽습니다 | IT · Basis |
| 전송(TR) 순서 | 테이블 → 원천 → 큐브 → 쿼리 → DCL → 서비스 바인딩 | 이송 중 활성화 오류가 납니다 | IT |
| 배치 등록 | AI 에이전트를 사람이 열 때만 돌릴지, 배치로 하루 한 번 돌릴지 | 비용이 튄 달에 아무도 열지 않으면 점검이 없습니다 | Basis · 수입 담당 |
운영 데이터로 갈 때 — 통관 라인이 수백만 건이면
이 사례는 통관 라인 3,000건에서 큐브 20,640행이 나옵니다. 통관 라인이 수백만 건이 되어도 큐브 행 수는 라인 건수가 아니라 차원 조합 수를 따라갑니다 — 관세사 · 검사 구분 · 통관지 · 신고월 조합만큼 늘어납니다. 그래서 집계만 DB 로 내리면 화면이 들고 있을 행 수는 크게 달라지지 않습니다.
| 구간 | 어떻게 되나 | 무엇을 손보나 |
|---|---|---|
| 큐브 수천~수만 행 | 지금 방식 그대로 — 브라우저가 들고 묶어도 걸리지 않습니다 | 손볼 것 없음 |
| 큐브 수십만 행 | 축을 바꿀 때 눈에 띄게 걸립니다 | CDS 에서 집계 수준을 올립니다(쓰지 않는 차원을 빼거나 기간을 묶음) |
| 큐브 수백만 행 | 브라우저가 들고 있을 수 없습니다 | 묶기를 서비스로 옮기고 $apply=groupby(...) 로 필요한 조합만 받습니다 |
| 통관 라인 조회 | 전체를 내리면 수백 MB | $top 으로 일정 건수만 받고 건수는 $inlinecount 로 숫자만 받습니다 |
한 가지 더. 드릴스루는 집계가 아니라 조회입니다. 칸 하나에 수십만 건이 매달려 있으면 그 창이 열리지 않으므로, 건수를 먼저 세어 보고 일정 수를 넘으면 범위를 좁히라고 말하는 편이 낫습니다. 이 앱도 열 조합이 36개를 넘으면 그리지 않고 안내만 띄웁니다.
숫자를 믿을 수 있는가 — 검증 결과
검증용 샘플 데이터에서 아래 항목을 전수로 확인했습니다. 운영 데이터로 옮긴 뒤에도 같은 대사를 같은 기준으로 다시 돌립니다.
| 검증 항목 | 기준 | 결과 |
|---|---|---|
| 큐브 합계 ↔ 통관 라인 합계 | 측정값 8개 모두 차이 0 | 차이 0 |
| 통관 라인 부대비 합 검사 | 라인 3,000건의 수수료 · 검사 · 보관 · 서류 합이 부대비와 같음 | 차이 0건 |
| 요인 합 ↔ 총차이 | 여덟 요인 합이 예정 대비 총차이와 같음 | 검산 0원 (총차이 +100,769,161원) |
| 축 변경 시 서버 호출 | 축을 옮겨도 요청 0건 | 0건 (축 조합 5가지 검사) |
| 칸 금액 ↔ 드릴스루 합계 | 한 칸을 눌러 열린 라인 합이 칸 금액과 같음 | 일치 (486라인) |
| 에이전트 하루 한 번 제한 | 같은 날 두 번째 호출은 새 보고를 올리지 않음 | 제한 판정 확인 |
| 화면 기능 점검 | 15가지 기능을 실제 브라우저에서 실행 | 15가지 모두 통과 |
| 화면 오류 | 콘솔 오류 | 0건 |
자주 묻는 질문
도입 상담과 데모에서 자주 받는 질문을 네 묶음으로 적었습니다.
숫자와 산식
통관 부대비에는 무엇이 들어갑니까?
통관 수수료, 검사비, 보관·하역비, 서류·내륙운송비 네 가지를 더한 값입니다. 검증용 샘플에서는 수수료 132,576,805원, 검사비 475,713,250원, 보관·하역비 124,919,476원, 서류·내륙운송비 116,559,775원으로 합계 849,769,306원(약 8.50억원)입니다. 과세가격은 이 합계에 들어가지 않고 부대비율의 분모로만 쓰입니다.
예정 대비 차이를 여덟 요인으로 나누는 순서는 무엇이고 합이 왜 맞습니까?
통관 물량, 외화 단가, 환율, 수수료율, 검사 단가, 보관 일수, 서류·내륙 단가, 미계획 통관 순서입니다. 앞의 일곱 요인은 예정 값에서 실적 값으로 하나씩 바꿔 가며 변화량을 구하는 순차 치환이고, 마지막 미계획 통관은 예정에 없던 통관 라인의 부대비를 그대로 더합니다. 순서대로 갈아 끼우면 중간 값이 서로 겹치지 않고 이어지므로 합이 총차이와 정확히 같아지며, 화면은 이 등식을 “검산: 요인 합 − 총차이 = 0원” 으로 매번 보여 줍니다.
요인 순서를 바꾸면 요인별 금액이 달라지지 않습니까?
달라집니다. 순차 치환은 앞 요인이 먼저 바뀐 상태에서 다음 요인을 재므로 순서가 바뀌면 요인별 금액이 조금 움직입니다. 달라지지 않는 것은 합계입니다. 어떤 순서로 가르든 여덟 요인의 합은 총차이와 같습니다. 그래서 순서를 화면에 고정해 두고 같은 기준으로 매달 비교하게 했습니다.
미계획 통관은 어떻게 판정합니까?
예정 자료에 같은 키가 없는데 실적에는 있는 통관 라인입니다. 샘플에서는 196라인이며 부대비가 61,895,915원으로 총차이 100,769,161원의 절반을 넘습니다. 물량이나 단가처럼 평균으로 설명되지 않는 몫이라 별도 요인으로 떼어 두었습니다.
검사 단가 요인이 마이너스로 나오는데 맞습니까?
맞습니다. 샘플에서 −17,989,150원으로, 검사 구분이 예정과 달라진 라인에서 단가가 낮은 구분으로 통관된 효과입니다. 색은 금액 부호가 아니라 “예정보다 부대비를 늘렸는가” 로 칠하므로 부대비를 줄인 요인은 초록으로 보입니다. 다만 절감이 일회성인지, 검사를 덜 해서 생긴 위험은 아닌지는 사람이 판단할 일입니다.
칸 금액과 통관 라인 합계가 정말 같습니까?
같습니다. 큐브가 통관 라인을 더해 만든 값이기 때문입니다. 한 관세사 행 범위의 칸(135.6백만원)을 누르면 486라인이 열리고 그 합계가 칸 금액과 같으며, 창 맨 위에 건수와 합계를 적어 눈으로 확인할 수 있게 했습니다. 만드는 쪽에서도 큐브 20,640행을 라인 3,000건에서 다시 집계해 금액과 건수가 모두 0 차이인지 대사합니다.
소계와 합계 열의 비율은 어떻게 계산합니까?
비율은 각 칸의 분자와 분모를 따로 더한 뒤 나눕니다. 칸 값의 비율을 평균하면 소계가 틀어지기 때문입니다. 부대비율과 수수료율 모두 이 방식이어서 어느 축으로 묶어도 합계 칸이 전체 값과 일치합니다.
외화와 환율은 어떻게 처리합니까?
과세가격은 수량 × 외화 단가 × 환율로 라인마다 원 단위로 반올림해 구하고, 결제 통화는 차원으로 올려 두었습니다. 통화가 섞인 행은 더할 수 없으므로 통화별 금액을 원화로 환산한 값만 더합니다.
환율 요인은 예정 환율과 실적 환율의 차이로 따로 잡힙니다. 샘플에서는 +274,404원으로 영향이 작았습니다. 운영에서는 환율 유형(고시 · 평균 · 신고일)과 환산 시점을 먼저 정해야 하고, 그 기준이 정해지면 같은 산식이 그대로 돕니다.
차이에 색이 칠해지는 기준은 무엇입니까?
금액 임계(기본 100만원)와 비율 임계(기본 10%)를 둘 다 넘을 때만 색을 칠합니다. 작은 항목의 큰 증가율이나 큰 항목의 작은 흔들림까지 칠하면 화면이 온통 빨개져 정작 볼 것이 묻히기 때문입니다. 두 임계는 화면에서 바꿀 수 있습니다.
화면과 사용
축을 바꿀 때 서버를 다시 부릅니까?
부르지 않습니다. 조회할 때 큐브와 예정, 검산 자료를 한 번에 읽어 오고, 축을 옮기거나 값을 고르면 읽어 온 큐브를 브라우저에서 다시 집계합니다. 축 조합 다섯 가지를 바꿔 가며 확인했을 때 추가 요청은 0건이었습니다.
행과 열은 몇 단계까지, 몇 개까지 놓을 수 있습니까?
행은 3단계, 열은 2단계까지입니다. 열 조합이 36개를 넘거나 행 노드가 1,500개를 넘으면 표를 그리지 않고 안내를 띄웁니다. 열 축을 줄이거나 차원 값을 골라 범위를 좁히면 다시 그려집니다.
역할을 고르면 무엇이 달라집니까?
재무, 구매, 물류, 자금 책임자 네 역할마다 기본 행 축과 먼저 볼 측정값이 바뀝니다. 같은 큐브를 다른 질문으로 읽는 것이라 별도 조회는 일어나지 않고, 표의 숫자도 같습니다. 접근 통제와는 별개입니다 — 누가 어떤 사업장을 볼 수 있는지는 권한이 정합니다.
변동 사유는 어디에 저장되고 언제까지 남습니까?
조회 범위(회사코드와 기간)와 행 경로에 묶여 사유 저장소에 남습니다. 새로 고치거나 다시 조회해도, 축을 바꿔도 같은 행이면 따라옵니다. 같은 행의 사유는 수정과 삭제가 가능하고, 저장 당시의 차이 금액과 비율이 함께 남습니다.
레이아웃에 저장되는 것은 무엇입니까?
축 배치, 측정값, 비교 모드, 임계, 역할, 조회조건입니다. 이름을 붙여 저장하고, 기본으로 지정하면 열 때 그 배치로 시작합니다. 자동 조회는 기본으로 지정한 레이아웃에서만 켤 수 있습니다.
권한과 보안은 어떻게 걸립니까?
접근 통제는 화면이 아니라 CDS 의 권한(DCL)이 맡습니다. 회사코드와 플랜트, 구매 조직 같은 표준 권한 객체로 집계를 읽는 자리에 겁니다. 드릴스루에만 걸면 합계에서 한 곳을 빼는 계산으로 남의 숫자가 새어 나가기 때문입니다.
화면의 역할(재무 · 구매 · 물류 · 자금 책임자)은 먼저 볼 지표를 고르는 용도입니다. AI 모델을 연결하지 않으면 외부로 나가는 전송이 없고, 연결하더라도 API 키는 파일이 아니라 환경 변수로만 읽습니다.
좁은 화면에서도 쓸 수 있습니까?
390px 폭에서 확인했습니다. 조회조건과 축 보드, 요약, 표, 차트가 한 열로 쌓이고 차트는 표 아래로 내려갑니다. 표는 가로로 밀어서 보며, 가로 스크롤은 표 안에서만 생깁니다.
AI 분석과 에이전트
AI 가 숫자를 만들어 내지는 않습니까?
만들지 않습니다. 금액과 비율은 서비스가 계산한 값만 쓰고, AI 해설은 그 값을 읽어 문장으로 풀 뿐입니다. 모델을 연결하지 않은 기본 상태에서도 규칙 기반 해설이 같은 근거 표와 함께 나옵니다. 모델을 켜더라도 숫자 자리는 서비스 값으로 고정됩니다.
AI 모델은 어떻게 연결합니까?
서비스 폴더의 설정 파일에서 사용 여부를 켭니다. API 키는 파일에 적지 않고 환경 변수로만 읽습니다. 설정 파일이 없으면 꺼진 상태입니다. 사내망 정책에 따라 외부 모델을 쓸 수 없는 환경이면 켜지 않고 규칙 기반으로 운영해도 화면은 같습니다.
AI 에이전트는 무엇을 점검합니까?
감시 규칙 여섯 개를 역할별로 둡니다. 관세사 수수료율, 공급사 긴급 통관률, 예정 초과, 요인 영향 같은 지표가 임계를 넘으면 받을 역할의 눈으로 다시 적어 대기함에 올립니다. 임계값과 사용 여부는 화면에서 바꿔 저장합니다.
하루 한 번만 도는 이유는 무엇입니까?
같은 항목이 매 시간 대기함에 쌓이면 사람이 대기함을 열지 않게 되기 때문입니다. 제한은 화면이 아니라 서비스의 실행 기록이 판정하므로, 화면을 여러 개 열어도 같은 날 두 번째 실행은 새 보고 없이 “제한” 으로만 기록됩니다.
PowerPoint 보고서에는 무엇이 들어갑니까?
보고 있는 범위의 요약, 핵심 발견, 요인 워터폴, 표입니다. 브라우저에서 바로 만들어지고 서버 호출이 없습니다. 숫자는 화면과 같은 서비스 값이며, 점검 회의 자료의 초안으로 쓰도록 만들었습니다.
도입과 운영
이 리포트는 누가 어떤 효과를 보려고 씁니까?
구매 · 물류 · 재무 · 원가 담당이 같은 큐브를 서로 다른 질문으로 읽도록 만들었습니다. 효과는 숫자를 줄이는 데 있는 것이 아니라 월말 점검 준비에서 엑셀 취합과 숫자 맞추기를 덜어, 회의가 “무엇을 확인할 것인가” 로 옮겨 가게 하는 데 있습니다.
시간 절감률 같은 수치는 환경마다 달라 약속하지 않습니다. 이 글에 있는 숫자는 모두 검증용 샘플에서 나온 값입니다.
언제부터 어디까지 적용할 수 있습니까?
현재 확인된 것은 샘플 데이터에서 화면과 산식이 돌아간다는 점입니다. 운영 적용 범위는 조건 유형 매핑, 통관 라인 원천, 예정 기준을 정한 뒤에 확정됩니다. 그전에는 적용 시기를 말씀드릴 수 없습니다.
순서는 대체로 합의(매핑 · 원천 · 예정 기준) → CDS 뷰 작성과 권한 → 서비스 게시와 주소 교체 → 대사 확인입니다.
SAP 표준 화면은 이제 안 써도 됩니까?
계속 씁니다. 구매 오더(ME23N), 입고(MIGO), 송장 검증(MIRO), 자재 문서(MB51), 공급업체 항목(FBL1N) 같은 표준 화면은 문서 단위 처리와 회계 처리를 맡고, 이 앱은 그 앞단에서 여러 건을 묶어 점검 대상을 좁히는 조회 · 검증 도구입니다. 통관 라인의 번호를 그대로 보여 주므로 표준 화면에서 같은 문서를 바로 찾을 수 있습니다.
운영 데이터로 옮길 때 가장 먼저 정할 것은 무엇입니까?
부대비 조건 유형 매핑과 통관 라인 원천입니다. 어느 조건 유형을 수수료로, 어느 것을 검사비로 읽을지, 통관 신고 · 허가 · 검사 정보가 SAP 어디에 있는지는 고객사마다 달라 확인이 필요합니다. 이 둘이 정해지면 나머지는 CDS 뷰 작성과 권한 설계입니다.
샘플 데이터의 숫자를 운영 기준으로 봐도 됩니까?
안 됩니다. 샘플은 화면과 산식을 검증하려고 만든 가정 데이터(2026년 4월~9월, 통관 라인 3,000건)입니다. 환율, 단가, 수수료율도 가정값입니다. 검증된 것은 “이 화면이 같은 입력에서 같은 숫자를 내고, 합이 맞는다” 는 점이지 특정 회사의 실제 부대비 수준이 아닙니다.
IAS 2 재고자산과는 어떤 관계입니까?
통관 부대비 중 취득원가에 넣을 수 있는 것과 아닌 것을 가르는 판단의 점검 자료로 씁니다. 이 앱은 회계 처리를 하지 않고, 어떤 비용이 얼마나 어디서 났는지를 근거와 함께 보여 주는 데까지입니다. 취득원가 산입 여부는 회사의 회계 정책과 감사인의 판단이 정합니다.
유지보수는 무엇을 하게 됩니까?
정기적으로 손이 가는 곳은 사실상 부대비 조건 유형 매핑 하나입니다. 새 조건 유형이 생기면 어느 항목인지 적어 줘야 하고, 적지 않으면 합계가 어긋납니다. 그 밖에는 예정 기준이 바뀔 때와 감시 규칙의 임계값을 조정할 때뿐이고, 임계값은 화면에서 고치므로 개발이 필요 없습니다.
숫자가 기존 보고서와 다르면 어떻게 확인합니까?
순서가 있습니다. 첫째, 조회 범위(회사코드와 통관 신고월)가 같은지 봅니다. 둘째, 부대비 조건 유형 매핑을 봅니다. 셋째, 칸을 눌러 통관 라인을 펼치고 표준 화면과 번호 · 금액을 맞춰 봅니다. 넷째, 예정 값의 기준이 같은지 확인합니다 — 구매 오더 변경 이력 때문에 어긋나는 일이 가장 흔합니다.
조건 유형이나 매핑이 바뀌면 어떻게 합니까?
매핑 테이블에 새 조건 유형을 적고 유효기간을 둡니다. 과거 기간은 옛 매핑으로, 이후 기간은 새 매핑으로 읽히므로 이미 낸 숫자가 흔들리지 않습니다. 적지 않은 조건 유형은 어느 항목에도 들어가지 않아 합계가 표준 화면과 어긋나므로, 운영 대사에서 가장 먼저 보는 자리입니다.
통관 라인이 수백만 건이면 느리지 않습니까?
큐브 행 수는 라인 건수가 아니라 차원 조합 수를 따라가므로 집계를 CDS 로 내리면 화면이 들고 있는 행 수는 크게 달라지지 않습니다. 큐브가 수십만 행을 넘으면 묶기를 서비스로 옮겨 필요한 조합만 받고, 라인 조회는 일정 건수씩 나눠 읽습니다.
샘플은 라인 3,000건에서 큐브 20,640행이었습니다. 운영 규모의 응답 시간은 환경마다 달라 성능 기준을 먼저 정해 두어야 합니다.
이 리포트의 숫자로 관세 신고나 회계 처리를 해도 됩니까?
안 됩니다. 이 리포트는 점검 도구이며 최종 판단은 회사와 감사인이 합니다. 관세 신고는 회사와 관세사의 판단이고, 통관 부대비를 재고 취득원가에 넣을지는 IAS 2 재고자산(K-IFRS 제1002호)과 회사 회계 정책에 따라 회계 담당과 감사인이 정합니다. 이 화면은 어떤 비용이 얼마나 어디서 났는지를 근거와 함께 보여 주는 데까지입니다.
다음 단계는 무엇입니까?
현재 SAP 환경에서 부대비 조건 유형과 통관 라인 원천이 어떻게 되어 있는지 함께 확인하는 것부터 시작합니다. 그 결과로 CDS 뷰 범위와 권한, 일정을 정합니다. 위 데모와 검토용 자료로 먼저 화면을 보시고 문의해 주세요.