웹 개발자 Kwak입니다.

프론트·백 구분 없이 사용자가 실제로 쓰는 기능을 만들고, 이 사이트를 직접 설계·운영합니다.

현재
SaaS 솔루션 기업 웹 개발자 (2025.04~)
주력
Next.js · TypeScript · Supabase
이 사이트
구독 결제·B2B 백오피스·실시간 기능을 직접 설계·구현

역량

기술 스택

주력
Next.js (App Router)ReactTypeScriptTailwind CSSSupabase (PostgreSQL·RLS)TanStack QueryZustand
사용 경험
next-safe-action (타입 안전 서버 액션)Zod (입력값 검증)React Hook Form (폼 상태 관리)next-intl (다국어 ko·en·ja)Tiptap (리치 텍스트 에디터)React Flow (노드 다이어그램)Firebase (실시간 채팅)Toss Payments (구독 결제)Google GenAI (Gemini AI 분석)Vitest (단위 테스트)Storybook (컴포넌트 문서화)GitHub Actions (CI/CD·릴리스 자동화)
이전 프로젝트
ReduxEmotionMaterial UISassReact Router

문제 해결 사례

모두 이 사이트에서 직접 확인할 수 있습니다.

구독 권한: 어디서 막을 것인가

UI에서만 막으면 우회되고, 화면마다 '구독 중' 판정이 달라 만료된 구독이 '이용 중'으로 보이는데 접근은 막히는 불일치가 있었습니다.

  • middleware(경로)·서버 액션(중복 결제)·DB RLS(데이터) 세 층에서 검사
  • 판정 함수(isActiveSubscription)와 게이팅 경로 목록을 단일 소스로 공유

화면 표시와 실제 접근 권한이 항상 같은 기준으로 동작합니다.

Next.js middlewareSupabase RLSnext-safe-action

결제·환불: 금액은 서버에서만 계산

  • Toss 빌링·웹훅·환불 API 구현
  • 환불 정책(7일 이내 전액, 이용 50% 초과 환불 없음, 그 사이 잔여 기간 비례)을 순수 함수로 분리하고 단위 테스트

현재 사이트는 데모 결제 모드로, 실제 청구 없이 구독 흐름을 체험할 수 있습니다.

Toss PaymentsVitest

플로우노트: 믿을 수 있는 실행 취소

실행 취소에 선택·패널 같은 UI 상태와 타이핑 한 글자씩이 모두 기록되고, 되돌린 뒤 화면과 데이터가 어긋나는 문제가 있었습니다.

  • zundo 이력 대상을 노드·엣지 데이터로 한정하고 UI 상태는 제외
  • 500ms 안의 연속 입력은 한 단계로 병합, 최대 50단계
  • 되돌린 뒤 React Flow 뷰·저장 여부·선택 노드를 데이터에 맞춰 재동기화
  • 프로젝트 로드 시 이력 초기화, 동작은 단위 테스트로 고정
  • IA·기획서 작성 흐름을 공부하며 노드 상세·태그·내비게이션 트리 등 사용성 보강

되돌리기 후에도 화면과 저장 상태가 항상 일관됩니다.

React FlowZustandzundoVitest

멀티테넌시 B2B 백오피스

  • 회사 단위 테넌트로 데이터 분리
  • 역할 → 권한 레벨(PUBLIC/USER/MANAGER/ADMIN) 매핑으로 메뉴 접근 제어
  • 게스트 접근 제한, 초대·가입 요청에 rate limit
RBACSupabaseRate limit

보안·개인정보 노출 제어

  • 입장 코드 쿠키를 HMAC 서명해 위조 방지
  • 로그인 후 이동 경로 검증으로 오픈 리다이렉트 차단
  • 관리자 판정은 사용자가 수정할 수 없는 app_metadata 기준
  • 잠긴 소개 섹션은 서버에서 렌더링하지 않아 HTML에도 내려가지 않음
HMACWeb CryptoServer Components

실시간 반영

  • 투표 결과는 Supabase Realtime(postgres_changes)으로 실시간 집계
  • 채팅은 Firebase Realtime Database
Supabase RealtimeFirebase

AI 활용

만든 것

  • 투표 결과 AI 분석 — 득표율·댓글을 Gemini에 전달해 2~3문장 인사이트 생성 (서버 액션)
  • 기업 영업 분석 — DART 기업 정보로 업종·외감 가능성·차량 관리 니즈·영업 제안 멘트를 구조화(JSON) 생성

일하는 방식

  • 구현과 반복 작업은 AI 코딩 도구와 함께 진행
  • 결과물은 타입 체크·lint·테스트·실제 브라우저 확인으로 검증
  • DB 마이그레이션·권한/보안·개인정보 노출 판단은 직접 검토하고 결정

경력 및 교육

개인 이력이 포함되어 입장 코드가 필요합니다

자격증

국가기술자격증
웹디자인기능사
한국산업인력공단
PASS 2022.06
국가기술자격증
컴퓨터그래픽스운용기능사
한국산업인력공단
PASS 2009.07
일본어능력시험
(新)JLPT N1
일본국제교류기금
PASS 2018.01
일본어능력시험
JPT 730
YBM
PASS 2018.07
그 외 자격증 (7)
  • ERP회계 정보관리사 2급

    국가공인자격증 · 한국생산성본부(KPC)

    2020.02
  • ERP물류 정보관리사 2급

    국가공인자격증 · 한국생산성본부(KPC)

    2019.12
  • ERP인사 정보관리사 2급

    국가공인자격증 · 한국생산성본부(KPC)

    2019.01
  • 2급 정사서

    국가공인자격증 · 한국도서관협회

    2018.02
  • IEQ인터넷윤리자격 지도사

    국가공인자격증 · 한국생산성본부(KPC)

    2016.12
  • (新)JLPT N2

    일본어능력시험 · 일본국제교류기금

    2016.06
  • 1종보통운전면허

    국가공인자격증 · 경찰청(운전면허시험관리단)

    2010.07
이 사이트에 대해kwak.dev-next를 어떻게 만들었는지 프로젝트 페이지에서 볼 수 있습니다.