Loop 해커톤용 FastAPI 백엔드입니다. 학생/교수 매칭 시나리오를 기준으로 회원가입, 프로필 탐색, 좋아요, 파일 업로드(S3), PDF 요약(OpenAI) API를 제공합니다.
- 역할 기반 사용자:
STUDENT,PROFESSOR - 핵심 도메인:
User,StudentProfile,ProfessorProfile,Like - 파일 처리: S3 Presigned URL 기반 직접 업로드
- AI 기능: PDF 텍스트 추출 후 논문 요약/연구 분야 추출
- Python 3.11+
- FastAPI, Uvicorn
- SQLAlchemy 2.x, Alembic
- PostgreSQL
- boto3 (AWS S3)
- pypdf
- OpenAI Python SDK (Responses API)
back/
├─ app/
│ ├─ api/ # 라우터 계층
│ │ ├─ auth.py # 회원가입
│ │ ├─ user.py # 사용자 활성화 상태 변경
│ │ ├─ profiles.py # 프로필 탐색/이미지 저장/조회
│ │ ├─ likes.py # 좋아요 토글/좋아요 카드 조회
│ │ ├─ files.py # presign(pdf/image), pdf 요약
│ │ └─ health.py # 헬스체크
│ ├─ core/ # 설정 및 도메인 서비스
│ ├─ db/ # SQLAlchemy 엔진/세션
│ ├─ models/ # DB 모델
│ ├─ schemas/ # 요청/응답 스키마
│ └─ services/ # S3/PDF/OpenAI 서비스
├─ alembic/ # 마이그레이션
├─ docs/ # API 세부 문서
├─ requirements.txt
└─ .env.example
python -m venv .venv
# Windows PowerShell
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txtcopy .env.example .env.env의DATABASE_URL에 맞는 DB 생성- 기본값:
postgresql+psycopg2://postgres:postgres@localhost:5432/loop_db
alembic upgrade headuvicorn app.main:app --reload- Swagger:
http://127.0.0.1:8000/docs - Health:
GET /health
APP_NAME="Loop Hackathon API"
APP_ENV="local"
DEBUG=true
DATABASE_URL="postgresql+psycopg2://postgres:postgres@localhost:5432/loop_db"
AWS_ACCESS_KEY_ID=""
AWS_SECRET_ACCESS_KEY=""
AWS_REGION="ap-northeast-2"
AWS_S3_BUCKET=""
AWS_S3_PDF_PREFIX="loop/papers"
AWS_S3_IMAGE_PREFIX="loop/images"
AWS_PRESIGNED_URL_EXPIRES=300
OPENAI_API_KEY=""
OPENAI_MODEL="gpt-4.1-mini"POST /api/auth/signup- 학생/교수 회원가입 + 역할별 프로필 생성
PATCH /api/users/{user_id}/active- 사용자 활성화 상태 변경
GET /profiles/discover- 현재 사용자 역할 기준 반대 역할 프로필 카드 목록 조회
POST /profiles/image- 프로필 이미지 S3 Key 저장
GET /profiles/image- 프로필 이미지 Presigned Download URL 조회
POST /likes/toggle- 좋아요 저장/취소 토글
GET /likes/cards- 내가 좋아요한 카드 목록 조회
POST /files/presign/pdf- PDF 업로드용 Presigned URL 발급
POST /files/presign/image- 이미지 업로드용 Presigned URL 발급
POST /files/summarize-pdf- S3 PDF 텍스트 추출 + AI 요약 + 연구 분야 추출
- 자기 자신에게 좋아요 불가
- 프로필 탐색은 요청 role과 실제 user role이 일치해야 함
- PDF presign은
.pdf+application/pdf만 허용 - 이미지 presign은
.jpg/.jpeg/.png/.webp, MIME 타입 제한 - 교수 회원가입 시
s3_key와summary가 함께 오면ai_status=COMPLETED, 아니면PENDING
users- 공통 사용자 정보(이메일, 성별, 역할, 활성화 여부)
student_profiles- 학생 카드 정보(학년, 기술스택, 관심분야, 소개 등)
professor_profiles- 교수 카드 정보(학력, 경력, 희망 인재상, 논문 요약 정보 등)
likes- 사용자 간 좋아요 관계
POST /files/presign/pdf- 클라이언트가 S3에 직접
PUT POST /files/summarize-pdfwiths3_key- 요약 결과 수신
POST /files/presign/image- 클라이언트가 S3에 직접
PUT POST /profiles/image로profile_image_s3_key저장- 필요 시
GET /profiles/image로 조회
docs/ 폴더에 기능별 상세 문서가 있습니다.
pdf-upload-presign-api.mdpdf-summarize-api.mdprofile-list-api.mdprofile-image-presign-api.mdprofile-image-save-api.mdprofile-image-get-api.mdlike-save-api.mdliked-cards-api.md
- 현재 API는 인증 토큰 없이 일부 엔드포인트에서
user_id를 직접 받는 구조입니다. - 운영 전환 시 JWT 인증, 권한 검증, rate limit, 에러 표준화, 관측성(로그/메트릭) 보강을 권장합니다.