kt-event-marketing-fe/USER_API_CHANGES.md
cherry2250 974961e1bd 이벤트 목록 Mock 데이터 적용 및 Participation API 연동
- 이벤트 목록 페이지에 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>
2025-10-30 20:17:09 +09:00

7.3 KiB

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

📋 주요 변경사항 요약

userId 및 storeId 타입 변경: numberstring (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:

interface LoginResponse {
  token: string;
  userId: number;
  userName: string;
  role: string;
  email: string;
}

After:

interface LoginResponse {
  token: string;
  userId: string; // UUID format
  userName: string;
  role: string;
  email: string;
}

RegisterResponse

Before:

interface RegisterResponse {
  token: string;
  userId: number;
  userName: string;
  storeId: number;
  storeName: string;
}

After:

interface RegisterResponse {
  token: string;
  userId: string; // UUID format
  userName: string;
  storeId: string; // UUID format
  storeName: string;
}

ProfileResponse

Before:

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:

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:

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

After:

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: numberstring
    • RegisterResponse.userId: numberstring
    • RegisterResponse.storeId: numberstring
    • ProfileResponse.userId: numberstring
    • ProfileResponse.storeId: numberstring
    • User.userId: numberstring
    • User.storeId: numberstring

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:

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

After:

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

회원가입 응답

Before:

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

After:

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

프로필 조회 응답

Before:

{
  "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:

{
  "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를 초기화해야 합니다:

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

2. UUID 형식

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

3. 기존 Mock 데이터

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

Before:

const mockUser = {
  userId: 1,
  storeId: 1,
  // ...
};

After:

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

4. 하위 호환성

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

마이그레이션 체크리스트

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

🔗 관련 문서


📌 변경 이유

백엔드 아키텍처 개선:

  • 분산 시스템에서 ID 충돌 방지
  • 데이터베이스 독립적인 고유 식별자
  • 보안 강화 (ID 추측 불가)
  • 마이크로서비스 간 데이터 통합 용이

UUID의 장점:

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

🔄 롤백 방법

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

  1. Git을 통한 코드 복원:

    git log --oneline  # 커밋 찾기
    git revert <commit-hash>  # 또는 특정 커밋으로 복원
    
  2. localStorage 초기화:

    localStorage.removeItem('accessToken');
    localStorage.removeItem('user');
    
  3. 개발 서버 재시작:

    npm run dev
    

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