멀티테넌트 SaaS 골프장 ERP
Frontend
Engineering Portfolio
골프장 운영 SaaS의 관리자용 ERP(erp-web)를 중심으로 멀티테넌트 아키텍처·예약/티슬롯 도메인·3-Layer 디자인 시스템을 구현했습니다. 고객용 golf-web과 golf-mobile(WebView 셸)의 핵심 플로우 일부에도 직접 참여했습니다.
Period
2026.02 — 2026.03
Stack
Next.js 15 · React 19 · TS
Role
Frontend Engineer · erp-web 중심
Monorepo
10 Apps · 9 Libs
3
담당 앱
erp-web · golf-web · golf-mobile
10
구현 도메인
예약·티슬롯·매출·마감 등 erp-web 전 도메인
3-Layer
디자인 시스템
Primitives → Composites → Features
100%
End-to-End 타입 안전
Zod 단일 소스 (FE↔BE 계약)
10앱·9libs
모노레포 규모
Turborepo + pnpm Workspaces
5종
검증 게이트
lint · build · a11y · 단위 · E2E
모노레포 FE 중심 구조
Frontend Apps · Shared Contracts · Monorepo 오케스트레이션을 중심으로, 실시간·백엔드는 FE 관점 컨텍스트로 표기했습니다.
Frontend Apps
관리자·직원·고객 3개 사용자 군을 별도 앱으로 분리해 도메인별 UX를 최적화. App Router 서버 컴포넌트로 초기 로딩을, 공유 라이브러리로 비즈니스 로직 재사용을 확보했습니다.
Shared Libraries (FE↔BE 계약)
Zod 스키마를 단일 소스로 두고 프론트·백 양쪽에서 import — 런타임 검증과 컴파일 타임 타입을 한 곳에서 관리해 계약 불일치를 원천 차단했습니다.
Monorepo Orchestration
10개 앱·9개 라이브러리의 빌드·린트·테스트를 캐시 + 병렬로 오케스트레이션. 변경 패키지만 빌드해 CI 시간을 단축했습니다.
Realtime · Device Bridge
Context현장 키오스크·프린터·카드리더를 Electron 브릿지가 추상화하고, Socket.io로 ERP와 양방향 통신. 네트워크 불안정 시 큐 버퍼링·자동 재연결로 주문 누락을 방지했습니다.
Backend (참고)
Context동일 모노레포에서 운영되어 shared-types·api-contracts를 통해 FE와 계약을 공유합니다. (구현 범위 외 — FE 관점 컨텍스트로 표시)
shared-types · client-api로 프론트-백 계약을 한 곳에서 관리.기술 스택 & 선택 이유
각 기술을 왜 선택했고, 어떤 문제를 해결했는지 중심으로 정리.
Next.js
v15.5App Router 서버 컴포넌트로 ERP 초기 렌더링 비용을 줄이고, Turbopack으로 대규모 모노레포 개발 서버 속도를 확보.
React
v19.2Suspense + Concurrent 렌더링으로 대시보드의 비동기 로딩 UX를 개선. 트랜지션으로 테넌트 전환 시 화면 깜빡임 제거.
TypeScript
v5.xFE·BE·라이브러리 전 구간 End-to-End 타입 안전성. shared-types Zod로 런타임 검증까지 단일 소스로 관리.
Core
Next.js
v15.5App Router 서버 컴포넌트로 ERP 초기 렌더링 비용을 줄이고, Turbopack으로 대규모 모노레포 개발 서버 속도를 확보.
React
v19.2Suspense + Concurrent 렌더링으로 대시보드의 비동기 로딩 UX를 개선. 트랜지션으로 테넌트 전환 시 화면 깜빡임 제거.
TypeScript
v5.xFE·BE·라이브러리 전 구간 End-to-End 타입 안전성. shared-types Zod로 런타임 검증까지 단일 소스로 관리.
State & Data
Zustand
v5.0사용자·소켓·테넌트 등 전역 상태를 보일러플레이트 없이. Redux 대비 번들·학습 비용을 줄이고 selector로 리렌더 격리.
TanStack Query
v5.75queryKey에 tenantId를 포함해 테넌트별 캐시 격리. 낙관적 업데이트·자동 무효화로 예약 상태 일관성을 확보.
React Hook Form
v7.5620+ 필드 예약 폼의 렌더 비용을 최소화. Zod 스키마와 직접 연동해 클라이언트·서버 검증을 일원화.
UI & Design System
Tailwind CSS
v4.x유틸리티 퍼스트로 디자인 시스템 일관성 유지. tailwind-variants와 결합해 컴포넌트별 variant를 선언적으로 관리.
Radix / Headless UI
스타일 없는 접근성(a11y) 프리미티브 위에 디자인 시스템을 얹어 키보드·스크린리더 지원을 기본 확보.
Lucide React
트리쉐이킹 가능한 SVG 아이콘 셋으로 번들 사이즈 최소화하면서 ERP 전체 아이콘 톤을 통일.
Editor & Media
Tiptap
v3.19공지·FAQ·콘텐츠 관리용 WYSIWYG. 테이블·이미지 리사이즈 등 13개 확장을 조합해 운영자 편집 UX 구성.
DnD Kit
v6.3메뉴 순서 변경·위젯 배치에 접근성을 갖춘 DnD 적용. 키보드 조작과 스크린리더 안내까지 함께 지원.
QRCode.react
키오스크 체크인 시 모바일 연동 QR을 클라이언트에서 동적 생성 — 서버 라운드트립 없이 즉시 발급.
Network & Realtime
Axios
v1.9client-api 래퍼에 인터셉터로 인증 토큰 자동 주입·갱신, 에러 정규화, 401 시 강제 로그아웃 흐름까지 일원화.
Socket.io
v4.8키오스크 ↔ ERP 실시간 채널. 네트워크 불안정 시 자동 재연결 + 이벤트 버퍼링으로 주문 누락 0건 유지.
Zod
API 응답·폼 입력의 런타임 검증을 TypeScript 타입과 단일 소스로. shared-types에서 정의해 양쪽이 import.
DevOps & Quality
Turborepo
10개 앱의 빌드·테스트·린트를 캐싱·병렬로 오케스트레이션. 변경 패키지만 빌드해 CI 시간 대폭 단축.
Storybook
v10.23-Layer 컴포넌트의 시각적 문서화 + 접근성(a11y) 자동 테스트. 디자인 리뷰와 회귀 검증을 한 곳에서.
Vitest + Playwright
Vitest로 훅·유틸 단위 테스트, Playwright로 예약 플로우 핵심 시나리오 E2E를 CI에 통합.
18개 핵심 라이브러리 · 6개 카테고리
기술 의사결정 Deep Dive
구현 중 마주친 문제와 그에 따른 트레이드오프·해결을 정리했습니다.
모노레포 구조와 담당 범위
10개 앱 · 9개 공유 라이브러리. 본인 담당·기여 범위를 명확히 표시.
담당 / 기여 (3 Apps)
erp-webFrontend메인 ERP 프론트 (예약·매출·운영)
Next.js 15 · React 19
golf-mobileMobile고객용 모바일 WebView 셸
Expo 53 · React Native 0.79
golf-webFrontend고객용 예약·코스안내 웹
Next.js · React 19
팀 내 다른 앱 (참고)
erp-admin-webFrontend관리자 대시보드
erp-lite-webFrontend경량 ERP (대시보드·예약)
score-mobileMobile스코어 기록 모바일
erp-kiosk-desktopDesktop현장 키오스크 (체크인·결제)
device-bridge-desktopDesktop하드웨어 브릿지 (프린터·카드리더)
erp-apiBackend메인 API 서버
erp-gateway-apiBackend게이트웨이 (인증·라우팅)
공유 라이브러리 (9 Libs)
shared-types공용 타입 + Zod 스키마
client-api타입 안전 HTTP 래퍼
api-contractsAPI 계약 정의
shared-utilsFE·BE 공용 유틸
shared-eslint공유 ESLint 설정
server-core서버 공통 미들웨어·에러
server-kyselyKysely DB 클라이언트
server-redisRedis 캐시·세션
server-utils서버 유틸 함수
품질 보장 프로세스
스펙 합의 → 구현 → 자동 검증 → 리뷰 가능한 PR. 변경의 근거와 트레이드오프를 기록 가능한 형태로 남깁니다.
Spec-First Development
기능별 스펙 문서로 요구사항·엣지케이스·검증 기준을 사전 합의 후 구현 진입
Contract-Driven FE/BE
shared-types Zod 스키마를 단일 소스로 두고 양쪽이 import — 계약 불일치 차단
Verification Gate
PR마다 format · lint · build · Storybook a11y · 핵심 시나리오 E2E 자동 검증
Reviewable PR Template
배경/목표/구현 요약/검증 결과/리스크/연관 스펙 6개 섹션으로 리뷰 비용 최소화
표준 워크플로우
스펙 작성
요구사항·엣지케이스·검증 기준을 specs/ 문서로 합의
계획 수립
단계별 작업 리스트로 범위·순서·의존성 결정
컨텍스트 정리
도메인 README로 기존 결정·용어·연관 모듈 파악
구현
레이어드 아키텍처에 따라 순차 구현 (Primitives → Features)
검증
format · lint · build · 시나리오 테스트 통과 확인
PR 정리
6개 섹션 PR 본문으로 구현 근거와 트레이드오프 기록
리뷰 가능한 PR 템플릿
자동 검증 게이트
PR마다 자동 통과해야 머지 가능 — 회귀를 사람 검토 이전 단계에서 차단합니다.
담당 범위 한눈에 보기
2026.02 — 2026.03 · Frontend Engineer · erp-web 중심
erp-web메인 ERP 프론트 · Owned
Next.js 15 · React 19
예약·티슬롯·매출·마감 등 10개 도메인. 멀티테넌트 아키텍처와 3-Layer 디자인 시스템 직접 설계·구현.
golf-mobileWebView 네이티브 셸 · Owned
Expo 53 · React Native 0.79
@webview-bridge 타입 안전 브릿지, 딥링크, 오프라인 자동 복구, Android 백버튼 정책.
golf-web고객용 예약 웹 · Contributed
Next.js · React 19
예약 멀티스텝 플로우 일부 구간, 골프룸 커머스 페이지, 마이페이지 자기 서비스 기능 참여.
핵심 역량
Monorepo 운영 경험
10앱·9libs Turborepo 환경에서 빌드 캐시·의존 그래프·공유 계약을 활용한 협업 경험
End-to-End 타입 안전
Zod 스키마를 단일 소스로 FE·BE 양쪽에서 import — 런타임 검증과 컴파일 타임 타입 일원화
확장 가능한 FE 아키텍처
App Router 서버 컴포넌트, 멀티테넌시, 가상 스크롤, WebView 브릿지 등 도메인 난이도 높은 구현