← 포트폴리오로 돌아가기
다운로드
길현준
Node.js Developer
콘서트 예약 서비스 2024.10 — 2024.11 · 개인
1만 동시 요청 · K6 3,000 TPS · Kafka 3-broker · Prometheus+Grafana

1만 동시 요청 환경에서 좌석 선점·결제·포인트 충전의 동시성 문제를 시나리오별 하이브리드 락 전략으로 해결한 콘서트 좌석 예약 서비스 — 낙관적 락 + Redisson 분산 락, Redis 캐싱 TPS 15배 향상, Kafka 이벤트 드리븐 아키텍처, K6 부하 테스트 기반 병목 개선

JavaSpring BootJPARedisMySQLKafkaDockerK6
콘서트 예약 서비스 architecture
성과 지표 이전 이후
좌석 예약 응답시간 1,678ms 835ms (-50%)
좌석 조회 TPS 100 1,500 (15x)
DB 쿼리 비율 100% 6% (-94%)

문제 해결 과정

1만 동시 요청 환경에서 좌석 선점 시 동일 좌석 이중 배정 위험
비관적/낙관적/분산 락 3종을 K6로 비교 검증 후, 단일 좌석 경합에 최적인 @Version 낙관적 락 선택
→ 좌석 예약 응답시간 50% 개선 (1,678ms → 835ms), 이중 배정 0건
포인트 충전과 결제의 동시 실행 시 잔액 정합성 붕괴
재시도 기반 낙관적 락의 무한 루프 위험을 분석하고, Redisson 분산 락(userWalletLock:{userId})으로 사용자 단위 직렬화
→ 동시 충전/결제 시나리오에서 잔액 정합성 100% 보장
콘서트/좌석 조회 TPS가 100에 불과하여 예약 오픈 시 DB 병목
Redis 캐시 레이어 적용 + DB 인덱스 최적화를 병행하여 계층적 캐싱 전략 구현
→ TPS 100 → 1,500 (15배 향상), DB 쿼리 94% 감소
예약 완료 후 결제/알림 처리가 동기 호출로 묶여 도메인 간 강결합
Kafka Transactional Outbox 패턴으로 예약 TX 내 outbox_event 삽입 후 스케줄러가 비동기 발행
→ 도메인 간 결합도 제거, 메시지 유실 방지, 독립 확장 가능

기술 선택 근거

주요 내용

깨달은 점


Ledgerly 2025.08 — 진행 중 · 개인
가족/조직 단위 멀티테넌시 · 3단계 RBAC · FE+BE 분리 배포

가족·조직 단위 공유 가계부 앱 — Next.js 16 풀스택, Supabase PostgreSQL, 3단계 역할 기반 접근 제어(OWNER/ADMIN/MEMBER), NestJS Cron 정기거래 자동 처리, 99.45% 라인 커버리지 단위 테스트 + 300건 이상 E2E 통합 테스트

Next.jsReactTypeScriptSupabasePostgreSQLPrismaNestJSTailwind CSSTanStack QueryZodVitestPlaywrightDockerVercel
Ledgerly architecture
성과 지표 이전 이후
Vitest 단위 테스트 - 397건 (BE 25 + FE 31 suites) (99.45% 커버리지)
Playwright E2E - 300건+ (24 specs · 5 projects) (역할별 시나리오)

문제 해결 과정

