🔔 서비스명 : 온사이즈
🔔 서비스 한줄소개 : 쉽고 똑똑한 나의 쇼핑 도우미, 온사이즈
🔔 서비스 가치제안 :
- 단순한 / Simple : 몇 번의 클릭만으로 사이즈를 추천받고 나의 옷장에 저장해요
- 개인화된 / Personalize : 오로지 나만의 기준으로 옷을 추천받고 분류해요
- 똑똑한 / Smart : 익스텐션을 통해 보다 똑똑하게 쇼핑해요
🔔 서비스 문제정의 :
- 사이즈 실패로 인해 발생하게 될 환불, 교환, 반송에 대한 스트레스
- 정확한 사이즈를 고르고자 다양한 정보를 수집하는 과정 속 번거로움
🔔 서비스 타겟정의 :
- 패션에 관심이 많아 온라인에서 다양한 의류 및 관련정보를 찾아보며 구매를 결정하는 고객
- 온라인에서의 사이즈 실패 경험으로 인해 오프라인 쇼핑으로 전환한 고객
김동재 | 조하얀 |
ehdwoKIM | yanh2 |
기능명 | 엔드포인트 | 담당 | 완료 |
---|---|---|---|
회원가입 및 로그인 | [POST] /auth/login | 조하얀 | ✅ |
전체 옷장 조회 | [GET] /allCloset | 김동재 | ✅ |
전체 옷장 의류 정보 수정 | [PUT] /allCloset/:productId | 김동재 | ✅ |
전체 옷장 의류 삭제 | [DELETE] /allCloset/:productId | 김동재 | ✅ |
포함된 카테고리 id 조회 | [GET] /allCloset/:productId | 김동재 | ✅ |
카테고리에 의류 추가 | [POST] /allCloset/toCategory | 김동재 | ✅ |
카테고리 전체 조회 | [GET] /category | 김동재 | ✅ |
카테고리 생성 | [POST] /category/createCategory | 김동재 | ✅ |
카테고리 삭제 | [DELETE] /category/:categoryId | 김동재 | ✅ |
카테고리 수정 | [PUT] /category/:categoryId | 김동재 | ✅ |
카테고리 상세 조회 | [GET] /category/:categoryId | 김동재 | ✅ |
카테고리 내 의류 핀 고정/해제 | [PUT] /category/:categoryId/:productId | 김동재 | ✅ |
카테고리 내 의류 삭제 | [DELETE] /category/:categoryId/:inClothId | 김동재 | ✅ |
마이사이즈 조회 | [GET] /mysize | 조하얀 | ✅ |
내 상의 사이즈 정보 입력 | [POST] /mysize/topSize | 조하얀 | ✅ |
내 하의 사이즈 정보 입력 | [POST] /mysize/bottomSize | 조하얀 | ✅ |
마이페이지 조회 | [GET] /mypage | 조하얀 | ✅ |
사이즈 추천 기록 조회 | [GET] /mypage/history | 조하얀 | ✅ |
전체 옷장에 저장 | [POST] /extesion/toAllCloset | 김동재 | ✅ |
크롤링한 사이즈표 저장 | [POST] /extesion/saveCrawling | 김동재 | ✅ |
사이즈 추천 결과 저장 | [POST] /extension/saveBest | 김동재 | ✅ |
비교 사이즈 수동 입력 | [POST] /extension/inputSize | 김동재 | ✅ |
변수명
- Camel Case 사용
- 함수의 경우 동사+명사 사용 ( ex) getUser() )
- 약어는 되도록 사용하지 않음
주석
- 한 줄 주석 사용 //
- 함수 주석
/**
* @route
* @desc
* @access
**/
getUser()
이 외 ESLint 라이브러리 문법을 따른다.
Branch 이름 | 용도 |
---|---|
main | 초기 세팅 |
develop | 배포 branch (api 로직 구현 완료) |
feature/#이슈번호 | 이슈별 api 로직 구현 |
- feature -> development : Pull Request (코드 리뷰 없이 merge 불가)
[브랜치 이름] 기능 (또는 변경사항) 간략 설명 (70자)
- 보충 설명이 필요한 경우
- Head에 한칸을 띄어서 작성
issue tracker: 이슈 번호 (option)
3-Layer Architecture 기반
📁 src
|_ 📁 constants
|_ 📁 controller
|_ 📁 interfaces
|_ 📁 middlewares
|_ 📁 modules
|_ 📁 router
|_ 📁 service
|_ 📁 test
|_ index.ts
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id Int @id(map: "user_pk") @unique(map: "user_id_uindex") @default(autoincrement())
name String? @db.VarChar(10)
email String @unique @db.VarChar(50)
userImage String? @db.VarChar(500)
token String? @db.VarChar(500)
AllCloset AllCloset[]
AllSizeBottom AllSizeBottom[]
AllSizeTop AllSizeTop[]
Category Category[]
Recommend Recommend[]
}
model AllCloset {
id Int @id(map: "Archive_pkey") @unique(map: "Archive_id_key") @default(autoincrement())
userId Int @default(autoincrement())
image String? @db.VarChar(500)
productName String? @db.VarChar(36)
size String? @db.VarChar(10)
memo String? @db.VarChar(50)
isRecommend Boolean?
isPin Boolean @default(false)
mallName String? @db.VarChar(50)
productUrl String? @db.VarChar(500)
faviconUrl String? @db.VarChar(500)
createdAt String? @db.VarChar(20)
User User @relation(fields: [userId], references: [id], onDelete: NoAction, onUpdate: NoAction, map: "allcloset_user_id_fk")
AllCloset_Category AllCloset_Category[]
}
model AllSizeBottom {
id Int @id @unique @default(autoincrement())
size String? @db.VarChar(10)
bottomLength Int?
waist Int?
thigh Int?
rise Int?
hem Int?
isWidthOfBottom Boolean?
isManual Boolean?
topOrBottom Int?
manualInputNum Int?
bottomItemId Int?
userId Int @default(autoincrement())
User User @relation(fields: [userId], references: [id], onDelete: NoAction, onUpdate: NoAction, map: "allsizebottom_user_id_fk")
}
model AllSizeTop {
id Int @id @unique @default(autoincrement())
size String? @db.VarChar(10)
topLength Int?
shoulder Int?
chest Int?
isWidthOfTop Boolean?
isManual Boolean?
topOrBottom Int?
manualInputNum Int?
topItemId Int?
userId Int @default(autoincrement())
User User @relation(fields: [userId], references: [id], onDelete: NoAction, onUpdate: NoAction, map: "allsizetop_user_id_fk")
}
model MySize {
id Int @id @unique @default(autoincrement())
userId Int @unique @default(autoincrement())
topLength Int?
shoulder Int?
chest Int?
isWidthOfTop Boolean?
bottomLength Int?
waist Int?
thigh Int?
rise Int?
hem Int?
isWidthOfBottom Boolean?
}
model Category {
id Int @id @unique @default(autoincrement())
categoryName String? @db.VarChar(20)
isPinCategory Boolean?
image String[] @db.VarChar
userId Int @default(autoincrement())
AllCloset_Category AllCloset_Category[]
User User @relation(fields: [userId], references: [id], onDelete: NoAction, onUpdate: NoAction, map: "category_user_id_fk")
}
model AllCloset_Category {
id Int @id @unique @default(autoincrement())
productId Int @default(autoincrement())
categoryId Int @default(autoincrement())
isInPin Boolean?
AllCloset AllCloset @relation(fields: [productId], references: [id], onDelete: NoAction, onUpdate: NoAction, map: "allcloset_category_allcloset_id_fk")
Category Category @relation(fields: [categoryId], references: [id], onDelete: NoAction, onUpdate: NoAction, map: "allcloset_category_category_id_fk")
}
model Recommend {
id Int @id @unique @default(autoincrement())
userId Int @default(autoincrement())
url String? @db.VarChar(200)
recommendSize String? @db.VarChar(10)
topItemId Int?
bottomItemId Int?
User User @relation(fields: [userId], references: [id], onDelete: NoAction, onUpdate: NoAction, map: "recommend_user_id_fk")
}
{
"name": "Server",
"version": "1.0.0",
"main": "index.js",
"repository": "https://github.com/OWN-SIZE/Server.git",
"author": "ehdwoKIM <[email protected]>",
"license": "MIT",
"scripts": {
"dev": "nodemon",
"build": "tsc && node dist",
"db:pull": "npx prisma db pull",
"db:push": "npx prisma db push",
"generate": "npx prisma generate"
},
"dependencies": {
"@prisma/client": "^4.6.1",
"bcryptjs": "^2.4.3",
"express": "^4.18.2",
"express-validator": "^6.14.2",
"prisma": "^4.6.1",
"typescript": "^4.9.3"
},
"devDependencies": {
"@types/bcryptjs": "^2.4.2",
"@types/express": "^4.17.14",
"@types/express-validator": "^3.0.0",
"@types/node": "^18.11.9",
"nodemon": "^2.0.20",
"ts-node": "^10.9.1"
}
}
- 개발 환경 : Typescript, Express(Node.js)
- 데이터베이스 : PostgreSQL, AWS S3
- 서버 환경 : AWS EC2, PM2