Oh-Manager (신인 배우 오디션 중계 플랫폼)
FastAPI SQLAlchemy Clean Architecture Domain-Driven Design Dependency Injector MySQL Docker
목차
프로젝트 개요
| 서비스 소개 | 기획사 소속이 없는 무소속 신인 및 지망생 배우들에게 공정하고 안전한 오디션 매칭과 중계 기회를 제공하는 매칭 플랫폼임. |
|---|---|
| 핵심 목표 1 | 배우 지망생 정보(신체조건, 프로필 이미지, 포트폴리오 등)를 통합 관리하고, 기획사와 안전하게 매칭을 조율할 수 있는 신뢰성 있는 채널을 확보하는 것을 목표로 함. |
| 핵심 목표 2 | 무소속 지망생들을 위해 불공정 거래나 사기/유해 오디션 유입을 사전 감지 및 필터링할 수 있는 규격화된 스크리닝 기능 제공을 목표로 함. |
팀 구성 및 정보
| 항목 | 내용 |
|---|---|
| 참여 인원 | 총 2명 (PO/PM 1명, BE 1명) |
| 진행 기간 | 2024.02 ~ 2024.04 (약 2개월) |
| 담당 역할 | 백엔드 API 개발 및 오디션 매칭 코어 비즈니스 도메인 설계 수행 |
| 협업 도구 | • Slack: 팀 내부 소통 및 실시간 알림 연동 • Jira: Sprint 기반 일정 및 세부 태스크 관리 • Notion: 기획 안, 스펙 명세, 개발 및 API 문서 통합 관리 |
기술 구현 상세
기술 스택 및 개발 환경
| 항목 | 내용 |
|---|---|
| 담당 역할 | 백엔드 API 개발 및 오디션 매칭 코어 비즈니스 도메인 설계 수행 |
| 기술 스택 | Python 3.x, FastAPI, SQLAlchemy, MySQL, Docker, Slack SDK |
| Infrastructure | Docker 가상화 및 AWS 환경을 활용함 • FastAPI: Docker를 도입하여 런타임 환경 일관성을 확보하고 배포 자동화를 수립함 • RDS: MySQL 인스턴스를 통해 오디션 및 프로필 데이터베이스 관리 효율성을 제고함 |
| Repository | Oh-Manager-API Repo |
주요 기능
| 기능 | 상세 내용 |
|---|---|
| 관심 분야 기반 공고 추천 | 유저 관심사(연령대, 성별, 역할 등) 조건에 특화된 오디션 정보 필터링 및 매칭 조회 기능을 개발함 |
| 지망생 프로필 및 포트폴리오 관리 | 배우 지망생의 신체조건 정보, 주소지 및 SNS 채널 링크, 프로필 이미지를 체계적으로 업로드 관리하는 기능을 제공함 |
| 오디션 지원 및 지원 상태 관리 | 온라인 오디션 원스톱 접수 및 지원서 작성, 실시간 접수 현황 상태 가공 API를 구축함 |
| 이메일 인증 및 JWT 세션 관리 | 회원가입 시 이메일 유효 코드를 검증하고, bcrypt 암호화 알고리즘과 JWT 기반 안전한 세션 인증 수명 주기를 제어함 |
핵심 성과 및 의사결정 이력
1. APIRoute 상속 Custom TransactionRoute 개발을 통한 트랜잭션 수명 주기 일괄 통제 (커넥션 누출 차단)
- 배경 & 제약사항: 각 API 엔드포인트(라우터 함수)마다 DB 세션 관리(세션 시작, 커밋, 예외 시 롤백, 세션 종료) 코드가 반복적으로 들어가 코드의 가독성이 훼손되었습니다. 만약 특정 API에서 예외 처리 누수가 발생할 경우 DB 커넥션 풀이 고갈되거나 트랜잭션 오염이 생길 위험이 상존했습니다.
- 의사결정 (Why TransactionRoute 데코레이터?):
- FastAPI의 APIRoute 클래스를 오버라이드하여, HTTP Request의 생성 및 Response 반환 라이프사이클을 가로채는 커스텀
TransactionRoute를 구현했습니다. - 이를 통해 API 호출 시작 시 세션을 바인딩하고, Response가 정상 반환되면 자동으로 커밋하며, 예외가 던져질 경우 자동으로 롤백을 수행하는 전역 미들웨어성 데코레이터 단에서 일괄 통제하도록 구조화했습니다.
- FastAPI의 APIRoute 클래스를 오버라이드하여, HTTP Request의 생성 및 Response 반환 라이프사이클을 가로채는 커스텀
- 성과: 비즈니스 로직(Usecase/Service) 레이어에서 데이터베이스 영속성 트랜잭션에 관련된 코드를 완전히 제거하여 오직 순수 비즈니스 로직에만 집중하게 하였고, 커넥션 누수를 원천 차단했습니다.
2. dependency-injector 기반 DI 패턴 도입으로 외부 SDK/인프라 변동 리스크 격리
- 배경 & 제약사항: 오디션 매칭 도메인의 유스케이스 코드가 DB 라이브러리(SQLAlchemy)와 알림 발송용 외부 SDK(Slack SDK)에 밀결합되어 있어, 기술 스펙이 변경될 경우(예: Slack을 알림 전용 큐로 변경 등) 비즈니스 로직을 모두 뜯어고쳐야 하는 유지보수 리스크가 있었습니다.
- 의사결정 (Why Dependency Injector?):
dataclasses를 사용해 핵심 비즈니스 도메인 규칙을 보호하는 독립 엔티티를 구성했습니다.- 파이썬 환경의 고성능 DI 컴포넌트인
dependency-injector컨테이너를 도입하여, 런타임에 인프라 어댑터(Slack 연동 모듈, DB 리포지토리)를 동적으로 주입하게 설정했습니다. - 테스트 환경에서는
patch_ioc패턴을 적용하여 DB 연결 없이 Mock 리포지토리를 자동 바인딩하여 실행할 수 있도록 검증 환경을 구축했습니다.
- 성과: 외부 프레임워크나 외부 API 규격이 변경되어도 오디션 코어 비즈니스 코드는 단 한 줄도 손대지 않는 구조적 유연성을 확보하고, 전체 테스트 커버리지를 비약적으로 높였습니다.