Skip to content

Latest commit

 

History

History
347 lines (281 loc) · 12.6 KB

File metadata and controls

347 lines (281 loc) · 12.6 KB

wearly-backend

Wearly 프로젝트 백엔드(API 서버) 레포지토리입니다. (서버 로직, 데이터베이스, API 제공을 담당합니다.)


👨‍💻 Team Members


오뚝이/구태호
@kootaeho

보노/김보현
@bhyn

가니/방가은
@gladgaeun

클로이/김연우
@saigepole

루피/오수진
@sultanofdisco

기술 스택

  • Language: Typescript
  • Framework: Express
  • Database: Postgres
  • ORM: Prisma
  • Auth: Google
  • Deploy: Render / Vercel / Supabase

아키텍처 개요

본 프로젝트는 사용자가 옷장 사진을 업로드하면, 백엔드가 OpenAI API로 이미지를 분석해 의류 아이템을 인식/분류하고 결과를 Supabase(Postgres)에 저장한 뒤, 프론트에서 옷장 목록을 조회/필터링 추천까지 할 수 있도록 제공하는 시스템입니다.

Core Components

  • React (Frontend): 사진 업로드, 분류 결과 확인, 옷장 목록/필터 UI 제공
  • Node.js + Express (Backend): 업로드 요청 처리, OpenAI API 호출, 분류 결과 검증 및 DB 저장/조회 API 제공
  • Supabase (Postgres / Storage): 의류 메타데이터 저장(Postgres), 이미지 파일 저장(Storage)
  • Render (Deployment): 프론트/백엔드 서비스 배포 및 운영

Main Flow (Upload → Analyze → Save → View)

  1. 사용자가 사진을 업로드한다.
  2. 백엔드가 이미지를 저장하고(예: Supabase Storage), 해당 이미지로 OpenAI API 분석을 요청한다.
  3. OpenAI API 응답(카테고리/색상/태그 등)을 파싱·검증 후 Postgres에 저장한다.
  4. 프론트는 저장된 의류 아이템을 조회하여 목록 및 필터링 기능으로 보여준다.

Data Storage Policy

  • 이미지 원본은 파일 스토리지에 저장하고, DB에는 image_url 및 메타데이터만 저장한다.

Security

  • OPENAI_API_KEY, Supabase Service Role Key는 서버에서만 사용하며 클라이언트에 노출하지 않는다.

📁 폴더 구조

