SAP 환전·송금 환율 스프레드 점검 — 은행에 더 낸 원화를 기준 환율로 다시 계산해 허용 범위·은행 통지·장부와 견주는 자금 화면
적용 환율과 기준 환율 재계산 · 허용 스프레드 판정 · 은행 통지와 장부 금액 대사 — 소개 영상과 실제 화면 6종, 그리고 CDS 구성까지
소개 영상1분 29초8개 장면음성 안내·자막조회 조건과 요약 → 점검 필요 거래 → 상세 → 은행·통화 집계 → 허용 스프레드 정책 → 대사 결과
개발 배경 — 이 앱을 사용해야 하는 이유
외화를 사거나 팔 때, 해외로 송금할 때 자금 담당이 마주치는 질문은 늘 비슷합니다. 은행이 적용한 환율이 그날의 기준 환율과 얼마나 벌어졌는가, 그 차이가 회사가 은행과 정한 허용 범위 안인가, 은행 통지서의 원화 금액과 장부의 원화 금액은 같은가. 지금은 이 세 답이 은행 통지서, 환율 표, 장부 라인 조회에 흩어져 있어서 한 번에 맞춰 보기 어렵습니다. 한 건씩 보면 환율 차이는 소수점 둘째 자리 이하의 일이라 “원래 그 정도”로 넘어가기 쉽지만, 금액이 큰 거래가 쌓이면 은행에 더 낸 원화가 합계로 드러납니다.
이 앱은 외화 금액에 적용 환율을 곱한 원화와 기준 환율을 곱한 원화를 거래마다 다시 구하고, 둘의 차이를 스프레드 비용(은행에 더 낸 원화)으로 보여 줍니다. 그 비용을 기준 원화로 나눈 스프레드(%)가 회사가 정한 허용 퍼센트를 넘으면 점검 필요로 표시하고, 은행 통지 원화와 장부 원화가 어긋난 거래도 함께 가립니다. 관련 기준서는 없고 대상 영역은 자금(외화 환전·송금)입니다. 표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 조회·점검 관점을 더해 확장합니다.
환율 차이는 작아 보여도 거래 금액이 크면 합계가 커진다
이 샘플의 한 해외 송금 거래는 160,649.51 EUR 를 적용 환율 1,541.42 로 보냈는데 같은 날 기준 환율은 1,530.22 입니다. 환율 차이는 1% 도 되지 않지만 원화로는 약 180만 원이고, 회사가 정한 허용(0.50%)을 넘은 부분만 해도 57만 원입니다. 건별 통지서만 보면 환율 숫자가 그럴듯해 보이므로, 기준 환율과 나란히 놓고 퍼센트로 바꿔 보아야 차이가 보입니다.
허용 스프레드는 통화와 거래 유형마다 다르다
외화를 살 때와 팔 때, 송금할 때의 허용 범위는 같지 않고 통화마다도 다릅니다. 이 화면은 통화·거래 유형별 허용 퍼센트를 정책표로 두고, 거래마다 그 값을 찾아 견줍니다. 정책표에 없는 통화나 거래 유형은 허용 여부를 판단할 수 없으므로 확인 필요로 남깁니다. 허용 값 자체는 회사가 은행과 협의해 정하는 값입니다.
은행 통지 금액과 장부 금액이 다르면 마감 뒤에야 드러난다
은행이 알려 준 원화 금액이 외화 금액 × 적용 환율과 다르거나, 장부에 기표된 원화가 은행 통지와 다르면 환율 문제와는 별개의 확인 대상입니다. 이 화면은 두 차이를 허용 오차(1원)를 넘는 경우에만 따로 가려 점검 필요와 확인 필요로 표시하므로, 전표 금액이나 통지서 환율을 마감 전에 확인할 수 있습니다.
기준 환율의 선택에 따라 결론이 달라질 수 있다
어떤 환율 유형을 어떤 날짜 기준으로 쓸지는 회사 정책으로 정할 일입니다. 샘플은 같은 날의 기준 환율(가정값)을 쓰지만, 실제 적용 때는 환율 표(OB08 에서 유지하는 값)와 환산 시점을 회사가 정해 연결해야 합니다. 이 화면은 그 선택을 대신하지 않으며, 선택한 기준에 따라 스프레드가 얼마로 보이는지를 보여 줍니다.
사용 방법
- 회계연도와 기간(월)을 확인하고 필요하면 회사·은행·통화·거래 유형·거래일·점검 코드·점검 결과를 고릅니다. 처음 열면 2026년 09월이 채워져 자동으로 한 번 조회됩니다. 비워 두면 “전체”입니다.
- 조회 버튼(조회조건 영역의 오른쪽 끝, 초기화 옆)을 누르거나 입력란에서 Enter 를 누릅니다.
- 위쪽 요약에서 점검한 거래 건 · 기준 원화 합계 · 스프레드 비용 합계 · 허용 초과 건과 금액 · 확인 필요 · 점검 필요 · 정합성 대사 차이를 먼저 봅니다.
- 거래 명세 → 은행·통화 집계 → 허용 스프레드 정책 → 기준 환율 → 대사 결과 순서로 탭을 옮겨 봅니다.
- 거래 명세의 행을 누르면 환율 · 스프레드 · 원화 금액과 같은 은행·통화의 다른 거래가 상세 창에 열립니다.
- CSV 내려받기 로 지금 보는 탭을 UTF-8(BOM) 파일로 받아 은행에 확인할 자료로 씁니다.
숫자를 믿을 수 있는가 — 검증 결과
환율 점검에서 가장 비싼 질문은 “이 합계 맞아?” 입니다. 그래서 대사식을 먼저 세우고 샘플 데이터 전체(8월 40건 · 9월 92건)에 돌렸습니다. 검증용 파일을 화면과 별개 코드로 다시 계산해 서비스 결과와 견준 값입니다.
| 대사식 | 검사 건수 | 차이 |
|---|---|---|
| 거래 재계산(재계산 원화 · 기준 원화 · 스프레드 비용 · 퍼센트) | 132 | 0 |
| 은행·통화 집계 합 = 거래 합(건수 · 외화 · 기준 원화 · 스프레드 비용) | 34 | 0 |
| 정상 + 점검 필요 + 확인 필요 = 전체 건수(월별) | 2 | 0 |
| 통화별 스프레드 비용 합 = 총 비용(20,536,244원) | 5 | 0 |
| 허용 초과 금액 = 스프레드 비용 − 허용 퍼센트 × 기준 원화 | 24 | 0 |
| 합계 | 197 | 0 |
정합성 대사식은 검사 197건이 모두 차이 0 입니다. 점검 화면이 보여 주려고 일부러 넣은 예외는 대사 차이와 섞이지 않도록 따로 세었습니다.
| 의도적 점검 예외 | 건수 | 내용 |
|---|---|---|
| 은행 통지 원화 ≠ 재계산 원화 | 3 | 8월 1건 · 9월 2건, 최대 2,300원 차이 |
| 장부 원화 ≠ 은행 통지 원화 | 2 | 9월 2건, 최대 12,000원 차이 |
| 정책표에 없는 거래 | 2 | 9월 GBP 거래 — 허용 여부를 판단할 수 없어 확인 필요 |
| 허용 스프레드 초과 | 24 | 8월 8건 · 9월 16건 — 업무 판정이며 대사 차이가 아님 |
화면 쪽은 별도로 브라우저 자동화로 확인했습니다 — 조회·초기화·Enter 조회, 거래일 조건, 탭별 건수, 행 클릭 상세, CSV 내려받기, 오류 안내를 실제로 돌려 보았습니다.
무엇으로 만들었나
| 항목 | 내용 |
|---|---|
| 솔루션 | 자금 솔루션 |
| 업무 영역 | 외화 자금 관리 — 환전·해외 송금 |
| 관련 기준서·대상 영역 | - (대상 영역: 자금 · 외화 환전·송금) |
| SAP 표준 T-code | FBL3N · FEBAN · OB08 · FB03 |
| 화면 성격 | 조회·점검 (환율 재계산 · 허용 스프레드 판정 · 은행 통지·장부 대사) |
| 데이터 연동 | OData V2 조회 서비스 |
| 테마 | sap_horizon |
| 자리 | 무엇 | 왜 그렇게 두었나 |
|---|---|---|
| 화면 | SAP UI5 표준 컨트롤(조회조건 · 요약 · 탭 · 표 · 상세 창) | 외부 차트·표 라이브러리 반입 심사가 필요 없고, Horizon 테마를 그대로 따릅니다. |
| 판정·집계 로직 | 서비스 한 곳에서 재계산 · 판정 · 은행·통화 집계 · 대사식을 계산 | 화면과 내려받기, 대사가 같은 숫자를 쓰도록 계산을 한 곳에만 둡니다. |
| 서비스 구성 | OData V2 조회 서비스 — 거래 · 은행·통화 · 정책 · 기준 환율 · 대사 다섯 묶음과 집계 함수 두 개 | 화면은 모델에 바인딩하고, 조회조건은 필터로 나가 서버에서 거릅니다. 서비스 주소는 앱 설정의 상대 경로 하나로만 부릅니다. |
| 날짜 조건 | 날짜 범위 필터를 서비스 로직이 직접 해석 | 거래일 시작·종료를 비우거나 한쪽만 넣어도 같은 결과가 나오게 합니다. |
| 모델 구성 | 이름 없는 기본 모델 · 건수 함께 읽기 · 배치 없이 요청 | 탭마다 건수를 바로 보이고, 요청 한 건이 어떤 조건인지 추적하기 쉽습니다. |
| 오류 안내 | 메타데이터 실패 · 요청 실패 · 빈 응답을 구분해 안내 | 연결 문제와 조회 결과 없음을 사용자가 구분하도록 합니다. |
실행 화면
실제로 돌아가는 화면 6종을 사용 순서대로 싣습니다. 그림을 누르면 크게 볼 수 있고, 화면마다 무엇을 보고 무엇을 누르는 자리인지를 아래에 적었습니다. 숫자는 모두 같은 샘플 자료에서 나온 것이라 화면끼리 맞춰 보셔도 됩니다. 환율 · 거래 · 은행 이름은 검증용 가정값입니다.
처음 열었을 때와 점검 필요 거래만 보기
조회 조건을 넣어 요약부터 읽고, 약정과 다른 거래만 추려 봅니다.

