‘Scary’ Credit‑Risk Formula와 함께 RS‑X의 힘을 보여주다
Source: Dev.to
“무서운” 신용‑리스크 공식
아래는 여러 데이터 소스를 결합한 TypeScript 기반 신용‑리스크 공식입니다.
모델 정의
// Model
export interface ICustomer {
age: number;
income: number;
employmentYears: number;
}
// Credit info
export interface ICredit {
score: number;
outstandingDebt: number;
}
// Market parameters
export interface IMarket {
baseInterestRate: number;
}
// Risk parameters
export interface IRisk {
volatilityIndex: number; // e.g., market volatility
recessionProbability: number; // e.g., probability of economic downturn
}
// Risk calculation parameters
export interface IRiskCalcParameters {
readonly market: IMarket;
readonly risk: IRisk;
}
// Asynchronous data sources (simulating API calls)
export interface IRiskModel {
readonly customer: BehaviorSubject;
readonly credit: BehaviorSubject;
readonly riskParameters: BehaviorSubject;
}
단일 공식
(
(credit.score = 0.75 ? 'HIGH' : (
(
(credit.score = 0.45 ? 'MEDIUM' : 'LOW'
);
하나의 거대한 공식으로 시작하더라도 RS‑X를 사용하면 이를 반응형 표현식으로 변환할 수 있습니다.
RS‑X로 공식을 분할하기
데이터 모델은 간단합니다:
- 고객 정보
- 신용 정보
- 시장 / 리스크 파라미터
이 값들은 독립적으로 변하거나 비동기적으로 도착할 수 있습니다. RS‑X는 이를 신경 쓰지 않으며, 여러분은 단순히 표현식에 끼워 넣기만 하면 업데이트가 자동으로 흐릅니다—리스너도, 수동 구독도, 명시적인 recalculateRiskScore() 호출도 필요 없습니다.
하위 표현식
// Baseline personal risk
const basePersonalRisk = expressionFactory.create(model, `
(credit.score ;
// Age‑based adjustment
const ageBasedRiskAdjustment = expressionFactory.create(_model, `
customer.age ;
// Market risk component
const marketRisk = expressionFactory.create(_model, `
(riskParameters.risk.volatilityIndex * 0.5) +
(riskParameters.risk.recessionProbability * 0.5)
`) as IExpression;
// Interest‑rate impact
const interestRateImpact = expressionFactory.create(_model, `
riskParameters.market.baseInterestRate * 2
`) as IExpression;
조각들을 결합하기
const riskScore = expressionFactory.create({
basePersonalRisk,
ageBasedRiskAdjustment,
marketRisk,
interestRateImpact
}, `
basePersonalRisk + ageBasedRiskAdjustment + marketRisk + interestRateImpact
`);
const riskClassification = expressionFactory.create({
riskScore: riskScore as IExpression,
thresholds: { highRisk: 0.75, mediumRisk: 0.45 }
}, `
riskScore >= thresholds.highRisk
? 'HIGH'
: riskScore >= thresholds.mediumRisk
? 'MEDIUM'
: 'LOW'
`);
각 하위 표현식은 입력이 변경될 때만 재계산되므로 가독성과 성능을 동시에 얻을 수 있습니다.
다른 활용 사례
같은 패턴을 다음에 적용할 수 있습니다:
- 가격 규칙
- 검증 로직
- 기능 플래그
- 스코어링 모델
- UI 상태
…즉, 상상할 수 있는 모든 것에 적용 가능합니다.
정리
- 복잡한 공식이 복잡한 코드를 요구하지는 않습니다.
- RS‑X는 단일 표현식을 자동으로 분할할 수 있습니다.
- 비동기와 동기 데이터가 손쉽게 섞입니다.
- 업데이트가 자동으로, 효율적으로 전파됩니다.
RS‑X는 무엇을 해야 하는지 설명하고, 어떻게 최신 상태를 유지할지에 대해서는 신경 쓰지 않게 해 줍니다. “무서운” 공식도 읽기 쉽고, 모듈화되며, 효율적이고, 놀라울 정도로 차분해집니다.
데모
실제 동작을 보려면 StackBlitz에서 라이브 데모를 확인하세요:
StackBlitz demo
참고 자료
- RS‑X GitHub
- NPM 패키지:
@rs-x/core@rs-x/state-manager@rs-x/expression-parser@rs-x/angular