wearly-backend/
├── prisma/                          # Prisma ORM 설정 및 마이그레이션
│   ├── schema.prisma               # 데이터베이스 스키마 정의
│   ├── seed.ts                     # 초기 데이터 시딩 스크립트
│   ├── add.ts                      # 데이터 추가 유틸리티
│   └── migrations/                 # DB 마이그레이션 히스토리
│
├── src/
│   ├── app.ts                      # Express 앱 진입점 및 라우터 설정
│   │
│   ├── config/                     # 설정 파일
│   │   └── supabase.ts            # Supabase 클라이언트 설정
│   │
│   ├── routes/                     # API 라우트 정의
│   │   ├── auth.ts                # 인증 관련 라우트 (회원가입, 로그인)
│   │   ├── closet.ts              # 옷장 관리 라우트
│   │   ├── outfit.ts              # 코디 관리 라우트
│   │   ├── upload.ts              # 이미지 업로드 라우트
│   │   ├── notification.route.ts  # 푸시 알림 라우트
│   │   ├── weather.route.ts       # 날씨 정보 라우트
│   │   └── wear-record.route.ts   # 착용 기록 라우트
│   │
│   ├── controllers/                # 요청 처리 및 응답 반환
│   │   ├── auth.ts                # 인증 컨트롤러
│   │   ├── closet.controller.ts   # 옷장 컨트롤러
│   │   ├── clothing.controller.ts # 의류 컨트롤러
│   │   ├── outfit.controller.ts   # 코디 컨트롤러
│   │   ├── upload.controller.ts   # 업로드 컨트롤러
│   │   ├── notification.controller.ts # 알림 컨트롤러
│   │   ├── recommendation.controller.ts # 추천 컨트롤러
│   │   ├── weather.controller.ts  # 날씨 컨트롤러
│   │   └── wear-record.controller.ts # 착용 기록 컨트롤러
│   │
│   ├── services/                   # 비즈니스 로직 처리
│   │   ├── closet.service.ts      # 옷장 서비스
│   │   ├── clothing.service.ts    # 의류 서비스
│   │   ├── outfit.service.ts      # 코디 서비스
│   │   ├── upload.service.ts      # 파일 업로드 서비스
│   │   ├── openaiClassify.service.ts # OpenAI 의류 분류 서비스
│   │   ├── removebg.service.ts    # Remove.bg 배경 제거 서비스
│   │   ├── firebase.service.ts    # Firebase 초기화 및 관리
│   │   ├── notification.service.ts # 푸시 알림 서비스
│   │   ├── recommendation.service.ts # 날씨 기반 추천 서비스
│   │   ├── weather.service.ts     # 날씨 API 서비스
│   │   ├── weather-scheduler.service.ts # 날씨 스케줄러
│   │   ├── scheduler.service.ts   # 알림 스케줄러
│   │   ├── jobmanager.service.ts  # 백그라운드 작업 관리
│   │   └── wear-record.service.ts # 착용 기록 서비스
│   │
│   ├── repositories/               # 데이터베이스 접근 계층
│   │   ├── closet.repository.ts   # 옷장 DB 작업
│   │   ├── clothing.repository.ts # 의류 DB 작업
│   │   ├── outfit.respository.ts  # 코디 DB 작업
│   │   ├── weather.repository.ts  # 날씨 DB 작업
│   │   └── wear-record.repository.ts # 착용 기록 DB 작업
│   │
│   ├── dtos/                       # 데이터 전송 객체 (DTO)
│   │   ├── closet.dto.ts          # 옷장 DTO
│   │   ├── clothing.dto.ts        # 의류 DTO
│   │   ├── outfit.dto.ts          # 코디 DTO
│   │   ├── weather.dto.ts         # 날씨 DTO
│   │   └── wear-record.dto.ts     # 착용 기록 DTO
│   │
│   ├── middlewares/                # Express 미들웨어
│   │   ├── auth.ts                # JWT 인증 미들웨어
│   │   └── multer.ts              # 파일 업로드 미들웨어
│   │
│   ├── utils/                      # 유틸리티 함수
│   │   ├── email.ts               # 이메일 발송 유틸
│   │   ├── jwt.ts                 # JWT 토큰 생성/검증
│   │   ├── response.ts            # API 응답 포맷 유틸
│   │   └── weather.util.ts        # 날씨 데이터 처리 유틸
│   │
│   ├── types/                      # TypeScript 타입 정의
│   │   ├── express.d.ts           # Express 확장 타입
│   │   └── weatherTypes.ts        # 날씨 관련 타입
│   │
│   └── cron/                       # 크론 작업
│       └── weather.cron.ts        # 날씨 데이터 크론 작업
│
├── .env                            # 환경 변수 (Git에서 제외)
├── .env.example                    # 환경 변수 예시
├── .gitignore                      # Git 제외 파일 목록
├── package.json                    # 프로젝트 의존성 및 스크립트
├── tsconfig.json                   # TypeScript 설정
└── README.md                       # 프로젝트 문서

주요 기능 (API)

  • 옷장 조회 API
  • 이미지 업로드 API
  • 로그인 API (JWT)
  • 통계 집계 API
  • 날씨 API 연동
  • 착용 이력 저장 API

실행 방법

git clone https://github.com/Melonging/wearly-backend.git
cd wearly-backend
npm install
`.env` 파일 생성
npx prisma generate
npx prisma migrate deploy
npm run dev

환경 변수

# Database
DATABASE_URL="your-database-url"
DIRECT_URL="your-direct-url"
SUPABASE_URL="your-supabase-url"
SUPABASE_SERVICE_ROLE_KEY="your-supabase-service-role-key"
REMOVEBG_API_KEY="your_removebg_api_key"

