# 회원가입 API 연동 가이드 ## 개요 회원가입 페이지(`/register`)가 User Service API와 연동되었습니다. ## API 스펙 ### 엔드포인트 - **URL**: `POST /api/v1/users/register` - **Base URL**: `http://20.196.65.160:8081` ### 요청 데이터 ```typescript interface RegisterRequest { name: string; // 이름 (2-50자) phoneNumber: string; // 휴대폰 번호 (010으로 시작하는 11자리 숫자) email: string; // 이메일 (최대 100자) password: string; // 비밀번호 (8-100자, 영문+숫자 조합) storeName: string; // 상호명 (최대 100자) industry?: string; // 업종 (최대 50자, 선택) address: string; // 주소 (최대 255자) businessHours?: string; // 영업시간 (최대 255자, 선택) } ``` ### 요청 예시 ```json { "name": "홍길동", "phoneNumber": "01012345678", "email": "hong@example.com", "password": "password123", "storeName": "홍길동 고깃집", "industry": "restaurant", "address": "서울특별시 강남구 테헤란로 123", "businessHours": "평일 09:00-18:00, 주말 휴무" } ``` ### 응답 데이터 ```typescript interface RegisterResponse { token: string; // JWT 토큰 userId: number; // 사용자 ID userName: string; // 사용자 이름 storeId: number; // 가게 ID storeName: string; // 가게명 } ``` ## 회원가입 페이지 구조 ### 3단계 회원가입 프로세스 #### 1단계: 계정 정보 - 이메일 - 비밀번호 - 비밀번호 확인 #### 2단계: 개인 정보 - 이름 (2-50자) - 휴대폰 번호 (010-1234-5678 형식) #### 3단계: 사업장 정보 - 상호명 (2-100자) - 사업자 번호 (123-45-67890 형식) + 인증 - 업종 선택 - 음식점 (restaurant) - 카페/베이커리 (cafe) - 소매/편의점 (retail) - 미용/뷰티 (beauty) - 헬스/피트니스 (fitness) - 학원/교육 (education) - 서비스업 (service) - 기타 (other) - 주소 (최대 255자) - 영업시간 (최대 255자, 선택) - 약관 동의 - [필수] 이용약관 - [필수] 개인정보 처리방침 - [선택] 마케팅 정보 수신 ## 데이터 변환 ### 전화번호 형식 - **UI 입력**: `010-1234-5678` (하이픈 포함) - **API 전송**: `01012345678` (하이픈 제거) ```typescript const phoneNumber = formData.phone!.replace(/-/g, ''); ``` ### 업종 코드 매핑 | UI 표시 | API 값 | |---------|--------| | 음식점 | restaurant | | 카페/베이커리 | cafe | | 소매/편의점 | retail | | 미용/뷰티 | beauty | | 헬스/피트니스 | fitness | | 학원/교육 | education | | 서비스업 | service | | 기타 | other | ## 유효성 검증 ### 1단계 검증 ```typescript - 이메일: 올바른 이메일 형식 - 비밀번호: 최소 8자, 영문+숫자 조합 - 비밀번호 확인: 비밀번호와 일치 ``` ### 2단계 검증 ```typescript - 이름: 2-50자 - 휴대폰: 010-####-#### 형식 ``` ### 3단계 검증 ```typescript - 상호명: 2-100자 - 사업자 번호: ###-##-##### 형식 - 업종: 필수 선택 - 주소: 최대 255자 - 영업시간: 최대 255자 (선택) - 이용약관: 필수 동의 - 개인정보 처리방침: 필수 동의 ``` ## 회원가입 흐름 ```mermaid sequenceDiagram participant User participant UI participant Auth participant API User->>UI: 회원정보 입력 UI->>UI: 유효성 검증 UI->>Auth: registerUser(data) Auth->>API: POST /api/v1/users/register API-->>Auth: RegisterResponse Auth-->>UI: { success: true, user } UI->>UI: 토큰 저장 (localStorage) UI->>UI: 사용자 정보 저장 UI->>UI: 성공 다이얼로그 표시 User->>UI: "시작하기" 클릭 UI->>User: 메인 페이지로 이동 ``` ## 에러 처리 ### 클라이언트 에러 - 유효성 검증 실패: Toast 메시지로 첫 번째 에러 표시 - 필수 항목 누락: 해당 필드에 에러 메시지 표시 ### 서버 에러 - 네트워크 오류: "회원가입 중 오류가 발생했습니다" 메시지 - API 오류: 서버 응답 에러 메시지 또는 기본 메시지 ```typescript try { const result = await registerUser(registerData); if (result.success) { showToast('회원가입이 완료되었습니다!', 'success'); setSuccessDialogOpen(true); } else { showToast(result.error || '회원가입에 실패했습니다.', 'error'); } } catch (error) { console.error('회원가입 오류:', error); showToast('회원가입 중 오류가 발생했습니다.', 'error'); } ``` ## 회원가입 성공 후 1. **JWT 토큰 저장**: `localStorage.setItem('accessToken', token)` 2. **사용자 정보 저장**: `localStorage.setItem('user', JSON.stringify(user))` 3. **인증 상태 업데이트**: AuthContext의 `isAuthenticated: true` 4. **성공 다이얼로그 표시**: 환영 메시지 5. **메인 페이지 이동**: `/` 경로로 리다이렉트 ## 테스트 방법 ### 개발 서버 실행 ```bash npm run dev ``` ### 테스트 시나리오 #### 정상 케이스 1. `/register` 접속 2. 1단계: 이메일, 비밀번호 입력 3. 2단계: 이름, 휴대폰 번호 입력 4. 3단계: 사업장 정보 입력 및 약관 동의 5. "가입완료" 버튼 클릭 6. 성공 다이얼로그 확인 7. 메인 페이지 이동 확인 #### 에러 케이스 1. **유효성 검증 실패** - 잘못된 이메일 형식 입력 - 8자 미만 비밀번호 - 비밀번호 불일치 - 잘못된 전화번호 형식 2. **필수 항목 누락** - 이름 미입력 - 업종 미선택 - 약관 미동의 3. **API 오류 시뮬레이션** - 네트워크 연결 끊기 - 중복 이메일 사용 ## 코드 위치 - **회원가입 페이지**: `src/app/(auth)/register/page.tsx` - **인증 훅**: `src/features/auth/model/useAuth.ts` - **User API**: `src/entities/user/api/userApi.ts` - **타입 정의**: `src/entities/user/model/types.ts` ## 주의사항 1. **전화번호 형식**: UI는 하이픈 포함, API는 하이픈 제거 2. **비밀번호**: 최소 8자 이상, 영문+숫자 조합 필수 3. **이메일**: 로그인 시 사용되므로 정확한 이메일 필요 4. **토큰 관리**: 회원가입 성공 시 자동으로 로그인 처리됨 5. **사업자 번호 인증**: 현재는 클라이언트에서만 검증 (추후 API 연동 필요) ## 환경 변수 `.env.local`에 다음 환경 변수가 설정되어 있어야 합니다: ```env NEXT_PUBLIC_API_BASE_URL=http://20.196.65.160:8081 NEXT_PUBLIC_USER_HOST=http://20.196.65.160:8081 ``` ## 개선 사항 ### 현재 구현 - ✅ User API 연동 - ✅ 3단계 회원가입 프로세스 - ✅ 실시간 유효성 검증 - ✅ 자동 로그인 처리 - ✅ 성공 다이얼로그 ### 향후 개선 - ⏳ 사업자 번호 실제 API 인증 - ⏳ 이메일 중복 확인 API - ⏳ 이메일 인증 기능 - ⏳ 소셜 로그인 (카카오, 네이버 등)