Fullstack 72

heo4·2026년 7월 28일

Fullstack

목록 보기
27/70

풀스택

포트폴리오 정리

1. 세금 계산기 검증 — 테스트 데이터로 실제 계산 비교

배경

기능은 대부분 완성됐지만, functions/lib/tax.ts(1인 사업자 부가세/종합소득세 추정 로직)가
배포는 되어 있어도 실거래 데이터로 API 응답을 수기 계산과 대조 검증한 적은 없었음.

방법

  • 로컬 D1(wrangler d1 execute --local)에 전용 테스트 유저(taxtest-user)를 만들고
    사업용카드/개인카드/현금 결제, 경비제외 분류(개인비용), 접대비 거래,
    비정산(unsettled=1)/카드정산기 미확인(예정) 거래를 섞어 1~3월 데이터 삽입
  • wrangler pages dev dist --port=8788로 로컬 풀스택 서버를 띄워 GET /api/tax/estimate?month=...를 실제 호출
    (세션 쿠키는 DB에 직접 넣어 로그인 절차 우회)
  • 같은 데이터로 부가세/종합소득세를 손으로 계산해 API 응답과 대조

삽질 포인트: wrangler pages dev에 --d1=DB=budget-db 플래그를 주면
wrangler.toml의 database_id를 무시하고 별도의 로컬 D1 파일(빈 스키마)이 새로 생성됨.
플래그 없이 wrangler.toml 설정만으로 띄워야 wrangler d1 execute가 쓰는 것과
동일한 D1 파일에 연결됨.

결과 — 전 시나리오 API 응답 = 수기 계산 일치

시나리오부가세 추정종소세 추정세금 적립액실수령 추정
일반과세자 (3월, 누적3개월)350,000891,0001,241,0002,109,000
간이과세자 20% (3월)100,000891,000991,0002,359,000
프리랜서 3.3% (3월)해당없음891,000891,0002,459,000
간이과세자, 부가율 미입력계산불가891,000891,0002,459,000
일반과세자 (1월, 누적1개월)200,000140,250340,2501,209,750
일반과세자 (2월, 누적2개월)280,000453,750733,7501,866,250

검증된 로직:

  • 부가세: 일반 10% / 간이 부가율×10% / 프리랜서 해당없음
  • 종소세: 누진공제 연환산 후 경과월 일할계산
  • 필요경비 opt-out 분류 제외
  • 부가세 매입세액공제 조건(사업용카드 + 접대비 아님)
  • 비정산·카드정산기 미확인 거래 집계 제외

에러 케이스도 확인:

  • 세율 미등록 연도(2025) → 400 "2025년 세율 정보가 아직 등록되지 않았습니다"
  • 잘못된 month 포맷 → 400 "월 형식이 올바르지 않습니다"

코드 변경 없이 검증만 진행 — 테스트 데이터/세션은 검증 후 전부 삭제, dev 서버 프로세스 종료.


2. 인앱 알림함 추가 — 카드 정산/세금 리포트 푸시 열람

배경

세금 계산기 검증 작업 중 카드 정산 알림을 실제로 확인하다가 "푸시를 놓치면 다시 볼 방법이
전혀 없다"는 문제를 발견. 당시 notification_log엔 발송 여부만 기록되고 실제 알림 문구는
저장되지 않고 있었음.

계획

  • notification_log에 title/body/url/read_at 컬럼 추가 (마이그레이션 031)
  • 카드 정산 알림/월간 세금 리포트, 두 워커가 발송 시 실제 문구를 함께 저장하도록 수정
  • GET /api/notifications(목록 + 안읽음 개수), PATCH /api/notifications/read(전체 읽음) API 추가
  • 헤더에 종 아이콘(NotificationBell) 배치 — 뱃지 표시, 클릭 시 목록 열람 + 자동 읽음 처리 + 딥링크 이동

완료

  • migrations/031_notification_log_content.sql + schema.sql 반영
  • workers/card-settlement-notifier, workers/monthly-tax-reporter의 logNotified가
    제목/본문/url도 저장하도록 수정 후 양쪽 워커 재배포
  • functions/api/notifications/index.ts(GET), functions/api/notifications/read.ts(PATCH) 신규 추가
  • src/components/NotificationBell.tsx 신규 컴포넌트, App.tsx 헤더에 다크모드 토글 옆에 배치
  • 로컬 D1에 테스트 유저 + 알림 2건(카드 정산 1건, 세금 리포트 1건)을 넣어
    GET(안읽음 2건) → PATCH → GET(안읽음 0건, read_at 채워짐) 순으로 API 동작 확인 후 테스트 데이터 정리
  • npm run build(tsc+vite), npm run lint(oxlint), 양쪽 워커 npm run typecheck 통과
  • 원격 D1에 마이그레이션 031 적용, 양쪽 워커 원격 배포 완료

미완료 / 다음 참고

  • "검색에서 금액 입력 검색"은 이미 구현돼 있던 기능이라 확인만 하고 넘어감
    (SearchView.tsx 필터 패널의 금액 범위)
  • 알림 항목별 읽음 처리는 없음 — 패널을 열면 전체를 한 번에 읽음 처리하는 방식으로 단순화함
    (요구사항상 문제없어 보이나, 추후 필요하면 항목별 읽음으로 확장 가능)

0개의 댓글