# 회원 (User)
### [관리자] 회원 통계 조회
- **URL**: `GET /users/stats`
- **Header**: `Authorization` 필수 (ADMIN)
- **Response**: `200 OK`
### [관리자] 회원 목록 조회
- **URL**: `GET /users`
- **Header**: `Authorization` 필수 (ADMIN)
- **Query Params**:
- `page`: 페이지 번호 (기본 1)
- `limit`: 페이지당 개수 (기본 10)
- `role`: `CUSTOMER` | `SELLER` | `ADMIN` (선택)
- `searchType`: `nickname` | `email` | `phone` (선택)
- `search`: 검색어 (선택, searchType과 함께 사용)
- **Response**: `200 OK` (Paging)
### [관리자 / 본인] 회원 상세 조회
관리자는 모든 회원, 일반 회원은 본인만 조회 가능합니다.
- **URL**: `GET /users/:id`
- **Header**: `Authorization` 필수
- **Response**: `200 OK`
- **Error Codes**:
- `401`: 인증 필요
- `403`: 타인 조회 시도 (본인 또는 ADMIN만 가능)
- `USER_NOT_FOUND`: 회원 없음
### [로그인 유저] 내 프로필 수정
- **URL**: `PATCH /users/me`
- **Header**: `Authorization` 필수
- **Body** (multipart/form-data 또는 application/json):
- `nickname`: 닉네임 (선택)
- `phone`: 연락처 (선택)
- `introduction`: 자기소개 (선택, SELLER 등)
- `password`: 새 비밀번호 (선택)
- `profileImage`: 프로필 이미지 파일 (선택, multipart 시)
- **Response**: `200 OK`
- **Error Codes**:
- `NO_UPDATE_DATA`: 수정할 항목 없음
### [관리자] 회원 메모 수정
회원 상세에 대한 관리자 전용 메모를 저장/수정합니다. 상세 조회 시 `note` 필드로 내려갑니다.
- **URL**: `PATCH /users/:id/note`
- **Header**: `Authorization` 필수 (ADMIN)
- **Body**:
```json
{ "note": "메모 내용" }
note: 문자열(최대 500자) 또는 null(메모 삭제)200 OK — { "success": true, "data": { "note": "..." } }MISSING_NOTE: body에 note 미포함USER_NOT_FOUND: 회원 없음슬롯을 선택하고 포인트를 차감하여 예약을 생성합니다. (쿠폰 적용 가능)
POST /reservationsAuthorization 필수{
"slotId": "uuid",
"userCouponId": "uuid (선택)"
}
201 Created{
"success": true,
"data": { "id": "reservation_id", "status": "BOOKED", ... }
}
SLOT_NOT_FOUND: 슬롯이 없음SLOT_CLOSED: 예약 마감됨SLOT_FULL: 정원 초과INSUFFICIENT_POINTS: 포인트 잔액 부족GET /reservations/meAuthorization 필수page: 페이지 번호 (기본 1)limit: 페이지당 개수 (기본 10)status: BOOKED | CANCELED | COMPLETED (선택)200 OK (Paging)DELETE /reservations/:idAuthorization 필수{
"cancelNote": "단순 변심" // (선택)
}
200 OK수강 완료(COMPLETED)된 클래스에 대해 리뷰를 작성합니다.
POST /reviewsAuthorization 필수{
"reservationId": "uuid", // 필수
"rating": 5, // 1~5 정수
"content": "강사님이 친절해요",
"imgUrls": ["https://...", "https://..."] // 선택
}
201 CreatedDUPLICATE_REVIEW: 이미 리뷰를 작성함INVALID_STATUS: 완료된 예약이 아님GET /reviews/center/:centerIdpage, limit200 OKPG사 결제 완료 후 호출하여 충전 처리합니다.
POST /points/chargeAuthorization 필수{
"amount": 10000,
"paymentKey": "toss_payment_key",
"orderId": "order_id"
}
200 OK{
"success": true,
"data": { "pointHistory": { ... }, "balanceAfter": 15000 }
}
GET /points/meAuthorization 필수200 OK{ "success": true, "data": { "pointBalance": 5000 } }
Base path: /coupons. 모든 API는 Authorization 헤더 필수입니다.
POST /couponsAuthorization 필수 (SELLER 또는 ADMIN){
"name": "신규 가입 1000P 할인",
"discountType": "AMOUNT",
"usageValue": 1000,
"expiresAt": "2025-12-31T23:59:59.000Z"
}
name: 쿠폰 이름 (필수)discountType: AMOUNT(금액 할인) | PERCENTAGE(비율 할인)usageValue: 할인 값 (정수, 금액 또는 퍼센트)expiresAt: 만료일 (ISO 8601)201 CreatedGET /couponsAuthorization 필수200 OK (내가 발급한 쿠폰 템플릿 목록)특정 유저에게 쿠폰을 발급합니다.
POST /coupons/giveAuthorization 필수 (SELLER 또는 ADMIN){
"userId": "user_cuid",
"templateId": "template_cuid"
}
201 Created본인은 자신의 쿠폰함, 관리자는 모든 유저 쿠폰함 조회 가능.
GET /coupons/user/:userIdAuthorization 필수200 OK (해당 유저의 보유 쿠폰 목록)403: 본인 또는 ADMIN이 아닌 경우PUT /coupons/:idAuthorization 필수 (SELLER 또는 ADMIN){
"name": "수정된 쿠폰명",
"discountType": "PERCENTAGE",
"usageValue": 10,
"expiresAt": "2025-12-31T23:59:59.000Z"
}
200 OKDELETE /coupons/:idAuthorization 필수 (SELLER 또는 ADMIN)200 OK — { "success": true, "message": "쿠폰이 삭제되었습니다." }POST /auth/signup{
"email": "user@example.com",
"password": "password123",
"nickname": "헬린이",
"phone": "010-1234-5678",
"role": "CUSTOMER" // SELLER
}
POST /auth/login{ "email": "...", "password": "..." }200 OK{
"success": true,
"data": {
"accessToken": "jwt_access_token",
"refreshToken": "jwt_refresh_token",
"user": { ... }
}
}
Access Token 만료 시 호출합니다. (쿠키 기반)
POST /auth/refresh200 OK (새로운 토큰 발급)POST /auth/logout200 OK (쿠키 제거)GET /auth/meAuthorization 필수200 OK (현재 로그인 유저 정보)