FC-DEV-FinalProject / FinalProject_2VEN_FE

데브코스 파이널프로젝트 시스메틱 2조 이븐한조 FE 리포지토리
0 stars 1 forks source link

[Feat] 로그인 기능구현(+msw) #145 #146

Closed clara-shin closed 3 days ago

clara-shin commented 3 days ago

🚀 풀 리퀘스트 제안

📋 작업 내용

// MSW와 실제 API를 구분하기 위한 baseURL 설정
export const API_BASE_URL =
  import.meta.env.VITE_ENABLE_MSW === 'true'
    ? '' // MSW 사용 시 빈 문자열
    : import.meta.env.VITE_BASE_URL;

export const apiClient = axios.create({
  baseURL: API_BASE_URL,
});
// API endpoint를 상수로 사용할 때
apiClient.post(MOCK_API_ENDPOINTS.AUTH.LOGIN, credentials)
// → https://2ven.shop/api/mock/members/login 으로 요청됨 (잘못된 경우)

// 상대 경로로 직접 사용할 때
apiClient.post('/api/members/login', credentials)
// → http://localhost:3000/api/members/login 으로 요청됨 (올바른 경우)

✅ MSW는 브라우저에서 작동하며, 현재 도메인(localhost:3000)에 대한 요청만 가로챌 수 있음

// api/apiEndpoints.ts
export const API_ENDPOINTS = {
  AUTH: {
    LOGIN: '/api/members/login', // 실제 API용
  }
};

// auth.ts (React Query)
export const useSignin = () => {
  const { setAuth } = useAuthStore();

  return useMutation({
    mutationFn: async (credentials: SigninRequest) => {
      // 항상 상대 경로 사용 ✨
      const { data } = await apiClient.post<SigninResponse>(
        API_ENDPOINTS.AUTH.LOGIN, 
        credentials
      );
      // ... 나머지 코드
    },
  });
};

// mocks/handlers/auth.handlers.ts
export const authHandlers = [
  // MSW 핸들러도 동일한 경로 사용
  http.post(API_ENDPOINTS.AUTH.LOGIN, async ({ request }) => {
    // ... 핸들러 로직
  }),
];
// Case 1: MSW 활성화 & 상대 경로 사용
apiClient.post('/api/members/login', data)
↓
실제 요청: http://localhost:3000/api/members/login
↓
MSW가 요청 감지 및 처리 (OK!)

// Case 2: MSW 활성화 & 전체 URL 사용
apiClient.post('https://2ven.shop/api/members/login', data)
↓
실제 요청: https://2ven.shop/api/members/login
↓
MSW가 다른 도메인 요청을 감지할 수 없음 (Error!)

✅ MSW가 활성화되어 있을 때는 baseURL을 빈 문자열로 설정하여 모든 요청이 현재 도메인(localhost:3000)으로 가도록 함 ✅ _✨APIENDPOINTS만 사용✨ -> 개발 환경에서는 MSW가 요청을 가로채서 처리하고, 프로덕션 환경에서는 실제 API로 요청이 전송

기능구현

🔧 변경 사항

주요 변경 사항을 요약해 주세요.

📸 스크린샷 (선택 사항)

수정된 화면 또는 기능을 시연할 수 있는 스크린샷을 첨부해 주세요.

📄 기타

추가적으로 전달하고 싶은 내용이나 특별한 요구 사항이 있으면 작성해 주세요.

Sourcery에 의한 요약

테스트를 위한 MSW로 로그인 기능을 구현하고, API 클라이언트를 리팩토링하여 다양한 환경을 처리하며, SignInPage에서 이메일 및 비밀번호 입력에 대한 유효성 검사를 추가합니다.

새로운 기능:

개선 사항:

테스트:

Original summary in English ## Summary by Sourcery Implement login functionality with MSW for testing, refactor API client to handle different environments, and add validation for email and password inputs on the SignInPage. New Features: - Implement login functionality with MSW for testing, including user data type specification and authStore creation. Enhancements: - Refactor API client to distinguish between MSW and real API using baseURL settings, ensuring requests are correctly routed based on environment. Tests: - Add test code for login functionality using MSW to simulate server responses.
sourcery-ai[bot] commented 3 days ago

리뷰어 가이드 by Sourcery

이 PR은 테스트를 위한 MSW(Mock Service Worker)를 사용한 로그인 기능을 구현합니다. 구현에는 사용자 인증, 폼 검증, 오류 처리 및 Zustand를 사용한 상태 관리가 포함됩니다. API 클라이언트는 환경 기반 구성을 통해 MSW와 실제 API 환경을 모두 지원하도록 수정되었습니다.

MSW를 사용한 로그인 프로세스의 시퀀스 다이어그램