# JWT Secrets
JWT_SECRET="your-jwt-secret-key"
REFRESH_SECRET="your-refresh-secret-key"

# Server
PORT=4000

# OpenAI API Key
OPENAI_API_KEY="your-openai-api-key"
# OpenWeatherMap API Key
OPENWEATHER_API_KEY="your-openweather-api-key"

# Firebase Admin SDK (FCM 푸시 알림용)
FIREBASE_SERVICE_ACCOUNT_KEY='{
"type":"service_account",
"project_id":"your-project",
"private_key_id":"...",
"private_key":"...",
"client_email":"...",
"client_id":"...",
"auth_uri":"...",
"token_uri":"...",
"auth_provider_x509_cert_url":"...",
"client_x509_cert_url":"...",
"universe_domain": "...",
}'

협업 규칙

  • 기본 브랜치: main
  • 개발 브랜치: dev
  • 브랜치 네이밍 / 커밋 메시지 규칙: image

참고

개인정보처리방침

Wearly 개인정보처리방침

Wearly(이하 “서비스”)는 이용자의 개인정보를 중요하게 생각하며, 「개인정보 보호법」 등 관련 법령을 준수하여 개인정보를 안전하게 처리합니다.

  1. 개인정보 수집 및 이용 목적

서비스는 다음의 목적을 위해 개인정보를 수집·이용합니다.

  • 회원가입 및 사용자 식별
  • 아이디 및 이메일 기반 로그인 서비스 제공
  • 성별·생년월일 기반 개인화 서비스 제공
  • 개인 옷장 관리 및 코디·캘린더 기록 제공
  • 서비스 이용 내역 관리 및 기능 개선
  • 고객 문의 대응 및 공지사항 전달
  • 서비스 보안 및 부정 이용 방지
  1. 수집하는 개인정보 항목

회원가입 시 (필수) 아이디 (필수) 이메일 주소 (필수) 비밀번호 (필수) 성별 (필수) 생년월일

서비스 이용 시

  • 옷 사진
  • 옷 정보(카테고리, 색상 등)
  • 코디 기록, 메모, 일정 정보
  • 서비스 이용 기록, 접속 로그, 기기 정보

※ 서비스는 주민등록번호, 금융정보 등 민감정보를 수집하지 않습니다.

  1. 개인정보 보유 및 이용 기간
  • 회원 개인정보(아이디, 이메일, 비밀번호, 성별, 생년월일): 회원 탈퇴 시까지
  • 기록 데이터(옷, 코디, 일정 등): 회원 탈퇴 시 함께 삭제

단, 관계 법령에 따라 보관이 필요한 경우 해당 법령에서 정한 기간 동안 보관할 수 있습니다.

  1. 개인정보의 제3자 제공 및 위탁

서비스는 이용자의 개인정보를 원칙적으로 제3자에게 제공하지 않습니다. 현재 개인정보 처리 업무를 외부에 위탁하지 않습니다.

  1. 이용자의 권리

이용자는 언제든지 다음과 같은 권리를 행사할 수 있습니다.

  • 개인정보 조회 및 수정
  • 개인정보 삭제
  • 회원 탈퇴

해당 권리는 앱 내 설정 또는 고객 문의를 통해 행사할 수 있습니다.

  1. 개인정보 보호를 위한 안전조치

서비스는 개인정보 보호를 위해 다음과 같은 조치를 취하고 있습니다.

  • 비밀번호 암호화 저장
  • 개인정보 접근 권한 최소화
  • 개인정보 처리 시스템 보안 관리
  1. 개인정보 보호책임자 및 문의

개인정보 보호책임자: Wearly 운영팀 문의 이메일: [email protected]

  1. 개인정보처리방침 변경

본 개인정보처리방침은 법령 또는 서비스 정책 변경에 따라 수정될 수 있으며, 변경 시 앱 내 공지를 통해 안내합니다.

  • 시행일자: 2026년 1월 27일