© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
API 데이터 셋 (참고 금지) 소셜 계정으로 회원가입 할 수 있다 (닉네임은 백에서 랜덤) 네이버 로그인 API 수집 항목 소셜 회원가입
소셜 로그인 할 수 있다 소셜 로그인
사용자 정보
메인 페이지에서 매칭 현황과 OTT 목록을 볼 수 있다 캐루셀에 대한 요청과 응답
전체 서비스 보기에 대한 요청과 응답
네비게이션바를 통해 OTT 목록을 볼 수 있다 파티 목록을 볼 수 있다
파티목록에서 파티 상세 정보를 확인할 수 있다 파티에 참여할 수 있다 파티 참여하기 버튼
파티에 참여하기
마이페이지를 확인할 수 있다 사용자 정보를 확인할 수 있다
참여중인 파티 목록을 확인할 수 있다
참여한 파티 상세 정보를 확인할 수 있다 참여 파티 상세 정보
공유 계정
파티를 만들 수 있다
포인트를 충전할 수 있다 로그아웃 할 수 있다 프론트에서 토큰 지우면 끝! 네이버 API를 통해 로그인할 경우 네이버로만 로그아웃 가능하다고 합니다 유저 정보를 가져올 수 있다
OTT 정보를 가져올 수 있다
메인(도르) OTT 목록 GET
Response OTTServiceSummary 서비스 파티목록(도르) 파티만들기(젠) 파티 만들기 POST _party_create
Request Header Request Body Response 파티참여하기(젠) 파티 참여하기 GET
Response POST _join_create
Request Header Request Body Response 로그인(낸시)
마이페이지(코비) 마이 파티 상세(코비) 포인트 충전
// 응답
Status Code : 200
{
"token" : "sdfsdf.sdfsdf.sdf",
"user" : {
"userId" : 1,
"username" : "닉네임",
"birthdate" : "1997-04-13",
}
}
// 나이 때문에 회원가입 실패
Status Code : 400
{
"error" : "AGE_VALIDATION_ERROR"
}
// 응답
Status Code : 200
{
"token" : "sdfsdf.sdfsdf.sdf",
"user" : {
"userId" : 1,
"username" : "유저이름",
"birthdate" : "1997-04-13",
}
}
// 응답
{
"matchingCarosel" : [ // 매칭 대기중인 것만, 대기인원 순으로
"matching" : {
"ottId" : 1,
"ottName" : "넷플릭스",
"waiting" : 10, // 대기인원
"MonthlyFee" : 2800
},
"matching" : {
"ottId" : 1,
"ottName" : "넷플릭스",
"waiting" : 10, // 대기인원
"MonthlyFee" : 2800
},
"matching" : {
"ottId" : 1,
"ottName" : "넷플릭스",
"waiting" : 10, // 대기인원
"MonthlyFee" : 2800
}
]
}
// 응답
{
"ottServices" : [
"ott" : {
"ottId" : 1,
"ottName" : "넷플릭스"
},
"ott" : {
"ottId" : 2,
"ottName" : "디즈니 플러스"
},
"ott" : {
"ottId" : 3,
"ottName" : "웨이브"
},
"ott" : {
"ottId" : 4,
"ottName" : "넷플릭스"
}
]
}
// 응답
{
"ottServices" : [
"ott" : {
"ottId" : 1,
"ottName" : "넷플릭스"
},
"ott" : {
"ottId" : 1,
"ottName" : "넷플릭스"
},
"ott" : {
"ottId" : 1,
"ottName" : "넷플릭스"
},
"ott" : {
"ottId" : 1,
"ottName" : "넷플릭스"
}
]
}
// 요청
GET /parties/?ottId={{ottId}}&size=5&lastPartyId=1
// 응답
{
"ottId": String,
"ottName": String,
"parties": [
"party" : {
"partyId": Number,
"grade": String,
"price": Number
"totalMember": Number,
"currentMember" : Number,
"startDate": String,
"startsIn" : Number,
"endDate": String,
"mustFilled": Boolean,
},
"party" : {
"partyId": Number,
"grade": String,
"price": Number
"totalMember": Number,
"currentMember" : Number,
"startDate": String,
"endDate": String,
"mustFilled": Boolean,
},
"party" : {
"partyId": Number,
"grade": String,
"price": Number
"totalMember": Number,
"currentMember" : Number,
"startDate": String,
"startsIn" : Number,
"endDate": String,
"mustFilled": Boolean,
},
"party" : {
"partyId": Number,
"grade": String,
"price": Number
"totalMember": Number,
"currentMember" : Number,
"startDate": String,
"startsIn" : Number,
"endDate": String,
"mustFilled": Boolean,
},
"party" : {
"partyId": Number,
"grade": String,
"price": Number
"totalMember": Number,
"currentMember" : Number,
"startDate": String,
"startsIn" : Number,
"endDate": String,
"mustFilled": Boolean,
}
]
}
// 요청
GET .../parties/{partyId}
// 응답
{
"partyId": Number,
"grade": String,
"monthlyFee": Number,
"totalFee" : Number,
"totalMember": Number,
"currentMember" : Number,
"startDate": String,
"startsIn" : Number,
"endDate": String,
"mustFilled": Boolean,
"Members": [
"Member" : {
"userId" : 1,
"username" : "닉네임",
"isLeader" : true
}
],
"rules": [
"rule" : {
"ruleId" : 1,
"ruleName" : "1인 1회선"
},
"rule" : {
"ruleId" : 1,
"ruleName" : "1인 1회선"
}
]
}
// 요청
GET users/{userId}/points
// 헤더
Authorization : 토큰
// 응답
{
"currentPoint": Number // 현재 회원이 보유한 포인트
}
// 요청
POST /parties/{partyId}/join
{
"totalFee" : 2500
}
// 응답
// 성공
200 OK
// 실패
400 Bad Request
// 요청
GET /users/{userId}
Authroization :
// 응답
"user" : {
"userId" 1,
"username" : "닉네임",
"points" : 2000,
}
// 요청
GET /users/{userId}/parties?size=5&partyId=1&status=ON_GOING
정렬은 파티 참여일 기준
// 응답
{
"onGoingParties" : [
"party" : {
"ottId" : 1,
"ottName" : "넷플릭스",
"partyId": Number,
"startDate": String,
"endDate": String,
"isLeader": true,
"monthlyDeposit" : 10000
},
"party" : {
"ottId" : 1,
"ottName" : "넷플릭스",
"partyId": Number,
"startDate": String,
"endDate": String,
"isLeader": false,
"monthlyFee" : 2500,
"totalFee" : 10000
}
],
}
// 요청
GET /users/{userId}/parties?size=5&partyId=1&status=
정렬은 파티 참여일 기준
{
"finishedParties" : [
"party" : {
"ottId" : 1,
"ottName" : "넷플릭스",
"partyId": Number,
"startDate": String,
"endDate": String,
"isLeader": true,
"monthlyDeposit" : 10000
},
"party" : {
"ottId" : 1,
"ottName" : "넷플릭스",
"partyId": Number,
"startDate": String,
"endDate": String,
"isLeader": false,
"monthlyFee" : 2500,
"totalFee" : 10000
}
]
}
// 요청
GET /users/{userId}/parties?size=5&partyId=1&status=
정렬은 파티 참여일 기준
{
"recruitingParties" : [
"party" : {
"ottId" : 1,
"ottName" : "넷플릭스",
"partyId": Number,
"startDate": String,
"endDate": String,
"isLeader": true,
"monthlyDeposit" : 10000
},
"party" : {
"ottId" : 1,
"ottName" : "넷플릭스",
"partyId": Number,
"startDate": String,
"endDate": String,
"isLeader": false,
"monthlyFee" : 2500,
"totalFee" : 10000
}
]
}
GET /users/{userId}/parties/{partyId}
// 응답
// 파티원
200 OK
{
"ottId" : 1,
"ottName" : "넷플릭스",
"partyId": Number,
"grade": String,
"monthlyFee": Number,
"totalFee" : Number,
"totalMember": Number,
"currentMember" : Number,
"startDate": String,
"startsIn" : Number,
"endDate": String,
"mustFilled": Boolean,
"members": [
"member" : {
"userId" : 1,
"username" : "닉네임",
"isLeader" : true
}
],
"rules": [
"rule" : {
"ruleId" : 1,
"ruleName" : "1인 1회선"
},
"rule" : {
"ruleId" : 1,
"ruleName" : "1인 1회선"
}
]
}
// 파티장
200 OK
{
"ottId" : 1,
"ottName" : "넷플릭스",
"partyId": Number,
"grade": String,
"monthlyDeposit": Number,
"totalMember": Number,
"currentMember" : Number,
"startDate": String
"endDate": String,
"mustFilled": Boolean,
"members": [
"member" : {
"userId" : 1,
"username" : "닉네임",
"isLeader" : true
}
],
"rules": [
"rule" : {
"ruleId" : 1,
"ruleName" : "1인 1회선"
},
"rule" : {
"ruleId" : 1,
"ruleName" : "1인 1회선"
}
]
}
// 요청
GET parties/{partyId}/sharedAccount
Authorization
// 응답
{
"sharedId" : "modi@gmail.com",
"sharedPassword" : "modimodi123"
}
// 요청
POST /parties
{
"ottId" : 1,
"ottName" : "넷플릭스",
"grade": String,
"monthlyDeposit": Number,
"totalMember": Number,
"startDate": String,
"endDate": String,
"mustFilled": Boolean,
"rules": [
"rule" : {
"ruleId" : 1,
"ruleName" : "1인 1회선"
},
"rule" : {
"ruleId" : 1,
"ruleName" : "1인 1회선"
}
],
"sharedId" : "modi@gmail.com",
"sharedPassword" : "modimodi123"
}
// 응답
200 OK
{
"partyId" : 1
}
// 요청
POST /points/add
{
"points" : 100000
}
// 응답
200
{
"currentPoints": 1200000000
}
// 요청
GET /users/{userId}
Authroization :
// 응답
"user" : {
"userId" 1,
"username" : "닉네임",
"points" : 2000,
}
// 응답
{
"ottId" : 1,
"ottName" : "넷플릭스",
"subscriptionFee" : 10000,
"maxMember" : 4,
"grade" : "프리미엄"
}
{
"_id": String, // service의 고유 Id
"name": String, // seervice의 이름(Id랑 둘 다 필요할까??)
"recruitingParties": Party[], // 파티 수만 필요한데 전부 받을 필요 있을까?
"image": String // 로고 이미지 URL
}
{
"_id": String,
"name": String,
"image": String,
"recruitingParties": Party[], // 무한스크롤이나 더보기 버튼 선택시 데이터 5개 추가
"mustFilled": Boolean, // 반드시 모집되어야 하는가
}
{
"_id": String,
"grade": String,
"price": Number
"countRequiredMember": Number,
"startDate": Date | String | Number,
"endDate": Date | String | Number,
"Member": User[],
"rules": String[]
}
{
"Authorization": // 어떻게 할까요?
}
{
"service": String, // OTT 서비스 종류
"startDate": Date | String | Number, // 파티 시작 일자
"endDate": Date | String | Number, // 파티 종료 일자
"rules": String[], // 파티 규칙
"memberQuantity": Number, // 파티원 수
"mustFilled": Boolean, // 파티인원이 다 모집되지 않아도 파티를 시작할지 여부
"sharedAccount": {
"sharedId": String, // OTT서비스 ID
"sharedPw": String, // OTT서비스 PW
},
"userId": String, // 파티를 만든 회원의 id
}
Party[]
{
"currentPoint": Number, // 현재 회원이 보유한 포인트
}
{
"Authorization": // 어떻게 할까요?
}
{
"_id": String, // 파티 고유 id
"userId": String, // 파티에 참여하고자 하는 회원 id
}
{
"_id": String, // 사용자 고유 아이디
"parties": Party[], // 사용자 파티 목록
"currentPoint": Number, // 보유 포인트
}
{
"_id": String, // 파티 고유 id
"service": String // ott 서비스 이름
"grade": String, // ott 서비스 플랜명
"price": Number // ott 서비스 가격
"startDate": Date | String | Number, // 파티 시작일
"endDate": Date | String | Number, // 파티 종료일
"leader": Boolean // 파티장 여부
}
{
"_id": String, // 파티 고유 id
"grade": String, // ott 서비스 플랜명
"price": Number, // ott 서비스 가격
"countRequiredMember": Number, //
"startDate": Date | String | Number,
"endDate": Date | String | Number,
"Member": User[],
"rules": String[],
}
{
"_id": String, // 파티 고유 id
"sharedAccount": {
"sharedId": String,
"sharedPw": String,
}
}