sequenceDiagram
    actor User
    participant SignInPage
    participant useSignin
    participant apiClient
    participant MSW
    User->>SignInPage: 이메일과 비밀번호 입력
    SignInPage->>useSignin: useSignin 훅 호출
    useSignin->>apiClient: POST /api/members/login
    alt MSW 활성화됨
        apiClient->>MSW: 요청 가로채기
        MSW-->>apiClient: 모의 응답
    else MSW 비활성화됨
        apiClient->>RealAPI: 요청 전달
        RealAPI-->>apiClient: 실제 응답
    end
    apiClient-->>useSignin: 응답 반환
    useSignin-->>SignInPage: 응답 처리
    SignInPage-->>User: 성공 또는 오류 메시지 표시

인증 유형에 대한 업데이트된 클래스 다이어그램

classDiagram
    class User {
        +int member_id
        +string email
        +string nickname
        +UserRole role
    }
    class SigninRequest {
        +string email
        +string password
    }
    class SigninResponse {
        +string status
        +string message
        +SigninData data
    }
    class SigninData {
        +string token
        +User user
    }
    class UserRole {
        <<enumeration>>
        INVESTOR
        TRADER
        ADMIN
    }
    SigninResponse --> SigninData
    SigninData --> User
    User --> UserRole

authStore에 대한 업데이트된 클래스 다이어그램

classDiagram
    class AuthStore {
        +string token
        +User user
        +setAuth(token: string, user: User)
        +signout()
    }
    class User {
        +int member_id
        +string email
        +string nickname
        +UserRole role
    }
    AuthStore --> User

파일 수준 변경 사항

변경 사항 세부 사항 파일
폼 검증 및 오류 처리를 통한 로그인 기능 구현
  • 실시간 오류 피드백을 통한 이메일 및 비밀번호 검증 추가
  • 검증 확인을 통한 폼 제출 구현
  • 필수 필드가 비어 있을 때 로그인 버튼 비활성화 상태 추가
  • 오류 메시지 표시 및 지우기 기능 추가
src/pages/auth/SignInPage.tsx
src/utils/validation.ts
인증 API 엔드포인트 모킹을 위한 MSW 설정
  • 다양한 역할의 모의 사용자 데이터 생성
  • 인증 로직을 포함한 모의 로그인 핸들러 구현
  • API 상호작용 디버깅을 위한 로깅 추가
src/mocks/handlers/auth.handlers.ts
src/api/apiEndpoints.ts
src/mocks/mockEndpoints.ts
인증 상태 관리 구현
  • 지속성을 가진 Zustand를 사용한 인증 스토어 생성
  • 사용자 및 토큰 관리 추가
  • 인증 기반 탐색 구현
src/stores/authStore.ts
src/pages/HomePage.tsx
MSW와 실제 API 환경을 모두 지원하도록 API 클라이언트 수정
  • 환경 기반 baseURL 구성 추가
  • 인증 토큰 인터셉터 구현
  • 요청/응답 인터셉터 구조 추가
src/api/apiClient.ts
src/api/auth.ts

관련 있을 수 있는 이슈


팁 및 명령어 #### Sourcery와 상호작용하기 - **새로운 리뷰 트리거:** 풀 리퀘스트에 `@sourcery-ai review`라고 댓글을 남깁니다. - **토론 계속하기:** Sourcery의 리뷰 댓글에 직접 답글을 남깁니다. - **리뷰 댓글에서 GitHub 이슈 생성:** 리뷰 댓글에 답글을 달아 Sourcery에게 이슈 생성을 요청합니다. - **풀 리퀘스트 제목 생성:** 풀 리퀘스트 제목 어디에나 `@sourcery-ai`를 작성하여 언제든지 제목을 생성합니다. - **풀 리퀘스트 요약 생성:** 풀 리퀘스트 본문 어디에나 `@sourcery-ai summary`를 작성하여 언제든지 PR 요약을 생성합니다. 이 명령어를 사용하여 요약을 삽입할 위치를 지정할 수도 있습니다. #### 경험 맞춤화하기 [대시보드](https://app.sourcery.ai)에 접속하여: - Sourcery가 생성한 풀 리퀘스트 요약, 리뷰어 가이드 등과 같은 리뷰 기능을 활성화하거나 비활성화합니다. - 리뷰 언어를 변경합니다. - 사용자 정의 리뷰 지침을 추가, 제거 또는 편집합니다. - 기타 리뷰 설정을 조정합니다. #### 도움 받기 - 질문이나 피드백이 있는 경우 [지원 팀에 문의](mailto:support@sourcery.ai)하세요. - 자세한 가이드와 정보를 보려면 [문서](https://docs.sourcery.ai)를 방문하세요. - [X/Twitter](https://x.com/SourceryAI), [LinkedIn](https://www.linkedin.com/company/sourcery-ai/) 또는 [GitHub](https://github.com/sourcery-ai)에서 Sourcery 팀을 팔로우하여 소식을 받아보세요.
Original review guide in English ## Reviewer's Guide by Sourcery This PR implements login functionality with MSW (Mock Service Worker) for testing. The implementation includes user authentication, form validation, error handling, and state management using Zustand. The API client was modified to support both MSW and real API environments through environment-based configuration. #### Sequence diagram for login process with MSW ```mermaid sequenceDiagram actor User participant SignInPage participant useSignin participant apiClient participant MSW User->>SignInPage: Enter email and password SignInPage->>useSignin: Call useSignin hook useSignin->>apiClient: POST /api/members/login alt MSW enabled apiClient->>MSW: Intercept request MSW-->>apiClient: Mock response else MSW disabled apiClient->>RealAPI: Forward request RealAPI-->>apiClient: Real response end apiClient-->>useSignin: Return response useSignin-->>SignInPage: Handle response SignInPage-->>User: Show success or error message ``` #### Updated class diagram for authentication types ```mermaid classDiagram class User { +int member_id +string email +string nickname +UserRole role } class SigninRequest { +string email +string password } class SigninResponse { +string status +string message +SigninData data } class SigninData { +string token +User user } class UserRole { <> INVESTOR TRADER ADMIN } SigninResponse --> SigninData SigninData --> User User --> UserRole ``` #### Updated class diagram for authStore ```mermaid classDiagram class AuthStore { +string token +User user +setAuth(token: string, user: User) +signout() } class User { +int member_id +string email +string nickname +UserRole role } AuthStore --> User ``` ### File-Level Changes | Change | Details | Files | | ------ | ------- | ----- | | Implemented login functionality with form validation and error handling |
  • Added email and password validation with real-time error feedback
  • Implemented form submission with validation checks
  • Added login button disable state when required fields are empty
  • Added error message display and clearing functionality