2026년 09월이 채워진 채 한 번 자동 조회됩니다. 위쪽 요약 줄에서 점검한 거래 건수(92건), 기준 원화 합계(4,769,646,473원), 스프레드 비용 합계(+15,327,517원), 허용 초과 건수와 금액(16건 · 1,982,431원), 확인 필요 4건 · 점검 필요 18건, 정합성 대사 차이 건수(0건)를 먼저 읽습니다. 표에는 거래마다 외화 금액, 적용 환율, 기준 환율, 스프레드(%)와 허용(%)이 한 줄에 놓입니다.

조회조건에서 점검 결과를 점검 필요로 두고 조회 버튼을 누르면 해당 거래 18건만 남습니다. 허용 스프레드를 넘은 거래(S01) 16건과 은행 통지 금액이 다시 구한 원화와 다른 거래(S02) 2건이 모입니다. 입력란에서 Enter 를 눌러도 같은 조회가 되고, 초기화를 누르면 기본값으로 돌아갑니다.
은행·통화 집계와 허용 스프레드 정책
같은 차이가 어느 은행·통화에서 났는지 묶어 보고, 판정의 기준이 되는 허용 값을 확인합니다.

은행·통화마다 거래 건수, 외화 합계, 기준 원화, 스프레드 비용, 평균·최대 스프레드, 허용 초과 건수가 한 줄에 놓입니다. 예를 들어 가상은행A 의 USD 는 11건에서 스프레드 비용이 +2,331,270원이고 허용을 넘은 거래가 3건(178,183원) 있어 점검 필요로 표시됩니다. 정책표에 없는 통화(GBP)가 섞인 행은 확인 필요입니다.

