작성일: 2025-12-01
버전: 1.0
상태: ✅ 구현 완료 (빌드 성공)
AKC B2C 서비스는 같은 이메일, 아이디, 전화번호로도 일반회원과 법인회원을 구분하여 등록할 수 있도록 회원 시스템을 개선했습니다.
POST /api/auth/signup/individual
요청 본문:
{
"userId": "testuser001",
"email": "user@example.com",
"password": "SecurePass123!",
"name": "홍길동",
"phone": "010-1234-5678",
"ageOver14Agreed": true,
"termsAgreed": true,
"privacyAgreed": true,
"locationPolicyAgreed": true,
"marketingEmailAgreed": true,
"marketingSmsAgreed": false,
"marketingPushAgreed": false
}
응답 (성공):
{
"success": true,
"data": {
"memberUuid": "550e8400-e29b-41d4-a716-446655440000",
"email": "user@example.com",
"name": "홍길동",
"memberType": "DIRECT"
},
"message": "일반회원 가입이 완료되었습니다"
}
HTTP Status: 200 OK
POST /api/auth/signup/corporate
요청 본문:
{
"userId": "corpuser001",
"email": "corp@example.com",
"password": "SecurePass123!",
"name": "김기업",
"phone": "010-1234-5678",
"companyName": "테스트 법인",
"businessNumber": "123-45-67890",
"businessRegistration": "<MultipartFile>",
"ageOver14Agreed": true,
"termsAgreed": true,
"privacyAgreed": true,
"locationPolicyAgreed": true,
"marketingEmailAgreed": true,
"marketingSmsAgreed": false,
"marketingPushAgreed": false
}
응답 (성공):
{
"success": true,
"data": {
"memberUuid": "550e8400-e29b-41d4-a716-446655440001",
"email": "corp@example.com",
"name": "김기업",
"memberType": "DIRECT"
},
"message": "법인회원 가입이 신청되었습니다. 승인 대기 중입니다"
}
HTTP Status: 200 OK
📌 주의:
businessNumber와 businessRegistration 필수POST /api/auth/login
요청 본문:
{
"userId": "testuser001",
"password": "SecurePass123!"
}
응답 (성공):
{
"success": true,
"data": {
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"tokenType": "Bearer",
"expiresIn": 3600,
"userInfo": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"userId": "testuser001",
"email": "user@example.com",
"name": "홍길동",
"memberType": "DIRECT",
"memberCategory": "INDIVIDUAL",
"isIndividualUser": true,
"isCorporateUser": false,
"roles": ["INDIVIDUAL_USER"]
}
}
}
HTTP Status: 200 OK
POST /api/auth/login/individual
요청 본문:
{
"userId": "testuser001",
"password": "SecurePass123!"
}
응답 (성공):
{
"success": true,
"data": {
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"tokenType": "Bearer",
"expiresIn": 3600,
"userInfo": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"userId": "testuser001",
"email": "user@example.com",
"name": "홍길동",
"memberType": "DIRECT",
"memberCategory": "INDIVIDUAL",
"isIndividualUser": true,
"isCorporateUser": false,
"roles": ["INDIVIDUAL_USER"]
},
"corporateInfo": null
}
}
HTTP Status: 200 OK
오류 응답 (법인회원으로 로그인 시도):
{
"success": false,
"data": null,
"errorCode": "UNAUTHORIZED",
"message": "아이디 또는 비밀번호가 일치하지 않습니다"
}
HTTP Status: 401 Unauthorized
POST /api/auth/login/corporate
요청 본문:
{
"userId": "corpuser001",
"password": "SecurePass123!"
}
응답 (성공):
{
"success": true,
"data": {
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"tokenType": "Bearer",
"expiresIn": 3600,
"userInfo": {
"id": "550e8400-e29b-41d4-a716-446655440001",
"userId": "corpuser001",
"email": "corp@example.com",
"name": "김기업",
"memberType": "DIRECT",
"memberCategory": "CORPORATE",
"isIndividualUser": false,
"isCorporateUser": true,
"roles": ["CORPORATE_USER"]
},
"corporateInfo": {
"companyName": "테스트 법인",
"businessNumber": "123-45-67890",
"approvalStatus": "APPROVED",
"approvalMessage": "승인되었습니다"
}
}
}
HTTP Status: 200 OK
오류 응답 (일반회원으로 로그인 시도):
{
"success": false,
"data": null,
"errorCode": "UNAUTHORIZED",
"message": "아이디 또는 비밀번호가 일치하지 않습니다"
}
HTTP Status: 401 Unauthorized
GET /api/auth/check-userid
요청 파라미터:
userId=testuser001
응답 (사용 가능):
{
"success": true,
"data": {
"available": true,
"message": "사용 가능한 아이디입니다"
}
}
응답 (중복):
{
"success": true,
"data": {
"available": false,
"message": "이미 사용중인 아이디입니다"
}
}
HTTP Status: 200 OK
GET /api/auth/check-userid/individual
요청 파라미터:
userId=testuser001
응답 (사용 가능):
{
"success": true,
"data": {
"available": true,
"message": "사용 가능한 아이디입니다"
}
}
응답 (일반회원으로 중복):
{
"success": true,
"data": {
"available": false,
"message": "이미 일반회원으로 사용중인 아이디입니다"
}
}
응답 (법인회원으로는 사용 가능):
{
"success": true,
"data": {
"available": true,
"message": "사용 가능한 아이디입니다"
}
}
HTTP Status: 200 OK
GET /api/auth/check-userid/corporate
요청 파라미터:
userId=corpuser001
응답 (사용 가능):
{
"success": true,
"data": {
"available": true,
"message": "사용 가능한 아이디입니다"
}
}
응답 (법인회원으로 중복):
{
"success": true,
"data": {
"available": false,
"message": "이미 법인회원으로 사용중인 아이디입니다"
}
}
HTTP Status: 200 OK
GET /api/auth/check-email
요청 파라미터:
email=user@example.com
응답 (사용 가능):
{
"success": true,
"data": {
"available": true,
"message": "사용 가능한 이메일입니다"
}
}
응답 (중복):
{
"success": true,
"data": {
"available": false,
"message": "이미 사용중인 이메일입니다"
}
}
HTTP Status: 200 OK
GET /api/auth/check-email/individual
요청 파라미터:
email=user@example.com
응답 (일반회원으로 사용 가능):
{
"success": true,
"data": {
"available": true,
"message": "사용 가능한 이메일입니다"
}
}
응답 (일반회원으로 중복):
{
"success": true,
"data": {
"available": false,
"message": "이미 일반회원으로 사용중인 이메일입니다"
}
}
HTTP Status: 200 OK
GET /api/auth/check-email/corporate
요청 파라미터:
email=corp@example.com
응답 (법인회원으로 사용 가능):
{
"success": true,
"data": {
"available": true,
"message": "사용 가능한 이메일입니다"
}
}
응답 (법인회원으로 중복):
{
"success": true,
"data": {
"available": false,
"message": "이미 법인회원으로 사용중인 이메일입니다"
}
}
HTTP Status: 200 OK
GET /api/auth/check-phone
요청 파라미터:
phone=010-1234-5678
응답 (사용 가능):
{
"success": true,
"data": {
"available": true,
"message": "사용 가능한 전화번호입니다"
}
}
응답 (중복):
{
"success": true,
"data": {
"available": false,
"message": "이미 등록된 전화번호입니다"
}
}
HTTP Status: 200 OK
GET /api/auth/check-phone/individual
요청 파라미터:
phone=010-1234-5678
응답 (일반회원으로 사용 가능):
{
"success": true,
"data": {
"available": true,
"message": "사용 가능한 전화번호입니다"
}
}
응답 (일반회원으로 중복):
{
"success": true,
"data": {
"available": false,
"message": "이미 일반회원으로 등록된 전화번호입니다"
}
}
HTTP Status: 200 OK
GET /api/auth/check-phone/corporate
요청 파라미터:
phone=010-1234-5678
응답 (법인회원으로 사용 가능):
{
"success": true,
"data": {
"available": true,
"message": "사용 가능한 전화번호입니다"
}
}
응답 (법인회원으로 중복):
{
"success": true,
"data": {
"available": false,
"message": "이미 법인회원으로 등록된 전화번호입니다"
}
}
HTTP Status: 200 OK
POST /api/members/individual/find-id
요청 본문:
{
"name": "홍길동",
"phoneNumber": "010-1234-5678"
}
응답 (성공):
{
"success": true,
"data": {
"maskedUserId": "te***01"
},
"message": null
}
HTTP Status: 200 OK
POST /api/members/corporate/find-id
요청 본문:
{
"businessNumber": "123-45-67890",
"phoneNumber": "010-1234-5678"
}
응답 (성공):
{
"success": true,
"data": {
"maskedUserId": "co***01",
"companyName": "테스트 법인"
},
"message": null
}
HTTP Status: 200 OK
PUT /api/members/myinfo/email
요청 헤더:
Authorization: Bearer <accessToken>
Content-Type: application/json
요청 본문:
{
"newEmail": "newemail@example.com"
}
응답 (성공):
{
"success": true,
"data": {
"email": "new***l@example.com",
"message": "이메일이 변경되었습니다"
}
}
HTTP Status: 200 OK
| 기능 | 통합 (기존) | 일반회원 (NEW) | 법인회원 (NEW) |
|---|---|---|---|
| 회원가입 | - | POST /api/auth/signup/individual |
POST /api/auth/signup/corporate |
| 로그인 | POST /api/auth/login |
POST /api/auth/login/individual |
POST /api/auth/login/corporate |
| 아이디 중복 검사 | GET /api/auth/check-userid |
GET /api/auth/check-userid/individual |
GET /api/auth/check-userid/corporate |
| 이메일 중복 검사 | GET /api/auth/check-email |
GET /api/auth/check-email/individual |
GET /api/auth/check-email/corporate |
| 전화번호 중복 검사 | GET /api/auth/check-phone |
GET /api/auth/check-phone/individual |
GET /api/auth/check-phone/corporate |
| 회원 찾기 | - | POST /api/members/individual/find-id |
POST /api/members/corporate/find-id |
| 이메일 수정 | PUT /api/members/myinfo/email |
(JWT 기반, 동일) | (JWT 기반, 동일) |
1️⃣ 일반회원 가입
POST /api/auth/signup/individual
phone: "010-1234-5678"
userId: "individual001"
→ 성공 ✅
2️⃣ 법인회원 가입 (같은 전화번호)
POST /api/auth/signup/corporate
phone: "010-1234-5678" ← 같은 전화번호
userId: "corporate001"
→ 성공 ✅ (memberCategory 다르므로 중복 아님)
일반회원이 아이디를 잊은 경우:
POST /api/members/individual/find-id
name: "홍길동"
phone: "010-1234-5678"
→ maskedUserId: "in***01" 반환
법인회원이 아이디를 잊은 경우:
POST /api/members/corporate/find-id
businessNumber: "123-45-67890"
phone: "010-1234-5678"
→ maskedUserId: "co***01", companyName 반환
통합 로그인 (기존):
POST /api/auth/login (memberCategory 구분 안 함)
분리된 로그인 (새로운):
- 일반회원 전용: POST /api/auth/login/individual
- 법인회원 전용: POST /api/auth/login/corporate
memberCategory 필드
INDIVIDUAL 또는 CORPORATE 중 하나의 카테고리를 가짐중복 검사
check-userid/individual에서 사용 가능해도 check-userid/corporate에서는 중복일 수 있음로그인 선택
법인회원 승인
businessNumber와 businessRegistration 파일 필수approvalStatus = PENDINGapprovalStatus = APPROVED → 서비스 이용 가능curl -X POST http://localhost:8089/api/auth/signup/individual \
-H "Content-Type: application/json" \
-d '{
"userId": "testuser001",
"email": "user@example.com",
"password": "SecurePass123!",
"name": "홍길동",
"phone": "010-1234-5678",
"ageOver14Agreed": true,
"termsAgreed": true,
"privacyAgreed": true,
"locationPolicyAgreed": true,
"marketingEmailAgreed": true,
"marketingSmsAgreed": false,
"marketingPushAgreed": false
}'
curl -X POST http://localhost:8089/api/auth/login/individual \
-H "Content-Type: application/json" \
-d '{
"userId": "testuser001",
"password": "SecurePass123!"
}'
curl -X GET "http://localhost:8089/api/auth/check-userid/individual?userId=testuser001"
curl -X GET "http://localhost:8089/api/auth/check-email/corporate?email=corp@example.com"
curl -X GET "http://localhost:8089/api/auth/check-phone/individual?phone=010-1234-5678"
| 버전 | 날짜 | 변경사항 |
|---|---|---|
| 1.0 | 2025-12-01 | 초기 작성 - 회원 카테고리 분리 API 문서화 |
API 관련 문의 사항이 있으시면 백엔드 팀에 연락 주시기 바랍니다.
마지막 업데이트: 2025-12-01