| `src/pages/auth/SignInPage.tsx`
`src/utils/validation.ts` | | Set up MSW for mocking authentication API endpoints |
  • Created mock user data with different roles
  • Implemented mock login handler with authentication logic
  • Added logging for debugging API interactions
| `src/mocks/handlers/auth.handlers.ts`
`src/api/apiEndpoints.ts`
`src/mocks/mockEndpoints.ts` | | Implemented authentication state management |
  • Created auth store using Zustand with persistence
  • Added user and token management
  • Implemented authentication-based navigation
| `src/stores/authStore.ts`
`src/pages/HomePage.tsx` | | Modified API client to support both MSW and real API environments |
  • Added environment-based baseURL configuration
  • Implemented authentication token interceptor
  • Added request/response interceptors structure
| `src/api/apiClient.ts`
`src/api/auth.ts` | ### Possibly linked issues - **#145**: PR addresses the issue by implementing JWT-based login with MSW and API integration. ---
Tips and commands #### Interacting with Sourcery - **Trigger a new review:** Comment `@sourcery-ai review` on the pull request. - **Continue discussions:** Reply directly to Sourcery's review comments. - **Generate a GitHub issue from a review comment:** Ask Sourcery to create an issue from a review comment by replying to it. - **Generate a pull request title:** Write `@sourcery-ai` anywhere in the pull request title to generate a title at any time. - **Generate a pull request summary:** Write `@sourcery-ai summary` anywhere in the pull request body to generate a PR summary at any time. You can also use this command to specify where the summary should be inserted. #### Customizing Your Experience Access your [dashboard](https://app.sourcery.ai) to: - Enable or disable review features such as the Sourcery-generated pull request summary, the reviewer's guide, and others. - Change the review language. - Add, remove or edit custom review instructions. - Adjust other review settings. #### Getting Help - [Contact our support team](mailto:support@sourcery.ai) for questions or feedback. - Visit our [documentation](https://docs.sourcery.ai) for detailed guides and information. - Keep in touch with the Sourcery team by following us on [X/Twitter](https://x.com/SourceryAI), [LinkedIn](https://www.linkedin.com/company/sourcery-ai/) or [GitHub](https://github.com/sourcery-ai).
netlify[bot] commented 3 days ago

Deploy Preview for sysmetics ready!

Name Link
Latest commit 12632889e339e8ecf3358d6bf813b9b71961e031
Latest deploy log https://app.netlify.com/sites/sysmetics/deploys/673bb9dd0dc1a70008c0a490
Deploy Preview https://deploy-preview-146--sysmetics.netlify.app
Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify site configuration.

clara-shin commented 3 days ago
  1. 로그인 시도 ↓
  2. MSW가 요청 가로채서 처리
    • 사용자 확인
    • JWT 토큰 생성
    • 사용자 정보 준비 ↓
  3. React Query mutation 실행
    • API 요청 처리
    • 응답 데이터 받기 ↓
  4. Zustand store 업데이트
    • token과 user 정보 저장
    • localStorage에 자동 저장 (persist) ↓
  5. 컴포넌트에서 store 사용
    • useAuthStore로 user 정보 접근
    • user.role로 권한 확인 ↓
  6. API 요청시마다
    • store에서 token 가져오기
    • Authorization 헤더에 추가