SAP 보험계약 이행현금흐름 할인율 점검 — IFRS 17, 무위험 수익률과 비유동성 프리미엄으로 할인곡선을 다시 구해 장부 할인율·공시 할인율·집합별 현재가치와 대조한다
곡선 지점 대사 · 집합별 현재가치 재계산 · 유동성 특성에 맞는 곡선 선택 · 곡선 이동 민감도를 한 화면에서 점검합니다
개발 배경
이 앱을 사용해야 하는 이유
보험계약 부채의 숫자는 거의 전부 할인율을 통과해서 만들어집니다. 같은 미래 현금흐름이라도 할인율이 0.1%p 다르면 현재가치가 달라지고, 그 차이는 보험부채 잔액과 보험금융손익에 그대로 번집니다. 그런데 실무에서는 곡선을 만드는 사람(계리), 곡선을 장부에 넣는 사람(회계), 주석에 옮겨 적는 사람이 달라서 "이 집합에 이 곡선이 정말 맞게 걸렸는가", "장부 할인율과 공시 할인율이 같은가"를 확인하려면 여러 파일을 열어 눈으로 맞춰 보게 됩니다.
SAP 표준 화면으로는 FAGLL03 에서 부채 계정의 개별 항목을, FAGLB03 에서 잔액을 볼 수 있지만, 그 금액을 만든 할인율이 곡선과 맞는지는 보이지 않습니다. 이 앱은 곡선 지점마다 기대 할인율을 다시 구하고, 집합별 현금흐름을 기대 할인계수로 다시 할인해 장부 현재가치와 맞춥니다. 월마감마다 반나절씩 걸리던 엑셀 대조를 필터 두세 번으로 줄이는 것이 목적입니다. 검증용 샘플 데이터(곡선 12지점, 집합 8개, 현금흐름 41건)에서는 점검이 필요한 곡선 지점 2건, 집합 3건, 현금흐름 7건이 바로 걸러졌습니다.
관련 기준서는 IFRS 17 보험계약(K-IFRS 제1117호)입니다. 이 기준서는 이행현금흐름의 현재가치에 쓰는 할인율이 화폐의 시간가치, 현금흐름의 특성, 보험계약의 유동성 특성을 반영하도록 요구합니다. 이 화면은 그 가운데 유동성 특성(환급불가형과 해지환급형)에 따른 곡선 선택과 곡선 구성(무위험 수익률 + 비유동성 프리미엄)이 장부와 맞는지를 점검합니다. 주로 결산 담당 회계 인력과 계리 인력이 월·분기 마감과 감사 대응 때 씁니다.
앱 정보
| 항목 | 내용 |
|---|---|
| 업무영역 | 재무회계(FI) · 보험계약 부채 |
| 관련 기준서 | IFRS 17 보험계약(K-IFRS 제1117호) — 이행현금흐름의 할인율 |
| Namespace | zui5.insdisc |
| 화면 | 조회 화면 1개 + 집합 상세 창 1개 (실행 화면 6종) |
| SAP 표준 T-code | FAGLL03 · FAGLB03 · FS10N · FB03 |
| 데이터 연동 | OData V2 서비스(검증용 샘플 데이터로 확인) |
| 성격 | 조회·점검 전용 — 원장에 쓰지 않음 |
| 테마 | sap_horizon |
SAP 표준 기능을 그대로 이어받은 부분
원장 금액의 조회와 전표 추적은 SAP 표준 T-code 가 계속 담당합니다. 이 화면은 표준 데이터 구조(계정·회사코드·기간)를 그대로 이어받고, 그 위에 할인율과 현재가치를 다시 계산하는 점검 관점을 더해 확장합니다.
핵심 판정 로직
| 판정 조건 | 결과 상태 | 사용자 조치 |
|---|---|---|
| 장부 적용 할인율과 기대 할인율의 차이가 0.05%p 초과 | 점검 필요 | 곡선 입력 기준일과 반영 시점 확인 |
| 공시 할인율과 장부 적용 할인율의 차이가 0.005%p 초과 | 점검 필요 | 주석 공시 값의 옮겨 적기·반올림 확인 |
| 집합의 장부 적용 곡선이 유동성 특성에 따른 기대 곡선과 다름 | 점검 필요 | 환급불가형·해지환급형 구분과 곡선 연결 확인 |
| 집합의 장부 PV − 재계산 PV 절대값이 0.1 백만원 이상 | 점검 필요 | 현금흐름 명세에서 차이가 생긴 만기 확인 |
| 위 조건에 해당하지 않음 | 정상 | - |
허용 범위는 샘플 기준이며 회사 정책에 맞게 바꿉니다. 판정 결과는 "점검 필요"로만 표시하고 원인을 단정하지 않습니다.
처리 단계
- 기대 할인율 = 무위험 수익률 + 비유동성 프리미엄 (곡선 지점별)
- 할인계수 = 1 ÷ (1 + 할인율÷100)만기, PV = 현금흐름 × 할인계수 (기대·장부 두 벌)
- 집합 PV 차이 = Σ 장부 PV − Σ 재계산 PV, 가중평균 만기 = Σ(현금흐름×만기) ÷ Σ 현금흐름
- 기대 곡선을 ±1%p 이동해 PV 와 유효 듀레이션 산출
- 7개 대사식으로 위 계산의 일관성 검산
실행 화면
실제로 렌더링한 화면 6종을 사용 순서대로 싣습니다. 그림을 누르면 크게 볼 수 있습니다. 숫자는 모두 가상의 검증용 샘플 데이터(단위 백만원)입니다.
처음 열었을 때 — 조회조건과 요약 지표

