앱인토스 미니앱 K패스 환급 계산기 화면 세 장
|

앱인토스 미니앱 7 – K패스 환급 계산기

앱인토스 미니앱 제작기 일곱 번째는 K패스 환급 계산기입니다. 한 달 대중교통비를 넣으면 환급을 얼마쯤 받을 수 있는지 미리 계산해 보는 앱이에요.

대중교통 환급은 지역, 나이, 타는 교통수단에 따라 기준이 달라서 표만 봐서는 내 금액이 잘 안 나옵니다. 이 앱은 그 표를 대신 읽어 주는 계산기입니다.

로컬에서 앱을 직접 실행해 찍은 시연 영상. 금액과 횟수는 시연용으로 넣은 예시입니다 (소리 없음)

K패스 환급 계산기는 어떤 앱인토스 미니앱인가

K패스 환급 계산기 첫 화면. 월 교통비 100,000원 기준으로 K-패스 정률 30,000원과 모두의카드 초과분 45,000원을 나란히 비교한다
두 기준을 나란히 비교
대상을 일반, 거주 지역을 일반 지방으로 바꾼 화면. K-패스 정률이 20,000원으로 바뀌어 있다
대상과 지역 선택
이번 달 탑승 카운터 화면. 6회가 기록돼 있고 환급 요건까지 9회 남았다고 나온다
탑승 횟수 직접 기록

화면은 하단 탭 기준으로 환급 계산, 탑승 체크, 혜택 도감 세 개입니다. 환급 계산에서 금액과 조건을 넣어 결과를 보고, 탑승 체크에서는 이번 달에 몇 번 탔는지 직접 셉니다. 혜택 도감은 지역별 제도와 기준금액표를 모아 둔 안내 화면이에요.

위 화면의 금액과 횟수는 시연용으로 넣은 예시입니다.

표를 읽지 않아도 되게

이 앱이 비교하는 건 두 가지입니다. 쓴 교통비의 일정 비율을 돌려받는 정률 방식과, 기준금액을 넘긴 만큼 돌려받는 모두의카드 방식이에요.

K-패스 정률

  • 쓴 금액에 환급률을 곱한다
  • 환급률은 대상에 따라 다르다

모두의카드

  • 기준금액을 넘긴 만큼 돌려받는다
  • 기준금액은 지역·대상·유형에 따라 다르다

어느 쪽이 유리한지는 한 달에 얼마를 쓰느냐에 따라 갈립니다. 그래서 첫 화면은 금액 입력 하나에 집중했어요. 5만, 8만, 10만, 15만 버튼을 누르면 두 방식의 금액이 나란히 뜨고, 더 큰 쪽에 표시가 붙습니다. 대상이나 지역을 바꾸면 그 자리에서 다시 계산돼요.

함께 읽기앱인토스 미니앱 6 – 환율 계산기앱인토스 미니앱 환율 계산기 제작기입니다. 15개 통화를 참고 환산하는 앱을 만들면서 환율 기준시각을 화면에 드러낸 이유와, 환율을 받아…

‘모의 계산’이라고 계속 말한다

이 앱은 교통카드 이용 내역을 조회하지 않습니다. 사용자가 넣은 숫자로만 계산해요. 그러니 결과를 실제 지급액처럼 보이게 하면 안 된다고 봤습니다.

결과 카드 제목은 “모의 예상 환급액”이고, 15회를 채우기 전에는 “15회 달성 시 예상 환급액”으로 바뀝니다. 바로 아래 비교 카드에는 실제 환급은 등록 상태와 이용 내역에 따라 달라진다는 문장을 붙였어요. 환급이 언제 들어오는지도 앱에서 날짜를 정해 말하지 않아요. 카드사와 카드 상품에 따라 다르기 때문입니다.

제도 기준은 바뀔 수 있어요

환급률과 기준금액은 앱에 넣어 둔 기준으로 계산합니다. 제도가 바뀌면 달라질 수 있으니 실제 신청 전에는 공식 안내를 확인하는 게 좋습니다.

환급액을 계산하는 코드

계산 함수의 중심부입니다. 위쪽에서 입력값을 정리해 validExpense(월 교통비), validOffPeak(시차시간 이용액), regularExpense(나머지)를 만들어 둔 뒤 이어지는 부분이에요.

kpassEngine.tsts
  // 1. 15회 최소 탑승 요건 판정
  const eligible = rideCount >= 15 || isFirstMonth;
  const neededRides = Math.max(0, 15 - rideCount);

  // 2. 정률 환급액 계산 (시차 인센티브 +30%p 가산, 10원 미만 절사)
  const baseRate = getBaseRefundRate(userType);
  const regularRateRefund = regularExpense * baseRate;
  const offPeakRateRefund = validOffPeak * (baseRate + 0.30);
  const rawRateRefund = regularRateRefund + offPeakRateRefund;
  const rateRefund = Math.floor(rawRateRefund / 10) * 10;

  // 3. 모두의카드 정액 초과 환급액 계산 (10원 미만 절사)
  const threshold = getFlatThreshold(region, userType, transportMode);
  const rawFlatRefund = Math.max(0, validExpense - threshold);
  const flatRefund = Math.floor(rawFlatRefund / 10) * 10;

  // 4. 듀얼 최적화 자동 선택 (둘 중 큰 금액)
  const isFlatBetter = flatRefund > rateRefund;
  const theoreticalMax = Math.max(rateRefund, flatRefund);
  const expectedRefund = theoreticalMax;
  const finalRefund = eligible ? theoreticalMax : 0;

