타이어 O2O 장착 예약 플랫폼
추천
온라인에서 타이어를 산 소비자가 내 주변 장착점을 찾아 장착 시간을 예약·결제하고, 장착점·온라인 타이어 셀러·플랫폼 운영자가 같은 예약 데이터로 일하는 모바일 웹 기반 O2O 장착 예약 플랫폼을 구축·납품했습니다.
프로젝트 개요
온라인에서 타이어를 산 소비자가 주변 장착점을 찾아 장착 시간을 예약·결제하고, 장착점·온라인 셀러·플랫폼 운영자가 같은 예약 데이터로 일하는 모바일 웹 O2O 장착 예약 플랫폼을 구축·납품했습니다. 소비자 웹과 장착점·셀러·운영자 콘솔 4개 레이어가 하나의 백엔드와 데이터베이스를 공유하고, 한 건의 예약이 네 레이어를 모두 거치기 때문에 화면보다 데이터 구조와 권한, 예약 상태 규칙을 먼저 정한 뒤 화면을 얹었습니다. 네이티브 앱 없이 모바일 브라우저만으로 동작합니다. 기획·설계부터 결제 연동, AWS 운영 배포, 매뉴얼 납품까지 수행했고 현재 유지보수를 맡고 있습니다.
작업 범위
- 소비자 웹: 카카오 로그인, 지도 기반 장착점 검색, 국산·수입과 인치별 표준 공임표, 차량·일정·결제 3단계 예약, 내 예약 일정 변경·취소
- 장착점 콘솔: 새 예약이 바로 뜨는 실시간 예약 캘린더, 입고·작업·완료 상태 처리, 영업시간·휴무일·정원 설정, 월 공임 정산 내역 조회
- 셀러·운영자 콘솔: 상품 페이지용 예약 링크와 유입·예약 통계, 월 구독료 카드 자동결제, 장착점·셀러 승인·정지와 공임표·월 정산 관리
- 인프라·운영: AWS 서울 리전 운영 환경 구성, 정기 결제·결제 대조·예약 시간 생성 등 7종 자동 작업, 관리자·사용자 매뉴얼과 검수 시나리오 납품
주요 업무
- 초과 예약 방지: 결제가 승인되는 순간에만 예약 시간을 확정해, 여러 명이 같은 시간을 동시에 결제해도 한 건만 잡히고 나머지는 다른 시간을 고르도록 설계
- 결제 정합성: 결제 누락이나 환불 누락을 매일 새벽 결제사 기록과 자동으로 대조·보정하고, 취소 시점과 사유에 따라 부분·전액 환불 정책을 그대로 적용
- 데이터 분리: 장착점과 셀러가 서로의 예약·정산·고객 정보를 볼 수 없도록, 화면에서 숨기는 방식이 아니라 서버에서 권한과 조회 범위를 강제
- 품질 검증: 1,800건 이상의 자동 테스트로 동시 예약, 중복 결제 방지, 권한 분리, 결제 재시도를 확인하고, 결제·카카오 연동은 시험 환경에서 개발한 뒤 운영 키로 교체해 전환