화면을 열면 2026년·2026-09 기간으로 자동 조회하므로 처음부터 숫자가 채워져 있습니다. 가장 먼저 볼 곳은 "PV 차이 순합계"와 세 개의 "점검 필요 건수"입니다.
샘플에서는 곡선 지점 12건 중 2건, 집합 8건 중 3건, 현금흐름 41건 중 7건이 점검 필요로 잡히고 PV 차이 순합계는 -1.2 백만원입니다. 대사 차이 건수가 0이라는 것은 화면 자체의 계산이 서로 맞는다는 뜻이고, 점검 필요는 장부와 다시 구한 값이 다른 항목을 따로 골라낸 것입니다.
집합별 PV 대사

환급불가형 집합은 CRV1, 해지환급형 집합은 CRV2 가 기대 곡선입니다. 장부 적용 곡선이 이와 다르면 PV 차이가 작아도 점검 필요로 표시합니다.
표의 PF04-2025-L 은 해지환급형인데 CRV1 이 걸려 있어 재계산 PV 577.9 와 장부 PV 575.5 가 -2.4 차이 납니다. 같은 표의 PF03-2026-L 은 곡선은 맞지만 특정 만기의 장부 할인율이 어긋나 0.3 차이가 납니다. 행을 누르면 어느 만기에서 갈렸는지 상세 창에서 볼 수 있습니다.
현금흐름 명세

집합 한 줄로는 보이지 않는 "어느 만기에서"를 여기서 확인합니다. 할인계수는 1 ÷ (1 + 할인율÷100)만기 이므로 만기가 길수록 같은 할인율 차이가 PV 차이로 더 크게 번집니다.
해지환급형 곡선의 5년 지점 장부 할인율이 기대보다 0.30%p 낮게 적혀 있으면 그 만기를 지나는 집합의 현금흐름에만 PV 차이가 생기고, 5년 만기 현금흐름이 없는 집합에는 영향이 없다는 것도 이 표에서 확인됩니다.
곡선 이동 민감도

금리가 오르면 부채의 현재가치가 줄고 내리면 늘어납니다. 표의 +1%p 변동액은 음수, -1%p 변동액은 양수로 나오며 그 크기가 곧 집합의 금리 민감도입니다.
유효 듀레이션은 (PV(-1%p) − PV(+1%p)) ÷ (2 × 기준 PV × 0.01) 로 구합니다. 연금저축 집합은 5.4년 안팎, 단기 상품이 많은 집합은 1.4~2.0년으로 만기 구조 차이가 그대로 드러납니다. 시장위험 민감도 공시를 준비할 때 계리 모델의 결과와 대조해 볼 수 있는 값입니다.
정합성 대사

기대 할인율 구성, 명목 현금흐름 합계, 장부 PV, 재계산 PV, PV 차이, 민감도 기준 PV, 현금흐름 건수를 좌변·우변으로 맞추고 검사 건수와 차이 건수, 최대 차이를 보여줍니다.
이 표가 전부 0이면 앞 화면의 숫자들이 같은 원천에서 일관되게 만들어졌다는 뜻입니다. 점검 필요 항목은 이 대사에 걸리지 않으므로 둘을 섞어 읽지 않도록 건수를 따로 적어 두었습니다.
집합 상세

