프로젝트 개요
**위드 (WITH)**는 혼자 여행 가기 아쉬운 사람들을 위한 동행 매칭 플랫폼입니다. 같은 목적지로 여행하는 동행자를 찾거나, 여행사가 주최하는 그룹 투어에 참여할 수 있는 서비스를 제공합니다. 일반 회원은 동행을 모집하고, 여행사는 패키지 투어를 운영하여 새로운 형태의 여행 경험을 만들어냅니다.
서비스 흐름도
주요 기능
1. 회원 관리 시스템
- 소셜 로그인: 카카오와 Apple 계정으로 간편하게 가입할 수 있습니다. 기존 소셜 계정의 프로필 정보를 가져와 초기 설정 과정을 줄여줍니다.
- 회원 유형 구분: 일반 회원과 여행사 회원으로 구분되며, 각각 다른 권한과 기능을 사용합니다. 여행사는 투어 패키지 등록 및 관리 권한을 가집니다.
- 본인 인증: PortOne을 통해 휴대폰 본인 인증을 진행합니다. 허위 가입을 방지하고 신뢰도 높은 회원 환경을 조성합니다.
- 프로필 관리: 여행 스타일, 관심사, 자기소개 등을 설정할 수 있습니다. 상세한 프로필은 동행 매칭 시 신뢰도를 높이는 데 도움이 됩니다.
2. 동행 매칭 기능
- 모집글 작성: 여행 일정, 목적지, 인원, 예산 등을 포함한 모집글을 작성합니다. 상세한 정보를 제공하여 적합한 동행자를 찾을 수 있습니다.
- 검색 및 필터링: 목적지, 날짜, 예산 범위, 여행 스타일 등 다양한 조건으로 모집글을 검색합니다. 원하는 조건에 맞는 동행을 빠르게 찾을 수 있습니다.
- 참여 신청 및 승인: 관심 있는 모집글에 참여 신청을 보내고, 모집자가 승인하면 동행이 확정됩니다. 승인 과정을 통해 서로 맞는 동행자를 선택할 수 있습니다.
- 실시간 채팅: 동행이 확정된 후 여행 전 소통을 위한 채팅 기능을 제공합니다. 일정 조율이나 준비물 공유 등 사전 대화가 가능합니다.
3. 여행사 투어 패키지
- 패키지 상품 등록: 여행사가 직접 그룹 투어 상품을 등록하고 관리합니다. 일정, 가격, 포함 사항 등을 상세하게 입력할 수 있습니다.
- 예약 및 결제: 투어 상품을 예약하고 온라인으로 결제합니다. 다양한 결제 수단을 지원하여 편리한 결제 경험을 제공합니다.
- 참가자 관리: 투어 참가자 명단을 관리하고 공지사항을 전달합니다. 여행사는 투어 진행에 필요한 정보를 참가자에게 안내할 수 있습니다.
4. 리뷰 및 평가 시스템
- 동행 후기: 여행 종료 후 동행자에 대한 평가와 리뷰를 작성합니다. 솔직한 후기는 다른 사용자가 동행자를 선택하는 데 참고 자료가 됩니다.
- 여행지 리뷰: 방문한 여행지에 대한 후기와 여행 팁을 공유합니다. 실제 경험을 바탕으로 한 정보를 다른 여행자와 나눌 수 있습니다.
- 신뢰도 점수: 누적된 리뷰를 바탕으로 회원 신뢰도를 점수로 표시합니다. 신뢰도가 높은 회원일수록 동행 매칭 가능성이 높아집니다.
5. 관리자 대시보드
- 회원 관리: 일반 회원과 여행사 계정을 관리합니다. 회원 정보 조회, 정지, 탈퇴 처리 등을 수행할 수 있습니다.
- 콘텐츠 모니터링: 부적절한 모집글이나 리뷰를 확인하고 조치합니다. 신고 접수된 콘텐츠를 검토하여 서비스 품질을 유지합니다.
- 통계 및 분석: 서비스 이용 현황과 주요 지표를 확인합니다. 회원 가입 추이, 모집글 작성 수, 투어 예약 현황 등을 대시보드에서 한눈에 파악할 수 있습니다.
플랫폼 구성
서비스 구성
| 구분 | 기술 스택 | 설명 |
|---|---|---|
| 모바일 앱 | React Native | iOS/Android 크로스 플랫폼 앱 |
| 관리자 웹 | Next.js | 관리자용 대시보드 |
| 백엔드 API | NestJS + TypeScript | Client/Admin 분리된 API 서버 |
| 데이터베이스 | PostgreSQL + TypeORM | 관계형 데이터 저장 |
| 파일 스토리지 | AWS S3 | 이미지 및 첨부파일 저장 |
| 이메일 | AWS SES | 알림 및 안내 메일 발송 |
| 메시지 큐 | AWS SQS | 비동기 작업 처리 |
| 소셜 로그인 | Kakao, Apple | 간편 로그인 |
| 결제/인증 | PortOne | 본인인증 및 결제 연동 |
기술적 선택과 이유
NestJS + TypeScript 모노레포 아키텍처
선택 이유: 클라이언트 앱, 관리자 대시보드, 백엔드 서버가 동일한 도메인 로직을 공유해야 했습니다. NestJS의 모듈화된 구조와 TypeScript의 타입 안정성을 활용하여 코드 재사용성을 높이고, 모노레포로 구성하여 도메인 로직, 공통 유틸리티, 각 애플리케이션을 명확하게 분리했습니다.
실무 효과:
- 회원 인증, 권한 관리 등 공통 로직을 Core 모듈에서 한 번만 구현
- 타입 정의를 공유하여 프론트엔드-백엔드 간 인터페이스 불일치 방지
- 새로운 기능 추가 시 영향 범위를 명확하게 파악 가능
AWS 인프라 활용
선택 이유: 여행 사진 업로드, 대량 알림 발송, 결제 후 처리 등 다양한 비동기 작업을 안정적으로 처리해야 했습니다. AWS의 관리형 서비스를 활용하여 인프라 관리 부담을 줄이고, 트래픽 증가에 유연하게 대응할 수 있는 구조를 구축했습니다.
실무 효과:
- S3: 여행 사진 등 대용량 파일을 Pre-signed URL로 안전하게 업로드
- SQS: 이메일 발송, 알림 등을 큐에 쌓아 비동기 처리하여 API 응답 속도 개선
- SES: 예약 확정, 취소 등 중요 알림을 안정적으로 전달
TypeORM + PostgreSQL
선택 이유: 회원, 모집글, 투어, 리뷰 등 복잡한 관계를 가진 데이터 구조를 다뤄야 했습니다. PostgreSQL의 관계형 데이터 처리 능력과 TypeORM의 타입 안전한 쿼리 빌더를 조합하여 안정적인 데이터 관리를 구현했습니다.
실무 효과:
- Entity 정의만으로 TypeScript 타입과 DB 스키마를 동시에 관리
- 트랜잭션을 통한 결제-예약 확정 등 민감한 작업의 데이터 정합성 보장
- Migration 기능으로 스키마 변경 이력 관리 및 안전한 배포
PortOne 통합
선택 이유: 여행 서비스 특성상 본인 확인이 중요하고, 여행사 투어의 경우 온라인 결제가 필수적이었습니다. PortOne의 통합 API를 활용하여 본인인증과 결제를 하나의 서비스로 처리하고, 다양한 PG사를 쉽게 연동할 수 있도록 했습니다.
실무 효과:
- 휴대폰 본인인증으로 허위 가입 방지
- 신용카드, 계좌이체 등 다양한 결제 수단 지원
- 결제 실패, 환불 등 예외 상황을 체계적으로 처리
Kakao/Apple 소셜 로그인
선택 이유: 여행 매칭이라는 서비스 특성상 회원 가입 과정이 간편해야 사용자 이탈을 줄일 수 있습니다. 국내 사용자가 가장 많이 사용하는 카카오와, iOS 필수인 Apple 로그인을 지원하여 가입 장벽을 낮췄습니다.
실무 효과:
- 비밀번호 관리 부담 없이 안전한 인증 제공
- 카카오톡 프로필 정보로 초기 프로필 자동 생성
- 로그인 소요 시간 단축으로 사용자 경험 개선
프로젝트 특징
- 분리된 관심사: Client API, Admin API, Core Domain을 명확하게 분리하여 각 계층의 책임을 명확히 하고 유지보수성을 향상
- 타입 안전성: TypeScript와 TypeORM을 통한 엔드투엔드 타입 안전성 확보로 런타임 오류 감소
- 비동기 처리 아키텍처: AWS SQS를 활용한 비동기 작업 처리로 API 응답 속도 개선 및 안정적인 알림 발송
- 재사용 가능한 모듈: UDS로 공통 유틸리티를 패키징하여 다른 프로젝트에서도 재사용 가능
- 확장 가능한 구조: 모노레포 구조를 통해 새로운 앱 추가 시 Core 로직을 그대로 활용
- 보안 중심 설계: JWT 인증, bcrypt 패스워드 해싱, 본인인증 등 다층 보안 체계 구축
- 관리자 친화적: Swagger를 통한 자동 API 문서화 및 별도의 관리자 대시보드로 운영 효율성 향상