프로젝트 핵심 과제
결제 시점 슬롯 확정
결제 승인과 슬롯 확정을 한 트랜잭션으로 묶고 행 잠금과 UNIQUE 제약으로 이중 방어해, 같은 시간 동시 결제에도 한 건만 확정되게 했습니다
결제 정합성 자동 보정
웹훅은 토스 재조회로만 판정하고, 매일 결제·취소 대사 배치가 저장 실패나 환불 누락을 회수해 사람이 장부를 맞추지 않아도 되게 했습니다
정기결제 안전장치
셀러·월 멱등키, 최대 3회 재시도 후 구독 차단, 대사 → 과금 배치 순서, 과금일 26일 상한으로 중복 과금과 잘못된 차단을 막았습니다
서버 강제 데이터 분리
기본 거부 권한표와 서버측 테넌트 범위 주입으로 장착점·셀러가 서로의 예약·정산·고객 정보에 닿지 못하게 했습니다
실시간 팬아웃
API와 WebSocket 프로세스를 분리한 구조에서 Redis Pub/Sub으로 모든 예약 이벤트가 장착점 캘린더에 즉시 도달하게 했습니다
온라인 타이어 구매 후 장착점을 따로 수소문하던 과정
지도 검색과 투명한 표준 공임표, 1분 안팎의 예약·결제로 바꾸는 것을 목표로 했습니다
핵심 기능 상세
내 주변 장착점 지도 검색과 표준 공임표
지도에서 내 위치 기준 가까운 장착점을 거리순으로 찾고, 국산·수입과 인치별 장착 공임·얼라인먼트·추가 시공비를 표준 공임표로 공개합니다.
- 카카오 지도 SDK + 브라우저 위치 권한, 권한 거부 시 기준 지역 폴백
- 거리 계산은 하버사인으로 프론트에서, 서버는 PostGIS 확장으로 반경 질의 전환 자리를 확보
- 공임표는 운영자가 콘솔에서 고치면 소비자 화면·예약 금액·장착점 정산가에 동시에 반영
- 등록한 내 차량의 인치를 공임표에 강조 표시해 예상 금액을 바로 확인
소비자 결제가와 장착점 정산가를 한 공임 항목에 함께 두고 변경 이력을 남겨, 가격 변경이 이미 결제된 예약과 지난 정산에 소급되지 않게 했습니다.


3단계 장착 예약·선결제 — 결제 시점 슬롯 확정으로 초과 예약 차단
차량·일정·결제 3단계로 예약하고, 슬롯은 결제 승인 순간 행 잠금으로 확정해 같은 시간 동시 결제에도 한 건만 잡힙니다.
- 결제 승인과 슬롯 확정을 한 트랜잭션으로 묶고 SELECT … FOR UPDATE 행 잠금 + UNIQUE 제약으로 이중 방어
- 결제 웹훅은 페이로드를 믿지 않고 토스 재조회로만 승인·금액을 판정
- 매일 새벽 결제·취소 대사 배치로 '승인됐는데 저장 실패' 잔여 건을 자동 회수
- 미결제 주문은 30분 TTL로 만료, 회원 취소 80%·장착점 취소 100%·노쇼 무환불 정책을 부분취소로 처리
결제와 예약이 한 번의 커밋으로만 함께 성공하도록 설계해 '결제됐는데 예약 없음 / 예약됐는데 결제 실패'가 생기지 않게 하고, PostgreSQL 동시 요청 테스트로 초과 예약 0건을 검증했습니다.


장착점 실시간 예약 캘린더와 작업 상태 처리
새 예약이 새로고침 없이 캘린더에 들어오고, 사장님은 예약 상세에서 입고·작업 개시·완료를 처리하며 영업시간과 정원을 설정합니다.
- API → Redis Pub/Sub → WebSocket 서버 → 브라우저로 이어지는 실시간 전달 구조
- 예약 상태 전이는 서비스 한 곳에서만 판정하는 상태머신으로 고정, 전이 시점에 알림톡 발송
- '오늘 온라인 예약 마감' 토글과 결제 진행 중 건을 락으로 직렬화
- 요일별 영업시간·휴무일·리프트 수로 예약 슬롯을 매일 새벽 자동 생성
예약을 처리하는 API 프로세스와 WebSocket 연결을 가진 프로세스를 분리한 상태에서, Redis Pub/Sub 팬아웃으로 결제 확정·웹훅 복구·취소까지 모든 경로의 이벤트가 캘린더에 도달하게 했습니다.


온라인 셀러 예약 링크와 월 구독 자동결제
셀러는 상품 페이지용 예약 링크를 발급받아 유입·예약 성과를 보고, 월 구독료는 등록 카드로 자동결제되며 실패가 반복되면 차단됩니다.
- 토스 빌링키 발급·청구 어댑터, 빌링키는 AES-256-GCM으로 암호화 저장(카드 정보 미보관)
- 셀러·월 단위 멱등키로 같은 달 중복 과금을 DB가 차단, 실패 시 최대 3회 재시도 후 구독 차단
- 월 배치보다 먼저 도는 대사 배치로 '돈은 나갔는데 실패로 기록된' 셀러가 차단되지 않게 보정
- 셀러별 링크 유입을 예약·장착 완료까지 추적해 셀러 본인 통계로 제공
과금일 상한(26일)과 배치 순서(대사 23:30 → 과금 00:00)까지 설계해, 2월 같은 짧은 달에도 재시도가 같은 달 안에 끝나고 정상 결제한 셀러가 잘못 차단되지 않게 했습니다.