통화와 거래 유형(외화 매수 · 외화 매도 · 해외 송금)마다 허용 스프레드(%)와 유효기간이 한 줄씩 있습니다. 이 값은 회사가 거래 은행과 협의해 정하는 값이며 화면의 숫자는 검증용 가정값입니다. 일부러 GBP 정책을 비워 두어, 정책이 없는 거래가 확인 필요로 남는 모습을 볼 수 있게 했습니다.
대사 결과와 한 거래의 상세
합계가 서로 맞는지 건수와 차이로 확인하고, 한 거래의 계산을 끝까지 따라갑니다.

통화별 은행 통지 원화 대사와 장부 원화 대사, 그리고 스프레드 비용·집계 합계·건수에 관한 정합성 대사식이 좌변·우변·검사 건수·차이 건수와 함께 나옵니다. 점검 화면이 보여 주려고 일부러 넣은 예외(통지 금액 차이 · 장부 금액 차이)는 차이 건수로 따로 드러나고, 정합성 대사식의 차이는 0건입니다.

환율(적용 · 기준 · 외화 금액), 스프레드(퍼센트 · 비용 · 허용 · 허용 초과), 원화 금액(재계산 · 은행 통지 · 장부), 차이와 허용 오차, 확인할 제안이 한 창에 나옵니다. 아래에는 같은 은행·같은 통화의 이번 기간 거래가 이어져 한 거래가 평소 수준과 얼마나 다른지 바로 견줄 수 있습니다. 예시의 JPY 거래는 스프레드 +0.7971% 로 허용 0.60% 를 넘어 점검 필요입니다.
화면 뒤에서 일어나는 일
서비스는 거래 한 줄마다 아래 순서로 계산하고 판정합니다. 한 거래에 여러 조건이 겹쳐도 점검 코드는 가장 앞선 하나만 붙습니다(우선순위 S04 > S02 > S03 > S01).
| 순서 | 처리 단계 | 설명 |
|---|---|---|
| 1 | 재계산 | 재계산 원화 = 외화 금액 × 적용 환율(원 단위 반올림). 은행이 환전·송금한 원화를 다시 구합니다. |
| 2 | 기준 원화 | 기준 원화 = 외화 금액 × 같은 날 기준 환율(원 단위 반올림). 기준 환율은 가정값입니다. |
| 3 | 스프레드 비용 | 방향부호 × (재계산 원화 − 기준 원화). 외화 매수·해외 송금은 +, 외화 매도는 −. 양수는 은행에 더 낸 금액입니다. |
| 4 | 스프레드(%) 와 허용 초과 | 스프레드(%) = 비용 ÷ 기준 원화 × 100. 허용 초과 금액 = 비용 − 허용 퍼센트 × 기준 원화(허용을 넘은 거래만). |
| 5 | 통지·장부와 견주기 | 은행 통지 원화와 재계산 원화, 장부 원화와 은행 통지 원화를 허용 오차(1원)로 견줍니다. |
| 6 | 집계와 대사 | 은행·통화별로 묶고, 집계 합 = 거래 합, 통화별 합 = 총 비용, 정상 + 점검 + 확인 = 전체 건수를 대사식으로 맞춥니다. |
| 코드 | 판정 조건 | 결과 상태 | 사용자 조치 |
|---|---|---|---|
| S04 | 정책표에 이 통화·거래 유형이 없다 | 확인 필요 | 정책표에 허용 스프레드 등록 |
| S02 | 은행 통지 원화 ≠ 외화 금액 × 적용 환율(허용 오차 초과) | 점검 필요 | 통지서의 환율·금액을 은행에 확인 |
| S03 | 장부 원화 ≠ 은행 통지 원화(허용 오차 초과) | 확인 필요 | 전표 금액 확인 |
| S01 | 스프레드(%) > 허용 스프레드(%) | 점검 필요 | 다른 은행 견적과 비교, 환율 재협의 검토 |
| S00 | 위 어디에도 해당하지 않음 | 정상 | 조치 없음 |
| P00 · P01 · P03 | 은행·통화 행 기준 — 허용 초과 없음 · 허용 초과 포함 · 정책 없는 통화 포함 | 정상 · 점검 필요 · 확인 필요 | 해당 거래 명세를 연다 |
판정은 “점검 필요”와 “확인 필요”로만 표시하며 원인을 단정하지 않습니다. 환율 차이가 허용을 넘었다는 사실과, 그것이 부당한 거래라는 결론은 다릅니다.
조회조건
| 조회조건 | 필수 | 기본값 | 필터 처리 |
|---|---|---|---|
| 회계연도 | 필수 | 2026 | Gjahr eq → $filter |
| 기간(월) | 필수 | 09 | Monat eq → $filter |
| 회사 · 은행 · 통화 · 거래 유형 | 선택 | 전체 | 전체이면 필터를 만들지 않음(“전체” 코드를 보내지 않음) |
| 거래일 시작·종료 | 선택 | 전체 | TrDate ge / le / bt (기준 환율 탭은 환율일, 비우면 선택한 월 전체) |
| 점검 코드 | 선택 | 전체 | S 코드는 거래 명세, P 코드는 은행·통화 집계에 적용 |
| 점검 결과 | 선택 | 전체 | CheckStatus eq |
결과 컬럼
| 컬럼 | 의미 | 산출식 |
|---|---|---|
| 적용 환율 · 기준 환율 | 은행이 적용한 환율과 같은 날 기준 환율(가정값) | 통지서 환율 / 환율 표 |
| 기준 원화 | 기준 환율로 환산한 원화 | 외화 금액 × 기준 환율 |
| 스프레드 비용 | 은행에 더 낸 원화 | 방향부호 × (재계산 원화 − 기준 원화) |
| 스프레드(%) · 허용(%) | 비용의 비율과 회사가 정한 허용 퍼센트 | 비용 ÷ 기준 원화 × 100 / 정책표 |
| 허용 초과(원) | 허용 퍼센트를 넘은 만큼의 원화 | 비용 − 허용 퍼센트 × 기준 원화 (넘은 거래만) |
| 재계산 · 은행 통지 · 장부 원화 | 세 원화 금액 | 외화 × 적용 환율 / 은행 통지서 / 장부 라인 |
| 점검 결과 · 코드 | 정상 · 확인 필요 · 점검 필요와 S·P 코드 | 위 판정 규칙, 우선순위 S04 > S02 > S03 > S01 |
| 허용 오차 | 같은 금액으로 볼 범위 | 원화 1원 (샘플 가정값) |
파일 구성
index.html · readme.html · Component.js · manifest.json
controller/ BaseController.js · Main.controller.js
view/ Main.view.xml · DetailDialog.fragment.xml
model/ formatter.js · ErrorHandler.js
css/ i18n/ style.css · i18n_ko.properties
odata/fxspread_srv/ metadata.xml · service.js · json/(엔티티셋별 데이터)
media/ intro.mp4 · intro_poster.jpg
test/ 검증 전용 (샘플 데이터 화면)
SAP 표준 기능 확장 포인트 — 표준 T-code 와 어떻게 연계되는지
표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 조회·점검 관점을 더해 확장합니다. 은행 통지를 처리하고 장부 라인을 확인하고 환율을 유지하는 일은 모두 표준에 두고, 그 결과를 기준 환율·허용 값과 견주는 자리만 이어 붙였습니다.
표준으로 되는 것과 안 되는 것
| 하고 싶은 일 | 표준으로 되는 부분 | 이 화면이 더하는 관점 |
|---|---|---|
| 은행 통지(명세) 처리 | FEBAN | 통지 금액을 이 화면의 재계산 원화와 거래마다 견줍니다 |
| 외화 계정 라인 확인 | FBL3N · FB03 | 장부 반영 원화와 은행 통지 원화의 차이를 거래마다 보여 줍니다 |
| 기준 환율 유지 | OB08 | 유지한 환율을 같은 날 기준으로 가져와 적용 환율과 견줍니다 |
| 허용 스프레드 판정 | 표준에는 스프레드 허용 정책 판정이 없어 보통 엑셀로 합니다 | 통화·거래 유형별 허용 퍼센트로 거래마다 판정하고 초과 금액을 구합니다 |
| 은행·통화별 비교 | 라인 조회를 합산해 비교 | 은행·통화 단위로 평균·최대 스프레드와 초과 건수를 묶어 보여 줍니다 |
T-code 별 연계 지점
| T-code | 이름 | 연계 |
|---|---|---|
| FBL3N | G/L 계정 라인 아이템 | 외화 예금·현금 계정의 전표 원화·외화 금액을 이 화면의 장부 반영 원화와 대조합니다. 장부 금액이 의심스러우면 이 거래로 계정 라인을 확인합니다. |
| FEBAN | 은행 명세 개요 | 은행 통지(명세) 금액을 이 화면의 은행 통지 원화와 대조합니다. 통지와 재계산 원화가 다른 거래(S02)는 후처리 단계에서 정정 여부를 판단합니다. |
| OB08 | 환율 유지 | 기준 환율을 확인·유지하는 자리입니다. 어떤 환율 유형을 쓸지는 회사 정책으로 정하며, 이 화면의 샘플 값은 가정값입니다(확인 필요). |
| FB03 | 전표 조회 | 장부 금액이 은행 통지와 다른 거래(S03)의 전표를 열어 금액과 적요를 확인합니다. 정정은 표준 거래에서 합니다. |
법정 · 감사 · 세무 신고에 쓰는 보고서와 정정 전표는 표준에 그대로 둡니다. 따라서 운영 전환 때 기존 리포트를 없애지 않고, 한두 달 두 화면의 합계를 맞춰 본 뒤 쓰임새를 나눕니다.
S/4HANA 분석 스택과의 자리
S/4HANA 에서는 CDS 뷰 위에 분석 쿼리를 두고 Fiori 분석 앱이나 Analysis for Office 로 읽는 구성이 흔합니다. 이 화면의 서비스도 같은 CDS 뷰 위에 놓이는 것을 전제로 하며, 재계산과 허용 판정을 뷰에서 계산해 화면 · 내려받기 · 대사가 같은 숫자를 읽도록 합니다. 아래 CDS 구성은 그 스케치입니다.
확장 포인트 — 운영에서 실제로 손대는 자리
| 자리 | 무엇을 손대나 | 비고 |
|---|---|---|
| 허용 스프레드 정책표 | 통화·거래 유형별 허용 퍼센트와 유효기간 행 추가 | 변경은 새 행 추가와 이전 행 종료로 관리 |
| 기준 환율 기준 | 환율 유형과 적용일(당일·전일 등) | 회사 정책으로 정함 — 확인 필요 |
| 허용 오차 | 같은 금액으로 볼 원화 범위 | 은행 반올림 방식에 맞춰 조정 |
| 은행 통지 자료 | 통지서 환율·원화 금액을 받는 입력 경로 | 표준 필드가 없어 외부 자료 입력 — 확인 필요 |
| 권한 | 회사코드 단위 조회 권한 | 집계 단계에 걸어 합계로도 새지 않게 |
| 확장 필드 | 거래 구분·참조 번호 등 고객 필드 | BAdI 나 확장 필드로 거래 한 줄에 추가 |
분석 지표 정의표
| 지표 | 산식·판정 기준 | 대응 기능 | 원천 데이터 | 비고 |
|---|---|---|---|---|
| 스프레드 비용 | 방향부호 × (재계산 원화 − 기준 원화) | 거래 명세 · 요약 | 환율 테이블 · 은행 통지 | 양수는 은행에 더 낸 금액 |
| 스프레드(%) | 비용 ÷ 기준 원화 × 100 → 허용 퍼센트 초과 시 점검 필요 | 거래 명세 · 상세 | 환율 테이블 · 전표 · 은행 통지 | 허용 퍼센트는 회사 정책(가정값) |
| 허용 초과 금액 | 비용 − 허용 퍼센트 × 기준 원화 | 요약 · 집계 함수 | 위와 같음 | 통화가 다른 외화 금액은 더하지 않고 원화만 합산 |
| 은행 통지 차이 | 은행 통지 원화 − 재계산 원화 | S02 · 대사 결과 | 은행 명세 | 허용 오차 1원 |
| 장부 차이 | 장부 원화 − 은행 통지 원화 | S03 · 대사 결과 | FBL3N 계정 라인 | 전표 금액 확인 |
관련 기준서는 없으며 대상 영역은 자금(외화 환전·송금)입니다. 이 화면은 점검 도구이며 최종 판단은 회사와 감사인이 합니다.
CDS 구성 — 기준 환율에서 서비스까지
샘플 화면은 서비스 로직이 계산하지만, 운영에서는 같은 계산을 CDS 뷰에 둡니다. 아래는 그 구성의 스케치입니다. 표준 CDS 뷰 이름은 확인된 것만 쓰고, 거래·장부 원천은 테이블 기준으로 적었으며 원천 필드는 도입 때 “확인 필요”로 맞춥니다. 뷰 이름은 고객 네임스페이스 규칙에 맞춰 정하면 됩니다.
뷰 레이어 구성
| 레이어 | 뷰 · 테이블 | 하는 일 | 왜 나누나 |
|---|---|---|---|
| 기준 | 허용 스프레드 정책표 · 환율 테이블 | 판정의 기준 값과 기준 환율 | 정책이 바뀌어도 코드를 고치지 않으려고 |
| 원천 | 거래 한 줄 뷰 | 외화 전표 라인에 기준 환율을 붙여 한 행으로 | 장부와 환율 원천을 한곳에서 합치려고 |
| 큐브 | 스프레드·판정 뷰 | 기준 원화 · 스프레드 비용 · 허용 초과 · 점검 코드 계산 | 판정을 한 곳에서만 계산하려고 |
| 쿼리 | 거래 조회 쿼리 · 은행·통화 집계 뷰 | 화면 컬럼 · 필터 규칙 · 집계 | 화면과 서비스가 같은 정의를 쓰려고 |
| 권한 | 접근 제어(DCL) | 회사코드 권한을 집계까지 상속 | 합계로 새지 않게 |
| 서비스 | 서비스 정의 · 바인딩 | 노출 목록과 OData V2 게시 | 계약을 한 파일에 모으려고 |
① 허용 스프레드 정책표 — 판정의 유일한 기준
허용 퍼센트가 어디에 저장되는지가 곧 판정의 신뢰도입니다. 회사 · 통화 · 거래 유형 · 유효 시작일을 키로 두어 정책이 바뀌어도 과거 거래를 그때의 값으로 다시 판정할 수 있게 했습니다.
// ─────────────────────────────────────────────────────────────
// FxSpreadPolicy — 허용 스프레드 정책표 (고객 테이블)
// 역할 : 통화·거래 유형별로 회사가 은행과 협의해 정한 허용 퍼센트를 둔다.
// 이렇게 나눈 이유 : 허용 값이 바뀌어도 뷰·화면 코드를 고치지 않으려고.
// ─────────────────────────────────────────────────────────────
@EndUserText.label : '환전·송금 허용 스프레드'
@AbapCatalog.tableCategory : #TRANSPARENT
define table fxspread_policy {
key mandt : mandt not null;
key bukrs : bukrs not null;
key waers : waers not null;
key trtype : abap.char(1) not null; // B 외화 매수 · S 외화 매도 · R 해외 송금
key valid_from : abap.dats not null;
valid_to : abap.dats;
max_pct : abap.dec(9,4); // 허용 스프레드(%) — 회사 정책으로 확정
}
② 거래 한 줄 뷰 — 장부와 기준 환율을 한 행에
외화 금액·장부 원화의 원천(전표 라인)과 기준 환율의 원천(환율 테이블)을 한 행에 모읍니다. 환율 유형과 적용일 기준은 회사 정책으로 정하는 항목이라 도입 때 확인합니다.
// ─────────────────────────────────────────────────────────────
// FxTradeBase — 환전·송금 거래 한 줄 (전표 라인 + 기준 환율)
// 역할 : 외화 금액과 장부 원화, 같은 날 기준 환율을 한 행에 모은다.
// ─────────────────────────────────────────────────────────────
@AccessControl.authorizationCheck : #CHECK
@EndUserText.label : '환전·송금 거래 기준 원화'
define view entity FxTradeBase as select from acdoca
association [0..1] to tcurr as _Rate on _Rate.kurst = 'M' // 환율 유형 — 확인 필요
and _Rate.fcurr = acdoca.rwcur
and _Rate.tcurr = acdoca.rhcur
{
key rbukrs as Bukrs, key gjahr as Gjahr, key belnr as DocNo, key docln as DocItem,
budat as TrDate, rwcur as Waers,
@Semantics.amount.currencyCode : 'Waers' wsl as FcAmt,
rhcur as LocalCurr,
@Semantics.amount.currencyCode : 'LocalCurr' hsl as BookKrw,
_Rate
}
③ 스프레드·판정 큐브 — 숫자가 만들어지는 유일한 자리
기준 원화, 스프레드 비용, 허용 초과, 점검 코드가 여기서 결정됩니다. 화면 · 내려받기 · 대사가 모두 이 뷰의 값을 읽으므로 운영에서 가장 먼저 검증해야 하는 뷰입니다.
// ─────────────────────────────────────────────────────────────
// FxSpreadCube — 스프레드·판정 (큐브)
// 역할 : 거래마다 기준 원화·스프레드 비용·허용 초과를 구하고 점검 코드를 붙인다.
// 이렇게 나눈 이유 : 판정을 뷰 한 곳에서만 계산해 화면·CSV·대사가 같은 숫자를 쓰게 한다.
// ─────────────────────────────────────────────────────────────
@Analytics.dataCategory : #CUBE
@EndUserText.label : '환전·송금 스프레드 판정'
define view entity FxSpreadCube as select from FxTradeBase as t
left outer join fxspread_policy as p
on p.bukrs = t.Bukrs and p.waers = t.Waers
and p.valid_from <= t.TrDate and ( p.valid_to >= t.TrDate or p.valid_to = '00000000' )
{
key t.Bukrs, key t.Gjahr, key t.DocNo, key t.DocItem,
t.TrDate, t.Waers, t.FcAmt, t.BookKrw,
p.max_pct as MaxPct,
// 기준 원화 = 외화 금액 × 기준 환율, 스프레드 비용 = 방향부호 × (재계산 − 기준)
cast( 0 as abap.dec(18,0) ) as SpreadKrw, // 적용 환율은 은행 통지 자료에서 받는다 — 확인 필요
case when p.max_pct is null then 'S04' // 정책 없음 → 확인 필요
else 'CALC' end as PreCode
}
④ 거래 조회 쿼리 — 화면 컬럼과 필터 규칙
회계연도 · 기간은 필수, 회사 · 은행 · 통화 · 거래 유형은 선택으로 두는 조회 규칙을 한 곳에 둡니다. 스프레드(%)와 점검 코드를 여기서 계산해 화면이 별도 계산을 하지 않게 합니다.
// ─────────────────────────────────────────────────────────────
// FxSpreadQuery — 화면용 조회 쿼리 (Consumption)
// 역할 : 거래 명세 탭이 읽는 한 줄. 스프레드(%)와 점검 코드를 여기서 계산한다.
// ─────────────────────────────────────────────────────────────
@EndUserText.label : '환전·송금 거래 조회'
define view entity FxSpreadQuery as select from FxSpreadCube
{
key Bukrs, key Gjahr, key DocNo, key DocItem, TrDate, Waers, FcAmt, BookKrw, MaxPct, SpreadKrw,
// 스프레드(%) = 스프레드 비용 ÷ 기준 원화 × 100 — 기준 원화가 0 이면 비워 둔다
cast( 0 as abap.dec(9,4) ) as SpreadPct,
PreCode as CheckCode
}
⑤ 접근 제어 — 회사코드 권한
집계 뷰까지 같은 권한을 상속해야 합계로 다른 회사의 금액이 드러나지 않습니다. 드릴다운에만 권한을 걸면 뺄셈으로 새어 나갈 수 있어 집계 단계에 겁니다.
// ─────────────────────────────────────────────────────────────
// FxSpreadQuery — 접근 제어 (DCL)
// 역할 : 회사코드 권한이 없는 회사의 거래는 합계로도 보이지 않게 한다.
// ─────────────────────────────────────────────────────────────
@EndUserText.label : '환전·송금 거래 권한'
@MappingRole : true
define role FxSpreadQueryRole {
grant select on FxSpreadQuery
where ( Bukrs ) = aspect pfcg_auth( F_BKPF_BUK, BUKRS, ACTVT = '03' );
}
⑥ 서비스 정의와 바인딩 — 화면이 읽는 계약
노출 목록이 곧 화면과의 계약입니다. 바인딩을 게시한 뒤 서비스를 활성화하고, 앱 설정의 서비스 주소만 운영 주소로 바꿉니다.
// ─────────────────────────────────────────────────────────────
// FxSpreadCheck — 서비스 정의와 바인딩 (OData V2)
// 역할 : 화면이 읽는 뷰를 서비스로 노출한다.
// 이렇게 나눈 이유 : 노출 목록이 곧 계약이므로 한 파일에 모아 두고,
// 바인딩을 게시한 뒤 앱 설정의 서비스 주소만 바꿔 운영에 연결한다.
// ─────────────────────────────────────────────────────────────
@EndUserText.label : '환전·송금 스프레드 점검 서비스'
define service FxSpreadCheck {
expose FxSpreadQuery as TradeSet;
expose FxSpreadPairs as PairSet;
expose FxSpreadPolicy as PolicySet;
}
// Service Binding : 유형 OData V2 - UI, 게시 후 서비스 활성화
운영 시점에 해야 할 일
개발보다 정하는 일이 많습니다. 아래 여섯 가지는 코딩이 아니라 합의이며, 합의가 끝나면 기술 작업은 뷰를 만들고 서비스를 게시하는 일로 줄어듭니다.
| 해야 할 일 | 무엇을 정하나 | 정하지 않으면 | 누가 |
|---|---|---|---|
| 허용 스프레드 정책 확정 | 통화 · 거래 유형별 허용 퍼센트와 유효기간 | 판정이 정책 없음(S04)으로 쏠려 점검이 의미를 잃습니다 | 자금팀 · 은행 담당 |
| 기준 환율 기준 | 환율 유형 · 적용일(당일·전일 등) | 스프레드가 회사 환산 기준과 어긋나 보입니다 | 회계팀 |
| 은행 통지 자료 경로 | 통지서 적용 환율·원화 금액을 받는 입력 경로 | 적용 환율이 비어 재계산이 안 됩니다 | 자금팀 · IT |
| 허용 오차 기준 | 같은 금액으로 볼 원화 범위 | 반올림 차이가 점검 필요로 잡힙니다 | 자금팀 |
| 권한 설계 | 회사코드 · 계정 권한 범위 | 다른 회사의 합계가 보일 수 있습니다 | 보안 · 권한 |
| 전송 · 서비스 활성화 | 전송 순서, 서비스 활성화(/IWFND/MAINT_SERVICE) 또는 바인딩 게시, 앱 설정의 서비스 주소 교체 | 화면이 샘플 데이터로 남습니다 | IT · Basis |
운영 데이터로 갈 때
월 거래 건수가 수만 건을 넘으면 조회조건(회사 · 기간)을 필수로 두고 거래 명세를 페이지 단위로 읽는 것이 기본입니다. 은행·통화 집계는 뷰에서 미리 묶어 응답 시간을 일정하게 유지하고, 기준 환율은 환율일별로 한 번만 가져오도록 조인을 설계합니다.
자주 묻는 질문
숫자와 산식 · 화면과 조작 · 데이터와 표준 연계 · 도입과 운영 네 묶음으로 정리했습니다.
숫자와 산식
스프레드 비용은 어떻게 구합니까?
외화 금액에 적용 환율을 곱한 재계산 원화와 기준 환율을 곱한 기준 원화를 각각 원 단위로 반올림해 구하고, 둘의 차이에 방향부호를 곱합니다. 외화 매수와 해외 송금은 +, 외화 매도는 − 부호를 씁니다. 양수는 은행에 더 낸 금액이라는 뜻이며, 스프레드(%)는 이 비용을 기준 원화로 나눈 값입니다.
허용 초과 금액은 무엇입니까?
스프레드 비용에서 허용 퍼센트 × 기준 원화를 뺀 값입니다. 스프레드가 허용을 넘은 거래에만 구하며, 통화가 다른 외화 금액은 더하지 않고 원화로만 합산합니다. 샘플 9월은 16건에서 1,982,431원입니다.
허용 오차는 얼마입니까?
샘플은 원화 1원으로 둔 가정값입니다. 은행 통지 원화와 재계산 원화, 장부 원화와 은행 통지 원화의 차이가 이 값 이하이면 같은 금액으로 봅니다. 실제 적용 때는 은행의 반올림 방식과 회사 정책에 맞춰 바꿉니다.
한 거래에 점검 코드가 하나만 붙는 이유는 무엇입니까?
여러 조건에 걸리더라도 사용자가 가장 먼저 해야 할 일은 하나이기 때문입니다. 우선순위는 정책 없음(S04), 은행 통지 차이(S02), 장부 차이(S03), 허용 초과(S01) 순입니다. 정책이 없으면 허용 여부 자체를 판단할 수 없으므로 가장 앞에 둡니다.
대사 차이가 0인데 점검 필요가 18건인 것은 모순이 아닙니까?
모순이 아닙니다. 대사식은 같은 데이터를 다른 길로 더해 합계가 일치하는지 보는 정합성 검사이고, 점검 필요는 허용 범위를 넘었거나 통지 금액이 다른 거래를 가려내는 업무 판정입니다. 일부러 넣은 예외는 대사 차이로 세지 않도록 따로 표시했습니다.
화면과 조작
조회 조건은 무엇을 고를 수 있습니까?
회계연도와 기간(월)은 필수이고, 회사·은행·통화·거래 유형·거래일 범위·점검 코드·점검 결과는 선택입니다. 전체를 고르면 그 조건은 조회에 넣지 않습니다. 점검 코드는 첫 글자(S·P)에 따라 해당 탭에만 적용됩니다.
상세 창에서는 무엇을 볼 수 있습니까?
환율(적용·기준), 스프레드(비용·퍼센트·허용·허용 초과), 원화 금액(재계산·은행 통지·장부), 차이와 허용 오차, 확인할 제안이 나옵니다. 아래에는 같은 은행·같은 통화의 이번 기간 거래가 이어져 평소 수준과 견줄 수 있습니다.
내려받기는 무엇이 담깁니까?
지금 보고 있는 탭의 조회 결과가 UTF-8 CSV 로 내려옵니다. 한글이 깨지지 않도록 처음에 BOM 을 붙여 엑셀에서 바로 열립니다. 은행에 환율 재협의를 요청할 때 첨부 자료로 쓰는 용도입니다.
휴대폰에서도 쓸 수 있습니까?
쓸 수 있습니다. 좁은 화면에서는 조회조건과 요약이 세로로 쌓이고 표는 가로로 스크롤됩니다. 다만 열이 많은 거래 명세는 가로 공간이 넓은 화면에서 읽는 편이 편합니다.
데이터와 표준 연계
SAP 표준 T-code 와는 어떤 관계입니까?
표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 조회·점검 관점을 더해 확장합니다. 은행 통지는 FEBAN, 장부 라인 확인은 FBL3N · FB03, 기준 환율 유지는 OB08 에서 합니다. 이 화면은 그 결과를 읽어 견주며 전표를 만들거나 바꾸지 않습니다.
기존 리포트를 없애야 합니까?
없애지 않습니다. 법정·감사·세무 신고에 쓰는 보고서는 표준 거래에 그대로 두고, 이 화면은 마감 전에 환전·송금 환율만 따로 점검하는 용도로 함께 둡니다. 운영 전환 후 두 화면의 합계를 한두 달 맞춰 본 뒤 쓰임새를 정하는 순서를 권합니다.
기준 환율은 어떤 환율을 써야 합니까?
회사 정책으로 환율 유형과 적용일을 정해 환율 테이블에서 가져옵니다. 샘플의 기준 환율은 같은 날 값을 쓴 가정값이며 실제 고시값이 아닙니다. 어떤 기준을 쓰느냐에 따라 스프레드가 다르게 보일 수 있어 도입 때 회계팀과 정해야 합니다.
데이터 원천은 무엇입니까?
외화 금액과 장부 원화는 원장 전표 라인(ACDOCA)에서, 기준 환율은 환율 테이블(TCURR)에서 읽는 구성을 전제로 합니다. 은행이 적용한 환율은 표준 필드가 없어 은행 통지 자료를 외부에서 받아야 하며, 원천 필드의 정확한 대응은 고객 환경에 따라 달라지므로 도입 때 확인합니다.
도입과 운영
도입하면 어떤 효과가 있습니까?
은행 통지서와 환율 표, 장부를 사람이 눈으로 맞추던 일이 줄고, 허용 범위를 넘은 거래를 근거와 함께 은행에 문의할 수 있습니다. 효과의 크기는 월 거래 건수와 거래 금액, 회사가 정한 허용 값에 따라 달라지므로 확정된 숫자로는 말씀드리기 어렵습니다.
누가 쓰는 화면입니까?
자금 담당과 회계 담당이 마감 전에 쓰고, 경영지원 쪽에서는 요약과 대사 결과 탭을 봅니다. 조회·점검만 하므로 전표를 만들거나 바꾸는 권한은 필요하지 않습니다.
권한과 보안은 어떻게 설계합니까?
회사코드 권한을 집계 단계에 걸어 남의 회사 거래가 합계로도 드러나지 않게 합니다. 계좌번호는 앞뒤 일부만 보이는 마스킹 형식으로 내려 보냅니다. 이 화면은 읽기 전용이며 외부로 데이터를 보내지 않습니다.
운영 시스템에 붙이는 데 얼마나 걸립니까?
기술 작업보다 합의가 앞섭니다. 허용 스프레드 정책, 기준 환율 기준, 은행 통지 자료 경로, 허용 오차를 먼저 정하면 CDS 뷰와 서비스 게시는 비교적 짧게 끝납니다. 기간은 고객 환경의 원천 형식과 권한 설계에 따라 달라지므로 확정된 숫자로는 말씀드리기 어렵습니다.
점검 결과를 그대로 은행에 환율 재협의 근거로 써도 됩니까?
점검 결과는 확인을 돕는 참고 자료입니다. 약정 조건이나 거래 시점의 시장 상황에 따라 적용 환율이 달라질 수 있으므로 은행에 문의하는 근거로 쓰고, 최종 판단은 회사와 은행이 합니다. 감사나 회계 처리, 관세·세무와 얽힌 항목은 회사와 감사인 또는 세무 대리인·관세사가 확인합니다.
샘플과 실제 데이터의 차이는 무엇입니까?
샘플은 가상 은행 4곳, 가상 계좌, 가정 기준 환율과 가정 허용 값으로 만든 검증용 데이터입니다. 의도적 예외를 섞어 점검 화면이 무엇을 보여 주는지 확인하도록 했습니다. 실제 도입에서는 이 자리에 회사의 거래와 정책이 들어옵니다.