← 포트폴리오 목록

글로벌 시간 단위 예약·해외 결제 플랫폼

본 프로젝트의 요구사항(고객용 예약·결제, 슬롯 홀드와 중복 예약 방지, 파트너 일정 관리, 관리자 현황)을 기반으로 직접 구현한 프로젝트입니다.

프로젝트 납품 요약

아래 프로젝트 개요와 핵심 기능에서 구현 화면을 확인할 수 있습니다.

서비스 타입Web
업종플랫폼
기술 스택
ReactTypeScriptTailwind CSSNode.jsExpressPostgreSQLPrismaAdyenAWS
주요 기능
  • 파트너 검색·시간 슬롯 예약
  • 슬롯 홀드·중복 예약 방지
  • 해외 결제 체크아웃
  • 파트너 일정·관리자 현황

프로젝트 개요

범위: 개발, 디자인, 기획

본 프로젝트의 요구사항(고객용 예약·결제, 슬롯 홀드와 중복 예약 방지, 파트너 일정 관리, 관리자 현황)을 기반으로 직접 구현한 프로젝트입니다. React 화면 3종을 Node.js·Express·PostgreSQL API에 연결하고 Adyen PSP 경유 해외 결제 흐름을 설계합니다.

작업 범위

  • 파트너 검색·시간 슬롯 예약: 고객이 파트너를 검색하고 날짜별 시간 슬롯을 골라 예약 요약까지 한 화면에서 확인합니다
  • 슬롯 홀드·중복 예약 방지: 결제 진입 시 슬롯을 TTL 동안 점유하고 카운트다운을 보여주며 동일 시간대 중복 예약을 차단합니다
  • 해외 결제 체크아웃: 카드·Apple Pay·PayPal·WeChat Pay·Line Pay 결제수단을 선택하고 결제 결과를 확인합니다
  • 파트너 일정·관리자 현황: 파트너가 배정 예약과 일정을 관리하고, 관리자가 전체 예약·결제 현황을 확인합니다

주요 업무

  • 파트너 검색·시간 슬롯 예약 화면: 좌측 파트너 목록과 우측 슬롯 상세를 한 화면에 구성하고 선택 상태를 URL과 동기화합니다
  • 슬롯 홀드·중복 예약 방지 화면: 홀드 행 생성과 확정을 트랜잭션으로 묶고 DB 제약으로 이중 확정을 막습니다
  • 해외 결제 체크아웃 화면: Adyen PSP 경유로 5개 결제수단을 한 체크아웃에 통합하고 결제 상태를 단계별로 표시합니다
  • 파트너 일정·관리자 현황 화면: 역할별 라우트 가드와 같은 API를 공유하는 3개 화면(고객·파트너·관리자)을 연결합니다
글로벌 시간 단위 예약·해외 결제 플랫폼
요구사항 정의

프로젝트 핵심 과제

프로젝트 진행 시 해결한 핵심 기술 과제입니다.

동일 슬롯에 대한 동시 결제 시도에서 홀드 생성과 확정 사이 경합 구간을 트랜잭션 격리 수준으로 제어하는 설계

홀드 TTL 만료와 결제 승인 도착 시점이 겹칠 때 예약 확정 여부를 일관되게 판정하는 규칙 설계

WeChat Pay·Line Pay 가맹 심사는 클라이언트 서류가 필요하므로 PSP 경유 범위와 심사 일정을 착수 초기에 확정하는 계획

기존 React 프로토타입 UI를 유지하면서 API를 연결하기 위한 데이터 계약 선정의 설계

구현 내용

핵심 기능 상세

핵심 기능 1

파트너 검색·시간 슬롯 예약

고객이 파트너를 검색하고 날짜별 시간 슬롯을 골라 예약 요약까지 한 화면에서 확인합니다. 좌측 파트너 목록과 우측 슬롯 상세를 한 화면에 구성하고 선택 상태를 URL과 동기화합니다.

  • 파트너 검색 필터를 URL 쿼리와 동기화하는 Custom Hook 설계
  • React Query로 슬롯 조회 캐싱, 홀드 이후 무효화 구조 적용
  • 예약 요약 패널을 선택 슬롯 상태에서 파생시키는 단방향 데이터 흐름 구성

리스트-상세 3패널 구조에서 슬롯 선택·요약·결제 진입을 끊김 없이 연결하는 예약 흐름을 구현합니다.

파트너 검색·시간 슬롯 예약
파트너 검색·시간 슬롯 예약 실제 화면
핵심 기능 2

슬롯 홀드·중복 예약 방지

