Petting (반려견 성격유형검사 서비스)
FastAPI SQLAlchemy Classical Mapping Domain Event Kakao Local API MySQL Docker
목차
프로젝트 개요
| 서비스 소개 | 반려견의 성향을 기반으로 적합한 친구를 매칭하고, 견주들이 반려 경험과 정보를 공유할 수 있는 커뮤니티 및 소통 플랫폼임. |
|---|---|
| 핵심 목표 1 | 반려견의 성향에 맞는 친구를 안전하게 연결할 수 있는 PDTI(반려견 성향 분석) 기반의 1:1 매칭 시스템을 구축하는 것을 목표로 함. |
| 핵심 목표 2 | 동네 근접 위치 및 공간 좌표 연동을 이용해 주변 반려견 정보를 편리하게 탐색하고 소통할 수 있는 반려인 친화적 소통 채널을 제공하는 것을 목표로 함. |
팀 구성 및 정보
| 항목 | 내용 |
|---|---|
| 참여 인원 | 총 3명 (PO/PM 1명, BE 1명, FE 1명) |
| 진행 기간 | 2024.04 ~ 2024.07 (약 2개월) |
| 담당 역할 | 백엔드 API 개발 및 AWS 인프라 유지보수 수행 |
| 협업 도구 | • Slack: 팀 내부 소통 및 실시간 알림 연동 • Jira: Sprint 기반 일정 및 세부 태스크 관리 • Notion: 기획 안, 스펙 명세, 개발 및 API 문서 통합 관리 |
기술 구현 상세
기술 스택 및 개발 환경
| 항목 | 내용 |
|---|---|
| 담당 역할 | 백엔드 API 개발 및 AWS 인프라 유지보수 수행 |
| 기술 스택 | Python 3.10, FastAPI, SQLAlchemy, MySQL, dependency-injector, boto3 (AWS S3), requests, PyJWT, Aligo SMS API, Kakao Local API, Docker |
| Infrastructure | AWS(EC2, S3, RDS)를 활용함 • FastAPI: EC2 환경에 Docker 컨테이너 기반으로 배포함 • RDS: MySQL 엔진을 적용해 데이터를 적재함 • S3: 반려견 프로필 및 커뮤니티 미디어 자산 저장소로 활용함 |
| Repository | PETTING-API Repo |
주요 기능
| 기능 | 상세 내용 |
|---|---|
| PDTI 및 성격 유형 검사 | 반려견 성향 및 행동 양식 자체 진단 테스트를 개발하고 점수 산정 알고리즘을 구현함 |
| 성향 기반 친구 매칭 | PDTI 진단 결과 유형의 연산 및 비교를 통해 근접 매칭 및 성격 적합도 높은 친구 강아지 매칭 추천 기능을 개발함 |
| 위치 기반 근접 강아지 탐색 | 유저의 주소 유효성을 검증하고, 추출된 공간 좌표(경위도)를 활용하여 주변에 거주하는 반려견을 거리순 탐색하는 서비스를 구현함 |
| 실시간 1:1 매칭 채팅 및 게시판 | 매칭에 동의한 반려인 간 1:1 대화가 가능한 채팅 인프라를 구축하고 정보 공유 커뮤니티 게시판을 제공함 |
핵심 성과 및 의사결정 이력
1. Classical Mapping(map_imperatively)을 통한 DB와 도메인 의존성 단방향 격리 (DIP 실현)
- 배경 & 제약사항: 일반적으로 테이블 데이터 모델 클래스를 도메인 모델로 혼용하지만, 이 경우 DB 스키마나 라이브러리 사양(SQLAlchemy 선언형 모델 등)이 변경되면 핵심 도메인 규칙이 직접 오염되는 취약점이 있었습니다. 이로 인해 DB 커넥션 없이는 핵심 로직 검증조차 어려워 테스트 신뢰성이 낮았습니다.
- 의사결정 (Why Classical Mapping?):
- 도메인 중심 설계(DDD)를 실천하기 위해, 순수 비즈니스 엔티티 클래스와 SQLAlchemy의 테이블 매핑 정의를 물리적으로 분리하는 Classical Mapping (
map_imperatively()) 방식을 도입했습니다. - 데이터 모델과 비즈니스 도메인 간의 의존성을 단방향(DIP)으로 끊음으로써 결합도를 차단했습니다.
- 도메인 중심 설계(DDD)를 실천하기 위해, 순수 비즈니스 엔티티 클래스와 SQLAlchemy의 테이블 매핑 정의를 물리적으로 분리하는 Classical Mapping (
- 성과: 데이터베이스 의존성 없이 핵심 도메인의 단위 테스트 작성이 원활해져, 로컬 환경에서 빠른 피드백 루프를 수립하고 코드 안정성을 극대화했습니다.
2. 동기식 Event Bus 구현을 통한 미디어 업로드와 리워드 트랜잭션 에러 전파 차단
- 배경 & 제약사항: 미디어 업로드 로직과 리워드 지급 보상 로직이 단일 트랜잭션 내에 강하게 밀결합되어 있었습니다. 이 때문에 타사 리워드 지급 API 장애 시 전체 미디어 업로드 프로세스마저 함께 롤백되는 가용성 저하 문제가 발생했습니다.
- 의사결정 (Why Event Bus?):
- 두 로직 간의 결합도를 제어하기 위해 자체 발행-구독(Pub-Sub) 패턴을 따르는 동기식 Domain Event Bus를 자체 구현했습니다.
- 미디어 업로드 완료 시점에 이벤트를 발행하고, 리워드 지급기는 이벤트를 가로채 독립적인 트랜잭션으로 처리하도록 격리했습니다.
- 성과: 미디어 업로드와 리워드 지급 로직 간의 물리적인 동기 결합을 제거하여 에러 전파를 차단했으며, 추후 알림 전송 등 새로운 리스너가 추가될 때 기존 핵심 코드를 고칠 필요 없이 이벤트 구독자만 추가하면 되는 확장성을 확보했습니다.