바른오더 — 이사청소 매칭 플랫폼
이사청소 견적 요청·비교, 업체 매칭, 실시간 채팅, 구독 요금제, 관리자 기능을 갖춘 웹 서비스
- 기간
- 2026.01 – 2026.03
- 역할
- 1인 개발 · AI 코딩 에이전트 협업
- 상태
- 서버 중지 · barun-order.com
- 스택
핵심 수치
2026-09-29 기준
- 업체 고객 관리 조회의 쿼리 수 (고객 N명)4N+3 → 7
- OAuth 콜백의 토큰 URL 노출 수정임시 코드 교환 방식
- Redis 캐시 확장 (2026-02-11 커밋)8개 서비스
문제
이사청소를 맡기려는 소비자와 견적을 내려는 업체를 견적 요청·제출·비교·수락의 흐름으로 잇는 것이 목표였습니다. 사이트는 스스로를 이렇게 소개합니다. “검증된 이사청소 업체를 빠르고 간편하게 매칭해드립니다.”
접근
- 견적 요청 → 업체 견적 제출 → 비교 → 수락으로 이어지는 흐름을 NestJS 모듈과 Prisma 모델로 만들었습니다. 견적을 수락하면 한 트랜잭션에서 나머지 제출 견적을 거절하고, 매칭과 채팅방을 만듭니다.
- 웹은 Next.js로 만들었고, 인증은 httpOnly 쿠키를 우선하되 Authorization 헤더도 받습니다. 알림은 WebSocket으로 실시간 전달하고, FCM 푸시도 보낼 수 있게 했습니다.
- 실시간 채팅은 Socket.IO로, 자주 읽는 데이터는 Redis 캐시로 처리했습니다.
- 카카오·네이버·구글 소셜 로그인, 구독 요금제, 업체용 고객 관리, 관리자 화면까지 구현했습니다.
결과
- 업체용 고객 관리 조회(목록·파이프라인·통계가 함께 쓰는 고객 행 구성)의 쿼리 수를 고객 N명일 때 4N+3개에서 7개로 줄였습니다. 고객마다 4번씩 하던 조회를 한꺼번에 묶어 읽습니다(2026-02-20).
- OAuth 콜백에서 토큰이 URL로 노출되던 문제를 임시 코드 교환 방식으로 바꿨습니다. 임시 코드는 60초 동안만 유효하고 한 번 쓰면 지워집니다. 리프레시 토큰은 SHA-256 해시로 저장하고, 웹 인증은 httpOnly 쿠키로 옮겼습니다(2026-03-01과 03-02).
- 2026-02-11 커밋에서 Redis 캐시를 8개 서비스로 넓혔습니다(그중 포인트 서비스는 이후 구독 전환으로 삭제됐습니다).
- barun-order.com 도메인에 요금제·이용약관·개인정보처리방침 페이지를 두었습니다.
주요 결정
- 업체가 견적을 제출할 때마다 포인트를 차감하던 방식을, 구독 요금제(BASIC·PRO·PREMIUM)와 일일 견적 한도 방식으로 바꿨습니다(2026-02-19). 포인트 모듈은 삭제했습니다.
한계와 다음 단계
- 지금은 백엔드 서버가 중지되어 있어 로그인과 견적 요청이 동작하지 않습니다.
- 테스트가 적습니다. 백엔드의 단위 테스트 파일은 7개(인증·채팅·업체·견적·매칭·리뷰 서비스와 앱 컨트롤러)이고, 웹 저장소에는 테스트와 CI가 없습니다.
- 백엔드 CI는 main 브랜치 실행 78회 중 58회가 실패했고, 마지막 실행(2026-03-05)도 실패로 끝났습니다.
- 실제 사용자는 없습니다.
AI 협업 방식
방향과 판단은 직접 했고, 구현과 문서 작업은 AI 코딩 에이전트(Claude Code)와 함께 했습니다. 모든 브랜치의 커밋 기준으로 백엔드 저장소는 137개(의존성 자동 갱신 봇 커밋 10개 포함) 중 121개에, 웹 저장소는 176개(같은 봇 커밋 13개 포함) 중 155개에 Claude 공동 작성 표기가 있습니다.
링크
- 저장소백엔드 저장소
- 저장소웹 저장소
- 사이트barun-order.com (서버 중지)
- CI백엔드 CI 실행 기록