결제 진입 시 슬롯을 TTL 동안 점유하고 카운트다운을 보여주며 동일 시간대 중복 예약을 차단합니다. 홀드 행 생성과 확정을 트랜잭션으로 묶고 DB 제약으로 이중 확정을 막습니다.

  • PostgreSQL 배제 제약(EXCLUDE)과 유니크 인덱스로 동일 시간대 이중 확정 차단 설계
  • Prisma 트랜잭션과 SELECT FOR UPDATE로 홀드 생성 구간 직렬화
  • TTL 만료 시 홀드를 해제하는 Cron 스위퍼와 클라이언트 카운트다운 동기화

동일 슬롯에 동시 결제 시도가 들어와도 하나만 확정되도록 DB 제약과 홀드 TTL을 이중으로 적용합니다.

슬롯 홀드·중복 예약 방지
슬롯 홀드·중복 예약 방지 실제 화면
핵심 기능 3

해외 결제 체크아웃

카드·Apple Pay·PayPal·WeChat Pay·Line Pay 결제수단을 선택하고 결제 결과를 확인합니다. Adyen PSP 경유로 5개 결제수단을 한 체크아웃에 통합하고 결제 상태를 단계별로 표시합니다.

  • Adyen 세션 생성 API와 결제수단 목록 동적 렌더링 설계
  • 결제 상태 머신(대기·승인·실패·취소)을 서버에서 단일 관리
  • 결제 결과 화면을 폴링과 웹훅 반영 상태로 갱신하는 구조 구현

결제수단별 분기를 PSP 추상화 계층 뒤로 숨겨 화면 코드가 수단 종류에 의존하지 않도록 설계합니다.

해외 결제 체크아웃
해외 결제 체크아웃 실제 화면
핵심 기능 4

파트너 일정·관리자 현황

파트너가 배정 예약과 일정을 관리하고, 관리자가 전체 예약·결제 현황을 확인합니다. 역할별 라우트 가드와 같은 API를 공유하는 3개 화면(고객·파트너·관리자)을 연결합니다.

  • JWT 역할 클레임 기반 라우트·API 이중 권한 검증 적용
  • 파트너 예약 상태 전이(확정·진행·완료)를 서버 검증 규칙으로 제한
  • 관리자 현황 집계를 SQL 뷰로 구성해 목록 API와 분리

고객·파트너·관리자 화면이 동일 예약 상태 모델을 공유하도록 API 계약을 먼저 정의합니다.

파트너 일정·관리자 현황
파트너 일정·관리자 현황 실제 화면
구현 과정

프로젝트 진행 단계

STEP 1

예약 도메인 모델링 및 제약 설계 · 2026.10

파트너·슬롯·홀드·예약·결제 테이블 정의, 배제 제약과 유니크 인덱스로 중복 확정 방지 구조 설계

STEP 2

슬롯 홀드·Adyen 결제 API 구현 · 2026.10

Express·Prisma 트랜잭션 기반 홀드 생성과 만료 스위퍼, 결제수단 5종 세션 및 서명 검증 웹훅 수신 구조 구현

STEP 3

React 화면 3종 API 연동 · 2026.10

고객·파트너·관리자 화면을 역할별 API에 연결하고 3패널 예약 화면 구성

STEP 4

환경 분리 및 통합 점검 · 2026.10

AWS 개발·스테이징 환경 분리 구성, 예약부터 결제 확정까지 E2E 시나리오 검증

개발 결과

슬롯 홀드 TTL과 배제 제약 이중 방어 설계홀드 행 TTL과 PostgreSQL 배제 제약을 함께 적용해 동일 시간대 이중 확정을 DB 수준에서 차단합니다
PSP 추상화 결제 계층 구축Adyen 세션·결제수단 분기를 어댑터 인터페이스로 분리해 수단 추가 시 화면 수정 없는 구조를 설계합니다
결제 상태 머신 전이 테이블 구현대기·승인·실패·취소 전이를 허용 표로 관리하고 허용되지 않은 전이는 서버에서 거절하도록 구현합니다
역할 공유 예약 API 계약 설계고객·파트너·관리자 3개 화면이 같은 예약 상태 모델과 응답 스키마를 쓰도록 계약을 정의합니다

기술적 주안점

  • 리스트-상세 3패널 구조에서 슬롯 선택·요약·결제 진입을 끊김 없이 연결하는 예약 흐름을 구현합니다
  • 동일 슬롯에 동시 결제 시도가 들어와도 하나만 확정되도록 DB 제약과 홀드 TTL을 이중으로 적용합니다
  • 결제수단별 분기를 PSP 추상화 계층 뒤로 숨겨 화면 코드가 수단 종류에 의존하지 않도록 설계합니다

유사한 프로젝트를 기획하고 계신가요?

필요한 기능과 일정을 알려주시면 개발 범위를 함께 정리하겠습니다.

프로젝트 문의