# User API 타입 변경사항 (2025-01-30)

## 📋 주요 변경사항 요약

### **userId 및 storeId 타입 변경: `number` → `string` (UUID)**

백엔드 API 스펙에 따라 userId와 storeId가 UUID 형식의 문자열로 변경되었습니다.

| 항목 | 기존 (Old) | 변경 (New) |
|------|-----------|-----------|
| **userId** | `number` (예: `1`) | `string` (예: `"550e8400-e29b-41d4-a716-446655440000"`) |
| **storeId** | `number` (예: `1`) | `string` (예: `"6ba7b810-9dad-11d1-80b4-00c04fd430c8"`) |

---

## 🔄 영향을 받는 인터페이스

### LoginResponse

**Before:**
```typescript
interface LoginResponse {
  token: string;
  userId: number;
  userName: string;
  role: string;
  email: string;
}
```

**After:**
```typescript
interface LoginResponse {
  token: string;
  userId: string; // UUID format
  userName: string;
  role: string;
  email: string;
}
```

### RegisterResponse

**Before:**
```typescript
interface RegisterResponse {
  token: string;
  userId: number;
  userName: string;
  storeId: number;
  storeName: string;
}
```

**After:**
```typescript
interface RegisterResponse {
  token: string;
  userId: string; // UUID format
  userName: string;
  storeId: string; // UUID format
  storeName: string;
}
```

### ProfileResponse

**Before:**
```typescript
interface ProfileResponse {
  userId: number;
  userName: string;
  phoneNumber: string;
  email: string;
  role: string;
  storeId: number;
  storeName: string;
  industry: string;
  address: string;
  businessHours: string;
  createdAt: string;
  lastLoginAt: string;
}
```

**After:**
```typescript
interface ProfileResponse {
  userId: string; // UUID format
  userName: string;
  phoneNumber: string;
  email: string;
  role: string;
  storeId: string; // UUID format
  storeName: string;
  industry: string;
  address: string;
  businessHours: string;
  createdAt: string;
  lastLoginAt: string;
}
```

### User

**Before:**
```typescript
interface User {
  userId: number;
  userName: string;
  email: string;
  role: string;
  phoneNumber?: string;
  storeId?: number;
  storeName?: string;
  industry?: string;
  address?: string;
  businessHours?: string;
}
```

**After:**
```typescript
interface User {
  userId: string; // UUID format
  userName: string;
  email: string;
  role: string;
  phoneNumber?: string;
  storeId?: string; // UUID format
  storeName?: string;
  industry?: string;
  address?: string;
  businessHours?: string;
}
```

---

## 📝 수정된 파일 목록

### 1. Type Definitions
- ✅ `src/entities/user/model/types.ts`
  - `LoginResponse.userId`: `number` → `string`
  - `RegisterResponse.userId`: `number` → `string`
  - `RegisterResponse.storeId`: `number` → `string`
  - `ProfileResponse.userId`: `number` → `string`
  - `ProfileResponse.storeId`: `number` → `string`
  - `User.userId`: `number` → `string`
  - `User.storeId`: `number` → `string`

### 2. Stores
- ✅ `src/stores/authStore.ts`
  - `User.id`: UUID 주석 추가

### 3. Components
- ✅ No changes required (타입 추론 사용)
  - `src/features/auth/model/useAuth.ts`
  - `src/app/(auth)/login/page.tsx`
  - `src/app/(auth)/register/page.tsx`

---

## 🧪 API 응답 예시

### 로그인 응답

**Before:**
```json
{
  "token": "eyJhbGciOiJIUzI1NiIs...",
  "userId": 1,
  "userName": "홍길동",
  "role": "USER",
  "email": "user@example.com"
}
```

**After:**
```json
{
  "token": "eyJhbGciOiJIUzI1NiIs...",
  "userId": "550e8400-e29b-41d4-a716-446655440000",
  "userName": "홍길동",
  "role": "USER",
  "email": "user@example.com"
}
```

### 회원가입 응답

**Before:**
```json
{
  "token": "eyJhbGciOiJIUzI1NiIs...",
  "userId": 1,
  "userName": "홍길동",
  "storeId": 1,
  "storeName": "홍길동 고깃집"
}
```

**After:**
```json
{
  "token": "eyJhbGciOiJIUzI1NiIs...",
  "userId": "550e8400-e29b-41d4-a716-446655440000",
  "userName": "홍길동",
  "storeId": "6ba7b810-9dad-11d1-80b4-00c04fd430c8",
  "storeName": "홍길동 고깃집"
}
```