운영자 통합 콘솔 — 공임 정산·공임표·가맹점·셀러 관리
운영자는 월 공임 정산을 마감·차감·지급까지 처리하고, 공임표와 구매처, 장착점·셀러 승인·정지와 계정 발급을 관리합니다.
- 정산서는 월 마감 → 차감 입력 → 지급 완료로만 전이, 마감 후 늦은 입력은 확정액에 반영하지 않음
- 역할·리소스·액션 권한표(기본 거부)와 서버측 테넌트 범위 주입으로 장착점·셀러 간 데이터 분리
- 매장 정보·공임 변경 이력을 남기고 계정 끄기·임시 비밀번호 재발급 지원
- 장착점 상태 승인 대기 → 운영 중 ⇄ 정지, 정지 시 장착점 콘솔 접근 차단
권한 판정을 코드의 권한표 한 곳에 모으고 장착점·셀러 범위를 서버가 쿼리에 직접 주입하게 해, 화면이나 요청 값으로는 다른 매장·셀러의 데이터에 닿을 수 없게 했습니다.


프로젝트 진행 단계
착수·설계 — 데이터 구조·권한·예약 규칙 · 2026.06
4개 레이어가 함께 쓰는 데이터 모델과 권한표, 예약 상태가 바뀌는 규칙을 먼저 정하고 결제 정보 암호화 기반을 구축합니다.
소비자 예약 흐름과 결제 · 2026.07
카카오 로그인, 지도 검색, 차량·일정·결제 3단계 예약과 결제 승인 시점에 예약 시간을 확정하는 구조를 구현합니다.
장착점·셀러·운영자 콘솔과 정산 · 2026.08
실시간 예약 캘린더, 셀러 예약 링크와 월 구독 자동결제, 운영자 승인·공임표·월 정산, 결제 대조 배치를 완성합니다.
AWS 운영 배포·검수·납품 · 2026.10
AWS 서울 리전 운영 환경을 구성하고 QA, 관리자·사용자 매뉴얼, 검수 시나리오를 거쳐 납품한 뒤 유지보수를 이어갑니다.
개발 결과
기술적 주안점
- 척추 우선 설계 — 4개 레이어가 공유하는 도메인·ERD·권한·상태 전이를 먼저 고정해 화면이 늘어도 규칙이 흔들리지 않게 했습니다
- 돈과 동시성은 테스트로 증명 — 초과 예약, 중복 과금, 결제 누락을 코드 리뷰가 아닌 자동 테스트와 대사 배치로 막았습니다
- 데이터 분리는 서버가 강제 — 화면 숨김이 아니라 서버측 범위 주입과 기본 거부 권한표로 장착점·셀러 간 누출을 차단했습니다
- 외부 연동 격리 — 결제·카카오 연동을 어댑터로 감싸 승인 대기 중에도 개발을 진행하고 키만 교체해 운영으로 전환했습니다
- 규모에 맞는 단순함 — 단일 PostgreSQL 행 잠금으로 충분한 규모에는 분산 락을 들이지 않고 운영 비용과 복잡도를 줄였습니다
다양한 도메인 응용
- 정비·세차·차량 관리, 미용·병원·스튜디오처럼 매장 정원과 시간 슬롯이 있는 예약 플랫폼
- 온라인 판매자와 오프라인 시공·설치 매장을 잇는 O2O 중개 서비스(가전 설치, 인테리어 시공, 가구 조립 등)
- 정기 구독료를 카드 자동결제로 받는 B2B SaaS와 구독 상태 기반 서비스 차단
- 다수 가맹점이 한 플랫폼을 쓰는 멀티 테넌트 운영 콘솔과 월 정산·지급 관리
- 결제와 재고(좌석·객실·시간) 확정을 한 트랜잭션으로 묶어야 하는 선착순 예약·판매 시스템