Wearly 프로젝트 백엔드(API 서버) 레포지토리입니다. (서버 로직, 데이터베이스, API 제공을 담당합니다.)
오뚝이/구태호 @kootaeho |
보노/김보현 @bhyn |
가니/방가은 @gladgaeun |
클로이/김연우 @saigepole |
루피/오수진 @sultanofdisco |
- Language: Typescript
- Framework: Express
- Database: Postgres
- ORM: Prisma
- Auth: Google
- Deploy: Render / Vercel / Supabase
본 프로젝트는 사용자가 옷장 사진을 업로드하면, 백엔드가 OpenAI API로 이미지를 분석해 의류 아이템을 인식/분류하고 결과를 Supabase(Postgres)에 저장한 뒤, 프론트에서 옷장 목록을 조회/필터링 추천까지 할 수 있도록 제공하는 시스템입니다.
- React (Frontend): 사진 업로드, 분류 결과 확인, 옷장 목록/필터 UI 제공
- Node.js + Express (Backend): 업로드 요청 처리, OpenAI API 호출, 분류 결과 검증 및 DB 저장/조회 API 제공
- Supabase (Postgres / Storage): 의류 메타데이터 저장(Postgres), 이미지 파일 저장(Storage)
- Render (Deployment): 프론트/백엔드 서비스 배포 및 운영
- 사용자가 사진을 업로드한다.
- 백엔드가 이미지를 저장하고(예: Supabase Storage), 해당 이미지로 OpenAI API 분석을 요청한다.
- OpenAI API 응답(카테고리/색상/태그 등)을 파싱·검증 후 Postgres에 저장한다.
- 프론트는 저장된 의류 아이템을 조회하여 목록 및 필터링 기능으로 보여준다.
- 이미지 원본은 파일 스토리지에 저장하고, DB에는 image_url 및 메타데이터만 저장한다.
- 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 (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": "...",
}'
- API 문서: https://wearly-backend-cvbo.onrender.com/api-docs
- 배포 주소: https://wearly-backend-cvbo.onrender.com
Wearly(이하 “서비스”)는 이용자의 개인정보를 중요하게 생각하며, 「개인정보 보호법」 등 관련 법령을 준수하여 개인정보를 안전하게 처리합니다.
- 개인정보 수집 및 이용 목적
서비스는 다음의 목적을 위해 개인정보를 수집·이용합니다.
- 회원가입 및 사용자 식별
- 아이디 및 이메일 기반 로그인 서비스 제공
- 성별·생년월일 기반 개인화 서비스 제공
- 개인 옷장 관리 및 코디·캘린더 기록 제공
- 서비스 이용 내역 관리 및 기능 개선
- 고객 문의 대응 및 공지사항 전달
- 서비스 보안 및 부정 이용 방지
- 수집하는 개인정보 항목
회원가입 시 (필수) 아이디 (필수) 이메일 주소 (필수) 비밀번호 (필수) 성별 (필수) 생년월일
서비스 이용 시
- 옷 사진
- 옷 정보(카테고리, 색상 등)
- 코디 기록, 메모, 일정 정보
- 서비스 이용 기록, 접속 로그, 기기 정보
※ 서비스는 주민등록번호, 금융정보 등 민감정보를 수집하지 않습니다.
- 개인정보 보유 및 이용 기간
- 회원 개인정보(아이디, 이메일, 비밀번호, 성별, 생년월일): 회원 탈퇴 시까지
- 기록 데이터(옷, 코디, 일정 등): 회원 탈퇴 시 함께 삭제
단, 관계 법령에 따라 보관이 필요한 경우 해당 법령에서 정한 기간 동안 보관할 수 있습니다.
- 개인정보의 제3자 제공 및 위탁
서비스는 이용자의 개인정보를 원칙적으로 제3자에게 제공하지 않습니다. 현재 개인정보 처리 업무를 외부에 위탁하지 않습니다.
- 이용자의 권리
이용자는 언제든지 다음과 같은 권리를 행사할 수 있습니다.
- 개인정보 조회 및 수정
- 개인정보 삭제
- 회원 탈퇴
해당 권리는 앱 내 설정 또는 고객 문의를 통해 행사할 수 있습니다.
- 개인정보 보호를 위한 안전조치
서비스는 개인정보 보호를 위해 다음과 같은 조치를 취하고 있습니다.
- 비밀번호 암호화 저장
- 개인정보 접근 권한 최소화
- 개인정보 처리 시스템 보안 관리
- 개인정보 보호책임자 및 문의
개인정보 보호책임자: Wearly 운영팀 문의 이메일: [email protected]
- 개인정보처리방침 변경
본 개인정보처리방침은 법령 또는 서비스 정책 변경에 따라 수정될 수 있으며, 변경 시 앱 내 공지를 통해 안내합니다.
- 시행일자: 2026년 1월 27일