### 프로필 조회 응답

**Before:**
```json
{
  "userId": 1,
  "userName": "홍길동",
  "phoneNumber": "01012345678",
  "email": "user@example.com",
  "role": "USER",
  "storeId": 1,
  "storeName": "홍길동 고깃집",
  "industry": "restaurant",
  "address": "서울특별시 강남구",
  "businessHours": "09:00-18:00",
  "createdAt": "2025-01-01T00:00:00",
  "lastLoginAt": "2025-01-10T12:00:00"
}
```

**After:**
```json
{
  "userId": "550e8400-e29b-41d4-a716-446655440000",
  "userName": "홍길동",
  "phoneNumber": "01012345678",
  "email": "user@example.com",
  "role": "USER",
  "storeId": "6ba7b810-9dad-11d1-80b4-00c04fd430c8",
  "storeName": "홍길동 고깃집",
  "industry": "restaurant",
  "address": "서울특별시 강남구",
  "businessHours": "09:00-18:00",
  "createdAt": "2025-01-01T00:00:00",
  "lastLoginAt": "2025-01-10T12:00:00"
}
```

---

## 🚨 주의사항

### 1. localStorage 초기화 필요
기존에 number 타입으로 저장된 사용자 정보가 있다면 localStorage를 초기화해야 합니다:

```javascript
// 브라우저 콘솔에서 실행
localStorage.removeItem('accessToken');
localStorage.removeItem('user');
```

### 2. UUID 형식
- UUID는 표준 UUID v4 형식입니다: `550e8400-e29b-41d4-a716-446655440000`
- 하이픈(`-`)을 포함한 36자 문자열
- 비교 시 대소문자 구분 없음 (일반적으로 소문자 사용)

### 3. 기존 Mock 데이터
기존에 number 타입으로 작성된 Mock 데이터는 UUID 문자열로 변경해야 합니다:

**Before:**
```typescript
const mockUser = {
  userId: 1,
  storeId: 1,
  // ...
};
```

**After:**
```typescript
const mockUser = {
  userId: "550e8400-e29b-41d4-a716-446655440000",
  storeId: "6ba7b810-9dad-11d1-80b4-00c04fd430c8",
  // ...
};
```

### 4. 하위 호환성
- 이전 number 타입과는 호환되지 않습니다
- 기존 세션은 모두 무효화됩니다
- 사용자는 다시 로그인해야 합니다

---

## ✅ 마이그레이션 체크리스트

- [x] TypeScript 인터페이스 업데이트
- [x] 타입 정의 파일 수정 완료
- [x] 빌드 테스트 통과
- [ ] localStorage 초기화 (사용자)
- [ ] 개발 서버 테스트 (사용자)
- [ ] 실제 API 연동 테스트 (사용자)

---

## 🔗 관련 문서

- API 문서: http://kt-event-marketing-api.20.214.196.128.nip.io/api/v1/users/swagger-ui/index.html
- OpenAPI Spec: http://kt-event-marketing-api.20.214.196.128.nip.io/api/v1/users/v3/api-docs

---

## 📌 변경 이유

**백엔드 아키텍처 개선:**
- 분산 시스템에서 ID 충돌 방지
- 데이터베이스 독립적인 고유 식별자
- 보안 강화 (ID 추측 불가)
- 마이크로서비스 간 데이터 통합 용이

**UUID의 장점:**
- 전역적으로 고유한 식별자 (Globally Unique Identifier)
- Auto-increment ID의 한계 극복
- 분산 환경에서 중앙 조정 없이 생성 가능
- 보안성 향상 (순차적 ID 노출 방지)

---

## 🔄 롤백 방법

만약 이전 버전으로 돌아가야 한다면:

1. Git을 통한 코드 복원:
   ```bash
   git log --oneline  # 커밋 찾기
   git revert <commit-hash>  # 또는 특정 커밋으로 복원
   ```

2. localStorage 초기화:
   ```javascript
   localStorage.removeItem('accessToken');
   localStorage.removeItem('user');
   ```

3. 개발 서버 재시작:
   ```bash
   npm run dev
   ```

---

**문서 작성일**: 2025-01-30
**마지막 업데이트**: 2025-01-30
**변경 적용 버전**: v1.1.0