가족/조직 내 역할별 권한 분리 없이 공유 가계부 운영 시 데이터 보안 위험
OWNER/ADMIN/MEMBER 3단계 RBAC 설계, SupabaseAuthGuard → MembershipGuard → SuperAdminGuard 3단계 Guard 체인으로 인증+인가 이중화
→ 조직별 독립 데이터 관리 + 역할별 세분화된 접근 제어 실현
Vercel Hobby 플랜 Cron 제한(1일 1회)으로 정기거래 자동 처리 불가
NestJS 기반 별도 백엔드를 Mac mini에서 Docker로 분리 운영, @nestjs/schedule로 매일 15:00 KST 실행
→ 정기거래 매일 자동 처리 실현, 플랫폼 제한 우회
SSR 환경에서 서버/클라이언트 컴포넌트 간 인증 상태 불일치
Next.js 16 App Router + Supabase Auth SSR 조합으로 쿠키 기반 세션 복원 + 인증 컨텍스트 전파 패턴 설계
→ 서버/클라이언트 컴포넌트 간 원활한 인증 상태 동기화
복잡한 RBAC + 비동기 로직의 높은 결함 위험을 수동 테스트로 커버 불가
Vitest 단위 테스트 + Playwright E2E를 역할별(Admin/Member) 시나리오로 구성, 실제 BE + 로컬 Supabase 연동 풀스택 통합 테스트 환경 구축
→ 라인 커버리지 99.45%, 역할별 시나리오 자동 검증 체계 구축

기술 선택 근거

주요 내용

깨달은 점


대신물류 배차현황 챗봇 2026.01 — 진행 중 · 개인
월~토 06:00~20:00 매시 크롤링 · Blue-Green 무중단 배포 · SQLite 단일 서버

대신물류 배차현황 데이터를 Cheerio로 크롤링하고 카카오톡 챗봇 스킬서버와 Next.js 모바일웹으로 조회할 수 있는 서비스 — Clean Architecture + TSyringe DI, Express 5, Prisma SQLite, Traefik Blue-Green 무중단 배포

TypeScriptExpressNext.jsReactPrismaSQLiteCheerioTSyringeTanStack QueryRechartsDockerTraefikTailwind CSSVitest
대신물류 배차현황 챗봇 architecture
성과 지표 이전 이후
크롤링 주기 수동 조회 일 15회 자동 (자동화)
배포 다운타임 수동 재시작 0초 (Blue-Green)

문제 해결 과정

물류 회사 배차현황을 웹사이트에서 수동 확인해야 하는 운영 비효율
Cheerio + Axios로 EUC-KR 인코딩 배차 데이터 크롤링, node-cron으로 월~토 06:00~20:00 매시 자동 동기화
→ 수동 조회 → 일 15회 자동 크롤링, 실시간 데이터 제공
현장 직원이 PC 없이 모바일로 배차 정보를 조회할 수단 부재
카카오 i 오픈빌더 스킬서버 프로토콜 직접 구현 + Next.js 반응형 모바일 웹 + Recharts 통계 대시보드 병행 제공
→ 카카오톡 챗봇 + 모바일 웹 이중 채널로 현장 즉시 조회 가능
크롤러/카카오 API/DB 등 외부 의존성 변경 시 비즈니스 로직까지 수정 필요
Clean Architecture로 도메인/애플리케이션/인프라 계층 분리, TSyringe DI 토큰으로 인터페이스 바인딩, Value Object 패턴으로 도메인 규칙 타입 수준 강제
→ 외부 의존성 교체 시 인프라 계층만 수정, 비즈니스 로직 무변경
수동 재시작 방식의 배포로 서비스 다운타임 발생
Traefik 파일 프로바이더 기반 Blue-Green 배포 설계, deploy.sh로 빌드 → 헬스체크 → YAML 재작성 → 트래픽 전환 자동화
→ 배포 다운타임 0초 달성, Docker 소켓 노출 없이 보안성 확보

기술 선택 근거

주요 내용

깨달은 점

기타 프로젝트
냠냠위듀 — 구내식당 식단 알림 봇 (개인) — TypeScript, Playwright, Slack Bot API, Express 상세 ↗
병원 채용공고 알림 프로젝트 (개인) — NestJS, TypeScript, PostgreSQL, TypeORM 상세 ↗
스타트업풀 (팀) — NestJS, TypeScript, PostgreSQL, JavaScript 상세 ↗