mirror of
https://github.com/ktds-dg0501/kt-event-marketing-fe.git
synced 2025-12-06 12:56:24 +00:00
- 이벤트 목록 페이지에 Mock 데이터 적용 (evt_2025012301 등 4개 이벤트) - 이벤트 상세 페이지 Analytics API 임시 주석처리 (서버 이슈) - Participation API 프록시 라우트 URL 구조 수정 (/events/ 제거) - EventID localStorage 저장 기능 추가 - 상세한 console.log 추가 (생성된 eventId, objective, timestamp) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
358 lines
7.3 KiB
Markdown
358 lines
7.3 KiB
Markdown
# 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
|