Utility Village 대출 계산기는 한국에서 실제로 사용되는 4가지 상환 방식을 모두 지원합니다. 단순한 월 납부액 계산을 넘어, 납부일 기준으로 실제 일별 이자를 계산하는 주금공(주택금융공사) 방식도 구현했습니다.

4가지 상환 방식

1. 원리금균등 (Equal Payment)

매월 동일한 금액을 납부합니다. 초기에는 이자 비중이 높고, 후반으로 갈수록 원금 비중이 높아집니다.

월 납부액 M = P × r(1+r)ⁿ / [(1+r)ⁿ - 1]
  • P: 대출 원금
  • r: 월 이자율 (연이율 / 12)
  • n: 상환 기간 (월)

2. 원금균등 (Equal Principal)

매월 동일한 원금을 납부하고, 이자는 남은 원금에 따라 줄어듭니다. m번째 납부액은 다음과 같습니다.

월 원금 상환액 = P / n
m번째 납부액 = (P / n) + (P - (m-1) × P/n) × r

초반 납부액이 높지만 총 이자 부담이 원리금균등보다 적습니다.

3. 만기일시 (Bullet)

상환 기간 동안 이자만 납부하고, 만기에 원금 전액을 일시 상환합니다.

매월 납부 이자 = P × r
만기 납부액 = P (원금)

4. 체증식 (Graduated)

납부액이 매월 일정 금액씩 증가합니다. 초기 소득이 낮은 사회 초년생에게 유리한 방식입니다.

기간별 월 증가액(g)과 첫 달 납부액(R₁)은 다음과 같이 계산합니다.

function calculateGraduated(P: number, r: number, n: number) {
  // 기간별 월 증가율 (연간 증가율 / 12)
  const annualIncrease = getAnnualIncreaseRate(n); // 대출 기간에 따라 결정
  const g = annualIncrease / 12;

  // 첫 달 납부액: 현재가치 균형 방정식으로 역산
  // Σ (R₁ + (m-1)×g) / (1+r)^m = P
  const R1 = solveFirstPayment(P, r, n, g);

  return Array.from({ length: n }, (_, i) => R1 + i * g);
}

거치기간 처리

거치기간(graceYears) 동안에는 이자만 납부합니다. 거치 종료 후 남은 기간에 대해 상환 방식에 따른 계산을 새로 적용합니다.

if (graceYears > 0) {
  const gracePeriods = graceYears * 12;
  // 거치 기간: 이자만 납부
  for (let i = 0; i < gracePeriods; i++) {
    schedule.push({ payment: principal * monthlyRate, interest: ..., principal: 0 });
  }
  // 거치 후: 남은 기간으로 상환 스케줄 재계산
  const remainingSchedule = calculate(principal, monthlyRate, n - gracePeriods, method);
  schedule.push(...remainingSchedule);
}

납부일 기준 일별 이자 계산

단순히 월 이자율로 계산하면 실제 은행 계산과 차이가 생깁니다. 주금공 방식은 납부일 사이의 실제 일수를 기준으로 이자를 계산합니다.

function calculateDailyInterest(
  balance: number,
  annualRate: number,
  fromDate: Date,
  toDate: Date
): number {
  const days = Math.round(
    (toDate.getTime() - fromDate.getTime()) / (1000 * 60 * 60 * 24)
  );
  return balance * (annualRate / 365) * days;
}

날짜 처리 시 주의할 점은 말일 보정입니다. 예를 들어 1월 31일에서 1개월을 더하면 2월 28일(또는 29일)이 되어야 합니다.

function addMonths(date: Date, months: number): Date {
  const result = new Date(date);
  const day = result.getDate();
  result.setMonth(result.getMonth() + months);
  // 말일 보정: 월이 넘어갔다면 이전 달의 말일로
  if (result.getDate() < day) {
    result.setDate(0);
  }
  return result;
}

결과 시각화

계산 결과는 LoanResult 타입으로 반환되어 두 가지 방식으로 표시됩니다.

  • Recharts BarChart: 연도별 원금·이자·누적 상환액을 누적 막대 그래프로 표시
  • LoanScheduleTable: 월별 납부액, 이자, 원금, 잔액을 상세 테이블로 표시

4가지 상환 방식을 동시에 계산하여 총 납부액과 총 이자를 비교할 수 있어, 본인 상황에 맞는 상환 방식을 선택하는 데 도움이 됩니다.


사이트 바로가기: https://utility.dreamurl.biz/calculator/loan-calculator