위쪽 폼에 집합 정보와 점검 내용이, 가운데 표에 만기별 기대·장부 할인율과 PV 차이가, 아래 표에 장부에 걸린 곡선의 지점별 무위험 수익률·프리미엄·기대·장부·공시 할인율이 나옵니다.
해지환급형 집합에 환급불가형 곡선이 걸린 경우를 열어 보면 모든 만기에서 장부 할인율이 기대보다 높게 적혀 있어 PV 차이가 만기 전반에 고르게 음수로 나타납니다. 곡선 자체의 입력 오류와 곡선 선택의 문제를 한 화면에서 구분할 수 있습니다.
사용 방법
- 조회조건을 입력합니다. 회계연도는 필수(4자리)이고 기간·포트폴리오·유동성 특성·할인곡선·기준일·점검 결과는 선택입니다.
- 조회 버튼은 조회조건 영역의 맨 오른쪽에 있습니다. 입력 칸에서 Enter 키를 눌러도 조회됩니다.
- 요약 지표에서 PV 차이 순합계와 점검 필요 건수를 확인합니다.
- 탭을 곡선 지점 대사 → 집합별 PV 대사 → 현금흐름 명세 → 곡선 이동 민감도 → 정합성 대사 순서로 옮겨 갑니다.
- 집합·현금흐름·민감도 탭의 행을 누르면 집합 상세 창이 열립니다.
- CSV 내려받기로 현재 탭의 조회 결과를 UTF-8 파일로 저장합니다.
조회조건
| 조건 | 필수 | 기본값 | 설명 |
|---|---|---|---|
| 회계연도 | 필수 | 2026 | 4자리 숫자 |
| 기간 | 선택 | 2026-09 | 전체·2026-08·2026-09 |
| 포트폴리오 | 선택 | 전체 | 집합·현금흐름·민감도에 적용 |
| 유동성 특성 | 선택 | 전체 | 환급불가형 · 해지환급형 |
| 할인곡선 | 선택 | 전체 | CRV1 · CRV2 (장부 적용 곡선 기준) |
| 기준일 시작/종료 | 선택 | 비움 | 곡선 기준일·집합 평가 기준일 범위 |
| 점검 결과 | 선택 | 전체 | 정상 · 점검 필요 |
결과 컬럼
| 컬럼 | 의미 | 산출식 |
|---|---|---|
| 기대 할인율(%) | 곡선 지점의 재구성 할인율 | 무위험 수익률 + 비유동성 프리미엄 |
| 장부-기대 차이(%p) | 장부 적용 할인율과 기대의 차이 | 장부 적용 − 기대 |
| 공시-장부 차이(%p) | 주석 공시와 장부의 차이 | 공시 − 장부 적용 |
| 장부 PV / 재계산 PV | 장부 할인율·기대 할인율로 각각 할인한 현재가치 | Σ 현금흐름 × 할인계수 |
| PV 차이 | 두 현재가치의 차이 | 장부 PV − 재계산 PV |
| 가중평균 만기(년) | 현금흐름의 평균 도래 시점 | Σ(현금흐름×만기) ÷ Σ 현금흐름 |
| 유효 듀레이션(년) | 곡선 ±1%p 이동에 대한 PV 민감도 | (PV(-1%p) − PV(+1%p)) ÷ (2 × 기준 PV × 0.01) |
SAP 표준 기능 확장 포인트
표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 조회·검증 관점을 더해 확장합니다. 표준 화면에서 이 화면으로, 이 화면에서 표준 화면으로 오가는 길은 아래와 같습니다.
| 표준 T-code | 표준 화면이 담당하는 일 | 이 앱이 이어받는 데이터 | 이 앱이 더하는 관점 | 오가는 방법 |
|---|---|---|---|---|
| FAGLL03 | G/L 계정 개별 항목 조회 | 원장 전표 라인(계정·회사코드·기간·금액) | 그 금액을 만든 할인율·현재가치의 재계산 결과 | 집합별 PV 대사에서 차이가 난 집합의 부채 계정을 FAGLL03 으로 열어 개별 항목 확인 |
| FAGLB03 | G/L 계정 잔액 조회 | 계정별 기간 잔액 | 집합별 장부 PV 합계와 잔액을 맞춰 볼 출발점 | 집합별 장부 PV 합계를 FAGLB03 의 잔액과 대조하고 차이 금액을 이 화면의 PV 차이와 비교 |
| FS10N | G/L 계정 잔액 추이 | 월별 잔액·누계 | 곡선 기준일이 바뀐 달의 PV 변동 확인 | 잔액이 크게 움직인 달의 기간을 이 화면 조회조건에 넣어 곡선 지점 대사로 확인 |
| FB03 | 전표 조회 | 전표 헤더·라인 | 곡선 변경에 따른 조정 분개의 근거 확인 | 곡선 지점 대사에서 변경이 확인된 기간의 조정 전표를 FB03 으로 열어 확인 |
요구사항 매핑
| 기준서 | 요구사항 | 대응 기능 | 원천 데이터 | 비고 |
|---|---|---|---|---|
| IFRS 17 보험계약(K-IFRS 제1117호) | 이행현금흐름의 현재가치에 쓰는 할인율은 화폐의 시간가치, 현금흐름의 특성, 보험계약의 유동성 특성을 반영 | 곡선 지점 대사, 집합별 PV 대사, 곡선 선택 점검 | 할인곡선 지점, 이행현금흐름 명세 | 상향식·하향식 선택과 프리미엄 산정 방법은 확인 필요 |
| IFRS 17 보험계약(K-IFRS 제1117호) | 현금흐름을 할인하는 데 쓴 수익률곡선 공시 | 공시 할인율 대사 | 주석 공시 할인율 | 공시 양식은 회사별로 확인 필요 |
| IFRS 17 보험계약(K-IFRS 제1117호) | 시장위험 변수의 변동이 미치는 영향에 대한 민감도 정보 | 곡선 이동 민감도 | 재계산 PV, 기대 곡선 | ±1%p 평행이동은 샘플 가정 |
CDS 구성
화면이 바라보는 서비스는 CDS 뷰 위에 게시하는 것을 전제로 만들었습니다. 아래는 계층별 코드 스케치이며, 뷰 이름은 기능을 뜻하는 영문으로 지었습니다. 곡선과 현금흐름의 원천은 회사의 계리 시스템에 따라 달라 확인 필요이고, 표준 CDS 뷰의 필드 이름은 릴리스에 따라 다를 수 있어 적용 전 확인이 필요합니다.
원천 테이블
| 원천 | 용도 | 비고 |
|---|---|---|
| ACDOCA (표준 CDS: I_JournalEntryItem) | 보험계약 부채 계정의 원장 금액 — 장부 PV 와 맞춰 볼 대조 대상 | 표준 |
| SKA1 · SKAT (표준 CDS: I_GLAccountInChartOfAccounts) | G/L 계정 마스터와 텍스트 | 표준 |
| 할인곡선 · 이행현금흐름 명세 | 무위험 수익률, 비유동성 프리미엄, 만기별 현금흐름 | 계리 시스템 결과 — 원천 확인 필요 |
필드 매핑
| 화면 프로퍼티 | 원천 / 산출식 |
|---|---|
| ExpRate | 무위험 수익률 + 비유동성 프리미엄 |
| BookDiff / DiscDiff | 장부 적용 − 기대 / 공시 − 장부 적용 |
| DfExp / DfBook | 1 ÷ (1 + 할인율÷100)^만기 |
| PvExp / PvBook | 현금흐름 × 기대 할인계수 / × 장부 할인계수 |
| BookPv / CalcPv / PvGap | Σ PvBook / Σ PvExp / BookPv − CalcPv |
| PvUp / PvDown / EffDur | Σ 현금흐름 ÷ (1+(기대 할인율±1)÷100)^만기 / (PvDown − PvUp) ÷ (2×PvBase×0.01) |
| (대조) 원장 금액 | ACDOCA 금액 합계 — 부채 계정·원장 0L 조건 |
① Basic(Interface) 뷰 — 곡선 지점
@AbapCatalog.viewEnhancementCategory: [#NONE]
@EndUserText.label: '할인곡선 지점 (기본)'
define view entity ZI_DiscCurvePoint
as select from ZI_DiscCurveSource -- 회사 곡선 자료를 가져오는 기초 뷰 (원천은 확인 필요)
{
key FiscalYear,
key FiscalPeriod,
key CurveCode,
key TenorYear,
LiquidityClass, -- ILLIQ(환급불가형) / LIQ(해지환급형)
BaseDate,
RiskFreeRate, -- 무위험 수익률(%)
IlliquidityPremium, -- 비유동성 프리미엄(%p)
BookRate, -- 장부 적용 할인율(%)
DisclosedRate, -- 주석 공시 할인율(%)
RiskFreeRate + IlliquidityPremium as ExpectedRate
}
곡선 자료를 키(회계연도·기간·곡선·만기)로 정리하고 기대 할인율을 한 곳에서 계산합니다. 장부 적용·공시 할인율을 원천 그대로 두어 차이 계산을 상위 뷰에서 합니다.
① Basic(Interface) 뷰 — 원장 잔액(대조용)
@AbapCatalog.viewEnhancementCategory: [#NONE]
@EndUserText.label: '보험계약 부채 원장 잔액 (대조용)'
define view entity ZI_DiscLedgerBalance
as select from I_JournalEntryItem as j
{
key j.CompanyCode,
key j.FiscalYear,
key j.FiscalPeriod,
key j.GLAccount,
@Semantics.amount.currencyCode: 'CompanyCodeCurrency'
sum( j.AmountInCompanyCodeCurrency ) as LedgerAmount,
j.CompanyCodeCurrency
}
where j.Ledger = '0L'
group by j.CompanyCode, j.FiscalYear, j.FiscalPeriod, j.GLAccount, j.CompanyCodeCurrency
표준 CDS 위에서 부채 계정의 원장 금액을 계정·기간별로 모읍니다. 집합별 장부 PV 합계와 맞춰 볼 기준 금액입니다.
② Composite 뷰 — 현금흐름과 PV
@AbapCatalog.viewEnhancementCategory: [#NONE]
@EndUserText.label: '현금흐름과 PV 비교 (조합)'
define view entity ZI_DiscFlowItem
as select from ZI_InsFulfilCashFlow as f -- 회사 이행현금흐름 기초 뷰 (확인 필요)
association [1] to ZI_DiscCurvePoint as _book
on _book.CurveCode = f.BookCurve and _book.TenorYear = f.TenorYear
and _book.FiscalYear = f.FiscalYear and _book.FiscalPeriod = f.FiscalPeriod
association [1] to ZI_DiscCurvePoint as _exp
on _exp.CurveCode = f.ExpectedCurve and _exp.TenorYear = f.TenorYear
and _exp.FiscalYear = f.FiscalYear and _exp.FiscalPeriod = f.FiscalPeriod
{
key f.FiscalYear, key f.FiscalPeriod, key f.GroupCode, key f.TenorYear,
f.PortfolioCode, f.LiquidityClass, f.BookCurve, f.ExpectedCurve, f.Currency,
f.CashFlow,
cast( f.CashFlow / power( 1 + _book.BookRate / 100, f.TenorYear ) as abap.dec( 18, 1 ) ) as PvBook,
cast( f.CashFlow / power( 1 + _exp.ExpectedRate / 100, f.TenorYear ) as abap.dec( 18, 1 ) ) as PvExpected
}
현금흐름에 장부 곡선과 기대 곡선을 연결해 두 벌의 PV 를 계산합니다. 곡선 연결은 association 으로 두어 만기·기간 키가 같은 지점만 붙게 합니다.
② Composite 뷰 — 집합별 PV 대사
@AbapCatalog.viewEnhancementCategory: [#NONE]
@EndUserText.label: '집합별 PV 대사 (조합)'
define view entity ZI_DiscGroupPv
as select from ZI_DiscFlowItem as f
{
key f.FiscalYear,
key f.FiscalPeriod,
key f.GroupCode,
f.PortfolioCode,
f.LiquidityClass,
f.BookCurve,
f.ExpectedCurve,
@Semantics.amount.currencyCode: 'Currency'
sum( f.CashFlow ) as FutureCashFlow,
@Semantics.amount.currencyCode: 'Currency'
sum( f.PvBook ) as BookPv,
@Semantics.amount.currencyCode: 'Currency'
sum( f.PvExpected ) as CalcPv,
@Semantics.amount.currencyCode: 'Currency'
sum( f.PvBook ) - sum( f.PvExpected ) as PvGap,
f.Currency,
case
when f.BookCurve <> f.ExpectedCurve then 'CHECK'
when abs( sum( f.PvBook ) - sum( f.PvExpected ) ) >= 0.1 then 'CHECK'
else 'OK'
end as CheckStatus
}
group by f.FiscalYear, f.FiscalPeriod, f.GroupCode, f.PortfolioCode,
f.LiquidityClass, f.BookCurve, f.ExpectedCurve, f.Currency
집합 단위로 합산하고 PV 차이와 점검 판정(곡선 불일치 또는 차이 0.1 이상)을 case 로 만듭니다. 통화 필드와 @Semantics 어노테이션으로 금액 합산이 안전하게 합니다.
③ Consumption(Projection) 뷰
@EndUserText.label: '집합별 PV 대사 (소비)'
@Metadata.allowExtensions: true
@Search.searchable: true
@ObjectModel.query.implementedBy: 'ABAP:ZCL_Disc_GroupPv_Query' -- 필요할 때만 (확인 필요)
define view entity ZC_DiscGroupPv
as projection on ZI_DiscGroupPv
{
@UI.lineItem: [{ position: 10 }]
@Consumption.filter: { mandatory: true, selectionType: #SINGLE }
key FiscalYear,
@UI.lineItem: [{ position: 20 }]
@Consumption.filter: { selectionType: #SINGLE }
key FiscalPeriod,
@UI.lineItem: [{ position: 30 }]
@Search.defaultSearchElement: true
key GroupCode,
@UI.selectionField: [{ position: 10 }]
@UI.lineItem: [{ position: 40 }]
PortfolioCode,
@UI.selectionField: [{ position: 20 }]
@UI.lineItem: [{ position: 50 }]
LiquidityClass,
@UI.lineItem: [{ position: 60 }] BookCurve,
@UI.lineItem: [{ position: 70 }] ExpectedCurve,
@UI.lineItem: [{ position: 80 }] BookPv,
@UI.lineItem: [{ position: 90 }] CalcPv,
@UI.lineItem: [{ position: 100, criticality: 'CheckCriticality' }] PvGap,
@UI.selectionField: [{ position: 30 }]
CheckStatus
}
화면의 조회조건과 같은 필터를 @UI·@Consumption.filter 로 선언하고 검색 대상을 지정합니다. 회계연도는 필수 필터로 두었습니다.
④ 접근 제어(DCL)
@EndUserText.label: '집합별 PV 접근 제어'
@MappingRole: true
define role ZI_DiscGroupPvAccess {
grant select on ZI_DiscGroupPv
where ( CompanyCode ) = aspect pfcg_auth( F_BKPF_BUK, BUKRS, ACTVT = '03' );
}
-- 샘플은 회사가 하나라 CompanyCode 를 두지 않았습니다. 운영에서는 ZI_DiscGroupPv 의 키에 회사코드를 더합니다.
회사코드 권한 객체로 집합을 걸러 권한 없는 회사의 데이터가 합계에도 섞이지 않게 합니다.
⑤ 서비스 노출(Service Definition + Service Binding)
@EndUserText.label: '할인율 점검 서비스'
define service ZUI_DiscCheck {
expose ZC_DiscCurvePoint as CurveSet;
expose ZC_DiscGroupPv as GroupSet;
expose ZC_DiscFlowItem as FlowSet;
expose ZC_DiscSensitivity as SensSet;
}
-- Service Binding: ZUI_DiscCheck_O2 / 바인딩 유형 OData V2 - UI / 게시 후 서비스 URL 을 앱 설정에 선언
소비 뷰를 엔티티셋 이름으로 노출하고 OData V2 로 게시합니다. 앱 설정의 서비스 경로만 이 주소로 바꾸면 화면이 그대로 붙습니다.
⑥ 파라미터 뷰와 함수 스케치
@EndUserText.label: '곡선 평행이동 민감도 (파라미터)'
define view entity ZA_DiscShiftPv
with parameters
p_ShiftPct : abap.dec( 5, 2 ) -- +1.00 / -1.00 (%p)
as select from ZI_DiscFlowItem as f
association [1] to ZI_DiscCurvePoint as _exp
on _exp.CurveCode = f.ExpectedCurve and _exp.TenorYear = f.TenorYear
and _exp.FiscalYear = f.FiscalYear and _exp.FiscalPeriod = f.FiscalPeriod
{
key f.FiscalYear, key f.FiscalPeriod, key f.GroupCode,
sum( cast( f.CashFlow / power( 1 + ( _exp.ExpectedRate + $parameters.p_ShiftPct ) / 100, f.TenorYear )
as abap.dec( 18, 1 ) ) ) as PvShifted
}
group by f.FiscalYear, f.FiscalPeriod, f.GroupCode
-- 합계 순서를 서비스 함수(GetPvGapNet)로 노출하려면 RAP 의 static function 으로 감쌉니다.
-- define behavior ... { static function GetPvGapNet parameter ZA_PvGapParam result [1] abap.dec( 18, 1 ); }
민감도의 평행이동 폭을 파라미터로 받아 PV 를 다시 계산합니다. 합계를 돌려주는 서비스 함수는 RAP 의 static function 으로 감싸는 방식을 스케치했습니다.
실제 운영 시점에서 해야 할 작업
- 곡선·현금흐름 원천 확정 — 계리 시스템에서 곡선(무위험 수익률·프리미엄)과 집합별 만기별 현금흐름을 어떤 형태로 받을지 정하고 기초 뷰를 그에 맞게 만듭니다.
- 계정체계·곡선 매핑 입력 — 샘플의 환급불가형=CRV1, 해지환급형=CRV2 규칙을 회사의 상품군·곡선 체계를 담은 매핑 테이블/뷰로 바꿉니다. 허용 범위(0.05%p·0.005%p·0.1)도 회사 정책값으로 바꿉니다.
- 확장 필드 연결 — 회사코드·원장·계약 그룹 같은 확장 필드를 기초 뷰에 더하고 DCL 이 쓰는 키에 맞춥니다.
- 권한 롤 배정 — 회사코드 권한 객체(F_BKPF_BUK)를 조회 롤에 넣고 결산 담당자·계리 담당자·감사 대응 담당자에게 배정합니다.
- 성능 확인 — 기간 조건을 필수로 두고 곡선 지점·현금흐름 뷰의 키 필터가 아래 계층까지 내려가는지 실행 계획으로 확인합니다. 집합·만기가 많으면 PV 계산을 뷰에서 하고 화면은 결과만 읽게 합니다.
- 서비스 활성화 — Service Binding 을 게시하거나 /IWFND/MAINT_SERVICE 로 서비스를 등록하고 메타데이터가 정상으로 열리는지 확인합니다.
- 앱 연결 — 앱 설정(manifest)의 서비스 주소를 운영 서비스 경로로 바꿉니다. 화면 코드는 바꾸지 않습니다.
- 이관(Transport) — 기초 뷰 → 조합 뷰 → 소비 뷰 → DCL → 서비스 정의·바인딩 순서로 한 이관 요청에 담아 옮깁니다.
- 운영 전 대사 검증 — ①집합별 장부 PV 합계와 원장 잔액을 맞춰 보고 ②곡선 지점 기대 할인율을 계리 모델 값과 비교하고 ③민감도를 계리 결과와 대조하고 ④점검 필요 항목을 한 건씩 원인 분류해 감사인과 공유합니다.
OpenUI5 구성
앱은 서비스를 앱 설정의 데이터 소스로만 선언하고, 표 다섯 개가 각각 해당 엔티티셋에 바인딩됩니다. 조회조건은 필터 객체로 만들어 서비스 필터로 전달하며 "전체"는 그 조건 자체를 만들지 않습니다. 정렬과 스크롤은 서비스 정렬·페이징으로 처리하고 서비스 연결에 실패하면 별도 오류 처리기가 안내 창을 띄웁니다. 테마는 sap_horizon 입니다.
파일 구성
index.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/
odata/ 서비스 정의(메타데이터·서비스 로직·엔티티셋별 데이터)
검증 결과
화면 안의 일관성은 7개 대사식으로 확인했습니다. 2026-09 기준 검사 60건, 두 기간 합계 120건에서 차이는 0건입니다. 의도적으로 넣은 점검 대상(곡선 지점 2건, 집합 3건, 현금흐름 7건)은 대사 차이와 분리해 기록했습니다. 조회 버튼 위치, Enter 조회, 테마 sap_horizon, 행 클릭 상세, 연결 실패 안내를 실제 브라우저에서 확인했습니다.
| 대사식 | 검사 건수(2026-09) | 차이 건수 |
|---|---|---|
| 기대 할인율 = 무위험 수익률 + 비유동성 프리미엄 | 12 | 0 |
| 명목 현금흐름 합계 = Σ 만기별 현금흐름 | 8 | 0 |
| 장부 PV = Σ 현금흐름×장부 할인계수 | 8 | 0 |
| 재계산 PV = Σ 현금흐름×기대 할인계수 | 8 | 0 |
| PV 차이 = 장부 PV − 재계산 PV | 8 | 0 |
| 민감도 기준 PV = 재계산 PV | 8 | 0 |
| 현금흐름 건수 일치 | 8 | 0 |
자주 묻는 질문
이 점검은 어떤 기준서의 어떤 요구사항에 근거합니까?
IFRS 17 보험계약(K-IFRS 제1117호)은 이행현금흐름을 현재가치로 바꾸는 할인율이 화폐의 시간가치, 현금흐름의 특성, 보험계약의 유동성 특성을 반영하도록 요구합니다. 이 화면은 그 요구사항을 곡선 지점과 집합 단위로 다시 계산해 장부와 맞춰 보는 도구입니다. 무위험 곡선을 바탕으로 프리미엄을 더하는 상향식과 참조 포트폴리오에서 출발하는 하향식 중 어느 방법을 쓸지, 프리미엄을 어떻게 산정할지는 회사의 판단이며 이 화면은 그 판단 자체를 대신하지 않습니다. 기준서 문단 번호와 세부 요건은 원문으로 확인할 사항입니다.
도입하면 어떤 직무가 언제 쓰게 됩니까?
결산 담당 회계 인력과 계리 인력이 월·분기 마감 직전에 씁니다. 계리 모델이 만든 현재가치를 원장에 올리기 전에 할인율이 곡선과 맞게 적용됐는지, 주석에 옮겨 적은 공시 할인율이 장부와 같은지를 한 번에 걸러 줍니다. 감사 대응 때는 "이 집합에 왜 이 곡선을 썼는가"를 묻는 질문에 곡선 선택과 PV 차이를 근거로 바로 답할 수 있습니다. 샘플에서는 점검 필요 항목을 찾는 데 필터 두세 번이면 충분했습니다.
SAP 표준 T-code 와는 어떤 관계입니까?
원장 금액을 확인하는 일은 FAGLL03 과 FAGLB03 같은 표준 T-code 가 계속 담당합니다. 이 화면은 표준 화면이 보여 주지 않는 "그 금액을 만든 할인율과 현재가치가 맞는가"를 더해 확장합니다. 이 화면에서 본 집합별 장부 PV 합계를 FAGLB03 의 계정 잔액과 맞춰 보고, 차이가 나면 FAGLL03 에서 개별 항목으로 내려가는 순서로 오갑니다. 반대로 표준 화면에서 이상한 잔액을 본 경우에는 이 화면의 집합별 PV 대사 탭에서 같은 집합을 찾아 봅니다.
데이터 원천과 정합성은 어떻게 보장합니까?
화면의 숫자는 곡선 지점, 만기별 현금흐름, 장부 적용 값에서 나옵니다. 기대 할인율은 무위험 수익률과 비유동성 프리미엄을 더해, 할인계수와 PV 는 곡선과 현금흐름에서 다시 계산합니다. 화면 안의 일관성은 7개 대사식으로 확인하며 검증용 샘플 데이터 전수(120건)에서 차이가 0이었습니다. 다만 곡선과 현금흐름 자체가 계리 모델의 올바른 결과인지는 이 화면이 판단할 수 없고, 원천 자료의 적정성은 확인이 필요합니다.
운영 시스템에 연결하려면 무엇을 해야 합니까?
화면은 서비스 주소만 바꾸면 되도록 만들어져 있습니다. 운영에서는 CDS 뷰 위에 서비스를 게시하고 앱 설정의 서비스 경로를 그 주소로 바꿉니다. 실제 작업량은 곡선과 현금흐름을 어디서 가져올지 정하는 데 있습니다. 계리 시스템의 결과를 어떤 형태로 받을지, 곡선 기준일과 결산 기간을 어떻게 맞출지를 먼저 정해야 하며, 이 부분은 회사별로 달라 확인이 필요합니다. 소요 기간은 원천 자료가 정리돼 있으면 짧고 그렇지 않으면 그 정리에 대부분이 쓰입니다.
권한과 보안은 어떻게 다룹니까?
조회 전용 화면이며 원장에 쓰지 않습니다. CDS 에 접근 제어를 붙여 회사코드 권한 객체를 따르게 하므로 권한 없는 회사의 집합은 목록에서도 보이지 않습니다. 집계 합계만 보이고 상세만 막으면 합계에서 남의 몫을 빼서 알아낼 수 있으므로 권한은 상세가 아니라 읽는 자리에 겁니다. CSV 내려받기는 화면에 보이는 범위만 내려받습니다.
집합 수와 현금흐름이 많아지면 성능은 어떻습니까?
조회 조건은 모두 서비스의 필터로 전달되어 서비스 쪽에서 걸러진 결과만 내려오고, 표는 보이는 만큼만 읽어 옵니다. 운영 규모에서는 기간 조건을 필수로 두고 곡선 지점과 현금흐름 뷰에 키 기준 인덱스를 확인해야 합니다. 현재가치를 화면이 아니라 CDS 에서 계산하면 집합·만기 수가 늘어도 전송량은 그대로입니다. 민감도는 평행이동 횟수만큼 다시 계산하므로 이동 폭을 몇 가지로 둘지에 따라 부하가 달라집니다.
계정 체계나 곡선 매핑을 우리 회사 기준으로 바꿀 수 있습니까?
가능합니다. 이 화면의 곡선 연결 규칙(환급불가형은 CRV1, 해지환급형은 CRV2)과 허용 범위(장부-기대 0.05%p, 공시-장부 0.005%p, PV 0.1 백만원)는 샘플 기준이므로 회사 정책에 맞는 매핑 뷰와 파라미터로 바꿔 넣습니다. 상품군 구분이 더 세분되어 있으면 유동성 특성 값을 늘리고 곡선도 그만큼 추가합니다. 화면은 값 목록만 바뀌므로 구조를 다시 만들 필요는 없습니다.
"점검 필요"가 나오면 회계처리가 잘못됐다는 뜻입니까?
그렇게 단정하지 않습니다. 장부와 다시 구한 값이 다르거나 확인할 사항이 있는 행을 골라 보여 주는 표시입니다. 곡선의 기준일이 다르거나 프리미엄 산정 방식이 달라서 생기는 정당한 차이일 수 있어, 원인은 곡선 자료와 계리 모델을 함께 보아야 알 수 있습니다. 이 화면은 분류·집계·대사를 돕는 점검 도구이고 최종 판단은 회사와 감사인이 합니다.
기준서의 적용 시기와 이 화면의 범위는 어디까지입니까?
적용 시기와 경과규정은 기준서 원문으로 확인할 사항이며 이 화면은 시기를 판단하지 않습니다. 범위는 할인곡선 지점의 구성, 집합별 현재가치의 재계산과 대사, 곡선 이동 민감도의 조회입니다. 보험계약마진 증감, 보험금융손익의 당기손익·OCI 분해, 직접참가특성이 있는 계약의 기초항목 수익률 반영은 범위에 넣지 않았습니다. 이들은 별도 점검 화면의 몫입니다.
보험계약 할인율의 곡선 선택과 현재가치 차이를 결산 전에 걸러내세요
계리 결과와 장부, 주석 공시가 여러 파일에 흩어져 있어 마감 때마다 다시 맞춰 보느라 시간이 든다면, 우리 회사 곡선 체계에 맞춘 점검 화면이 필요하다면 문의해 주세요.