주휴수당은 계산식 자체는 단순하지만, 실제로는 대상 조건 + 시간 상한 + 월 환산 기준이 섞여서 자주 헷갈립니다. 이번 계산기는 사용자가 입력한 근무 패턴을 기준으로, 아래 순서대로 결과를 내도록 설계했습니다.

핵심 로직 요약

  1. 대상 여부 1차 판정: 주 소정근로시간 15시간 이상인지 확인
  2. 대상 여부 2차 판정: 개근 체크와 결합해 최종 대상/비대상 결정
  3. 주휴시간 계산: 주 근로시간 ÷ 주 소정근무일수
  4. 법정 상한 적용: 주휴시간 최대 8시간으로 제한
  5. 급여 산출: 주 금액 + 월 환산(4.345주) 동시 제공

1) 대상 여부는 “주 15시간 + 개근”으로 분기

먼저 주 15시간 이상을 확인하고, 그다음 개근 여부를 합쳐 최종 대상을 만듭니다.

const eligibleByHour = weekHours >= 15;
const eligible = eligibleByHour && isPerfect;

이렇게 분리해두면 안내 메시지도 정확하게 줄 수 있습니다.

  • 15시간 미만: 시간 요건 미충족
  • 15시간 이상이지만 개근 아님: 개근 요건 미충족

2) 주휴시간은 “주근로시간 ÷ 주근무일수”

계산기의 기본식은 아래와 같습니다.

const rawPaidHours = weekHours / weekDays;

예: 주 20시간, 주 5일 근무면 4시간이 주휴시간이 됩니다.

3) 주휴시간 상한 8시간 적용

입력 조합에 따라 주근로시간 ÷ 주근무일수 값이 커질 수 있기 때문에 상한을 강제합니다.

const paidHours = Math.min(8, rawPaidHours);

이 상한을 둬야 특정 극단 입력에서 금액이 과도하게 커지는 문제를 막을 수 있습니다.

4) 금액 계산: 주 단위 + 월 환산

최종 대상일 때만 급여를 계산하고, 비대상이면 0으로 처리합니다.

const weeklyPay = eligible ? (paidHours * wage) : 0;
const monthlyPay = weeklyPay * 4.345;
  • 주휴수당(주): 주 단위 예상 금액
  • 주휴수당(월 환산): 평균 주수 4.345를 곱한 추정치

월 환산은 정산 편의를 위한 참고치라서, 실제 지급액은 월별 근무일수/결근/회사 정책에 따라 달라질 수 있습니다.

5) 입력값 방어(clamp)로 계산 안정성 확보

붙여넣기·스크립트 입력 등으로 UI 범위를 벗어나는 값을 넣어도 결과가 무너지지 않게 방어했습니다.

const wage = clamp(wageRaw, 0, 1000000);
const weekHours = clamp(weekHoursRaw, 0, 80);
const weekDays = clamp(Math.floor(weekDaysRaw), 1, 7);
  • 시급: 0~1,000,000
  • 주 근로시간: 0~80
  • 주 근무일수: 1~7 (정수)

또한 필수값이 비어 있으면 계산 대신 안내 문구를 먼저 보여줘, 잘못된 중간 상태가 결과로 노출되지 않도록 했습니다.

내부 링크

요약

이번 코어 로직의 핵심은 아래 3가지입니다.

  • 대상 판정 로직(주 15시간 + 개근)을 명확히 분리
  • 주휴시간 계산식에 8시간 상한을 적용해 과대계산 방지
  • 주/월 결과를 동시에 제공하고 입력값 clamp로 안정성 확보

실사용 관점에서는 “내가 대상인지”와 “주/월 얼마인지”를 같은 화면에서 바로 확인할 수 있게 한 점이 가장 중요한 설계 포인트입니다.