Next.js로 프리랜서 요금 계산기를 만들었습니다

발행: (2026년 6월 8일 AM 09:09 GMT+9)
6 분 소요
원문: Dev.to

출처: Dev.to

대부분의 프리랜서 요금 계산기는 틀립니다. 버그가 있는 것이 아니라 개념 자체가 잘못된 겁니다. 목표 연소득을 시간으로 나누어 계산하고, 그 결과가 연중 내내 당신의 수입을 은근히 줄여버립니다.

프리랜서 친구들에게 올바른 계산법을 설명하는 데 지쳤기에, 제대로 된 도구를 직접 만들었습니다. 아래는 그 로직과 구현 과정에 대한 간단한 설명입니다.

일반적인 계산기의 로직

hourly_rate = annual_income_goal / annual_hours_worked

예를 들어 연 $80,000을 목표로 하고 연 2,080시간(40 × 52) 일한다면, 약 $38/시간을 청구하라고 알려줍니다.

하지만 이 방식은 세 가지 측면에서 잘못되었습니다.

  1. 순수익 목표와 세전 소득
    목표 금액은 순수익, 즉 실제로 손에 쥐고 싶은 금액입니다. 하지만 세금은 세전 소득에 부과됩니다. 따라서 먼저 세전 금액을 구해야 합니다.

    const grossIncome = netTarget / (1 - taxRate);
    // $80,000 / (1 - 0.28) = $111,111

    순수히 위 식만 쓰면 $31,000 차이가 무시됩니다.

  2. 청구 가능한 실제 근무 시간
    프리랜서는 전체 근무 시간 중 약 55 ~ 65%만 청구 가능한 시간으로 사용합니다. 나머지는 행정 업무, 제안서 작성, 청구, 영업 전화, 학습 등에 쓰이죠.

    const totalHours = weeksWorked * hoursPerWeek;        // 46 * 40 = 1840
    const billableHours = totalHours * billableRatio;     // 1840 * 0.6 = 1104

    즉 실제 청구 가능한 시간은 2,080시간이 아니라 약 1,104시간에 가깝습니다. 잘못된 분모를 사용하면 50시간 주당 근무를 해도 목표 소득에 못 미치는 상황이 발생합니다.

  3. 기타 비용 고려
    소프트웨어, 하드웨어, 보험, 교육 등 실제로 지출해야 하는 비용을 모두 포함해야 합니다.

    const totalNeeded = grossIncome + annualExpenses;

전체 로직

function minimumRate({ netTarget, taxRate, expenses, weeks, hoursPerWeek, billableRatio }) {
  const gross = netTarget / (1 - taxRate);
  const totalNeeded = gross + expenses;
  const billableHours = weeks * hoursPerWeek * billableRatio;
  return totalNeeded / billableHours;
}

minimumRate({
  netTarget: 80000,
  taxRate: 0.28,
  expenses: 8000,
  weeks: 46,
  hoursPerWeek: 40,
  billableRatio: 0.6
});
// ≈ $107/hr — not $38/hr

결과는 시간당 $107 정도이며, 단순 계산인 $38와는 2.8배 차이가 납니다. 1년 전체를 기준으로 보면 $38와 $107 사이의 차이는 엄청납니다.

구현 상세

  • 이 도구는 Next.js 14(App Router) 기반으로 Vercel에 배포된 애플리케이션입니다.
  • 계산기는 useState 로 입력을 받고, useMemo 로 파생된 요금을 계산하는 단일 클라이언트 컴포넌트이며, 백엔드가 전혀 필요 없습니다. 모든 수식이 브라우저에서 실행됩니다.

프로그램적 SEO

하나의 페이지가 아니라 직업 × 국가 조합마다 정적 페이지를 생성했습니다.

export async function generateStaticParams() {
  return COUNTRIES.flatMap(country =>
    PROFESSIONS.map(profession => ({ country, profession }))
  );
}

이렇게 하면 8개의 직업과 6개의 국가 조합으로 48개의 정적 페이지가 만들어지고, 각각 “호주 프리랜서 개발자 요금” 같은 롱테일 검색어를 타깃으로 합니다. 배포 시점에 모두 빌드되며, 엣지에서 바로 제공됩니다.

  • 시장 벤치마크 데이터는 직업별로 키가 된 평범한 JSON 객체에 저장되고, 국가별 통화 환율을 곱해 사용합니다. 데이터베이스나 CMS 없이 정적 데이터와 정적 렌더링만으로 빠르고 비용 없이 운영할 수 있습니다.

사용 방법

실제 도구는 freelancecalculator.net 에서 무료로 이용할 수 있습니다. 회원가입 없이 통화를 선택하고, 자신의 수치를 입력하면 최소 요금, 20% 여유를 둔 권장 요금, 그리고 시장 평균과의 비교를 보여줍니다.

프리랜서 개발자라면 아직도 위와 같은 수정된 공식을 쓰지 않았다면, 1분 정도만 투자해 보는 것이 좋습니다. 당신의 실제 요금이 생각보다 높을 수도 있습니다.

0 조회
Back to Blog

관련 글

더 보기 »