금액을 두 개로 나눠 돌려준다

expectedRefund는 조건을 채웠다고 가정한 금액이고, finalRefund는 15회 요건까지 반영한 금액입니다. 15회를 못 채웠고 가입 첫 달도 아니면 finalRefund는 0이에요. 화면은 이 둘을 구분해서, 요건을 채우기 전에는 “15회 달성 시 예상 환급액”이라는 이름으로 expectedRefund를 보여줍니다. 0원만 덩그러니 보여주면 얼마를 받을 수 있는지 알 수 없으니까요.

환급률을 정하는 함수는 따로 있습니다.

kpassEngine.tsts
export function getBaseRefundRate(userType: UserType): number {
  if (userType === 'lowIncome') return 0.533; // 53.3%
  if (userType === 'threeChildren') return 0.50; // 3자녀 이상 50%
  if (userType === 'youth' || userType === 'twoChildren') return 0.30; // 30%
  if (userType === 'senior') return 0.30; // 2026년부터 어르신 유형 30%
  return 0.20; // 일반 20%
}

계산은 화면 코드와 떼어서 한 파일에 모았습니다. 같은 폴더에 테스트 파일도 같이 두었어요.

함께 읽기앱인토스 미니앱 9 – 이자 계산기앱인토스 미니앱 이자 계산기 제작기입니다. 대출 월 상환액을 계산하고 금리가 1%p 움직일 때 매달 얼마가 달라지는지 보여주는 앱을 만들…

탑승 횟수는 달마다 새로 센다

월 15회 요건은 달 단위입니다. 지난달 기록이 이번 달로 넘어오면 안 되죠. 그래서 횟수를 저장할 때 몇 월 기록인지 같이 적고, 읽을 때 그 달이 맞는지 확인합니다.

App.tsxts
function readRides(): SavedRideCounter {
  const month = getCurrentMonthKey();
  try {
    const raw = localStorage.getItem(RIDES_KEY);
    if (!raw) return { month, count: 0 };
    const parsed: unknown = JSON.parse(raw);
    if (
      typeof parsed === 'object' && parsed !== null &&
      'month' in parsed && parsed.month === month &&
      'count' in parsed && typeof parsed.count === 'number' &&
      Number.isInteger(parsed.count) && parsed.count >= 0
    ) {
      return { month, count: parsed.count };
    }
    // 이전 형식은 월 정보가 없어 다른 달 횟수일 수 있으므로 새 달 기록으로 넘기지 않는다.
    return { month, count: 0 };
  } catch {
    return { month, count: 0 };
  }
}

저장된 달이 이번 달과 같고 횟수가 0 이상의 정수일 때만 그 값을 씁니다. 조건에 하나라도 안 맞으면 0부터 다시 세요. 날짜별 탑승 내역은 저장하지 않고 이번 달 누적 횟수만 남깁니다.

탑승 체크 화면에는 가입 첫 달 체크박스도 있습니다. 체크하면 15회를 못 채워도 요건을 충족한 것으로 계산해요. 위 코드의 isFirstMonth가 그 값입니다.

계산과 기록 중에는 전면 광고가 없다

금액을 넣거나 횟수를 올리는 동안에는 전면 광고가 나오지 않습니다. 전면 광고는 15회를 처음 넘겼을 때 달성 카드를 받겠다고 고르거나, 환급 영수증 카드를 만들 때 안내를 거쳐서만 나올 수 있어요. 영수증 카드는 광고 없이 계속하기를 골라도 만들어집니다.

다음에 할 일

제도 기준이 바뀌는지 지켜보면서 기준금액표를 맞춰 가는 게 이 앱의 가장 중요한 관리 일입니다. 계산기는 숫자가 맞아야 쓸모가 있으니까요.

프로젝트를 어떤 식으로 진행하는지는 프로젝트 진행 방식에, 참고용 숫자를 다루는 또 다른 계산기 이야기는 환율 계산기 글에 있습니다.

K패스 환급 계산기 자주 묻는 질문

K패스 환급 계산기는 어떤 앱인가요?

한 달 대중교통비와 지역, 대상을 넣으면 K-패스 정률 환급과 모두의카드 기준 초과분을 모의로 비교해 주고, 월 15회 탑승 요건을 직접 기록하는 앱입니다.

계산 결과가 실제 환급액인가요?

아닙니다. 입력한 값으로 계산한 모의 금액입니다. 실제 이용 내역을 조회하지 않으며, 지급액은 카드 등록 상태와 월 이용 횟수, 정산에 따라 달라질 수 있습니다.

탑승 횟수는 자동으로 세어지나요?

자동으로 세지 않습니다. 교통카드와 연동하지 않고 버튼을 눌러 직접 기록합니다. 기록은 달이 바뀌면 0부터 다시 셉니다.

이 글은 앱인토스 미니앱 「K패스 환급 계산기」의 기록입니다. 앱인토스는 토스 앱 안에서 미니앱을 서비스하는 플랫폼이고, 공식 안내는 앱인토스 개발자센터에 있습니다.

이 글은 직접 만들고 운영하며 남긴 기록입니다. 적힌 수치는 작성 시점의 제 계정 기준이며, 같은 결과나 수익을 보장하지 않습니다.

Similar Posts

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다