Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat: #146 비밀번호 변경 전 인증 페이지의 인증 로직 구현 #162

Merged
merged 9 commits into from
Sep 27, 2024

Conversation

Yoonyesol
Copy link
Contributor

@Yoonyesol Yoonyesol commented Sep 25, 2024

PR Type

What kind of change does this PR introduce?

  • [Fix] 버그를 수정했어요.
  • [Formatting] 코드 스타일 업데이트를 했어요(포맷팅, 변수명 변경 etc)
  • [Feat] 새로운 기능을 추가했어요.

Related Issues

#146 비밀번호 변경 전 인증 페이지의 인증 로직 구현

What does this PR do?

  • 인증 페이지의 이메일 인증 로직 구현
  • 이메일 인증 정보를 Zustand에 지정된 시간 동안 저장
    • 인증 정보가 만료되지 않았을 시, 비밀번호 변경 페이지에 접근 가능
    • 인증 정보 만료 시, 인증 페이지로 리다이렉션
  • 이메일 인증 코드 변수명을 code -> verificationCode로 변경
  • authAxios를 사용하는 API에서 401에러 코드를 응답으로 받았을 때 로그인 화면으로 강제 이동하는 에러 수정

Other information

리다이렉션
만료시간을 6초로 설정한 뒤 테스트해보았습니다.

Other information

  • 아직 이메일 인증 확인 API가 만들어지지 않은 상태라 임의로 엔드포인트와 응답을 설정해서 기능을 구현했습니다.
  • 새로고침 시 이메일 인증이 초기화되는 문제는 추후 새로고침 시 isAuthenticated 변수가 초기화되는 문제와 함께 따로 구현해 PR 올리도록 하겠습니다.
  • authAxios를 사용하는 API가 401에러 코드를 응답으로 받으면, 리프레시 토큰 오류로 처리되어서 강제로 로그인 화면으로 이동하는 에러가 있었습니다. 해당 에러를 수정하기 위해 리프레시 토큰 만료 시 오류메시지를 체크하도록 설정해 놓았는데, 이 부분은 나중에 에러 핸들링 구현이 어느 정도 완료되면 조금 더 명확한 방식으로 에러 체킹을 하도록 변경하겠습니다.

@Yoonyesol Yoonyesol added the 🌟 Feature 새로운 기능 개발했어요 label Sep 25, 2024
@Yoonyesol Yoonyesol self-assigned this Sep 25, 2024
@Yoonyesol Yoonyesol linked an issue Sep 25, 2024 that may be closed by this pull request
4 tasks
Copy link

coderabbitai bot commented Sep 25, 2024

Walkthrough

이번 변경 사항은 사용자 인증 및 이메일 인증 프로세스를 개선하기 위해 여러 파일에서 수정이 이루어졌습니다. AUTH_SETTINGS 객체에 새로운 속성 VERIFIED_EXPIRATION이 추가되었으며, 이메일 인증 코드와 관련된 상수 및 함수의 이름이 변경되었습니다. 사용자 인증 페이지와 비밀번호 설정 페이지에서 인증 상태를 확인하는 로직이 추가되었고, 여러 컴포넌트에서 코드의 일관성을 위해 code 필드가 verificationCode로 변경되었습니다.

Changes

파일 경로 변경 요약
src/constants/settings.ts AUTH_SETTINGS 객체에 VERIFIED_EXPIRATION 속성 추가 (값: 15 * MINUTE)
src/mocks/mockData.ts emailVerificationCode 상수를 VERIFICATION_CODE_DUMMY로 이름 변경 (값은 '1234' 유지)
src/mocks/services/authServiceHandler.ts 로그인 핸들러에서 사용자 검증 로직 수정, 이메일 코드 검증 핸들러 추가, VERIFICATION_CODE_DUMMY 사용
src/pages/setting/UserAuthenticatePage.tsx 이메일 인증 프로세스 추가, code 필드를 verificationCode로 이름 변경
src/pages/setting/UserPasswordSettingPage.tsx 컴포넌트 마운트 시 사용자 인증 상태 확인 로직 추가
src/pages/setting/UserSettingPage.tsx 사용자 정보 접근 방식 변경 (소괄호 구조 분해 할당 사용)
src/pages/user/SearchIdPage.tsx defaultValues 객체의 codeverificationCode로 이름 변경
src/pages/user/SearchPasswordPage.tsx defaultValues 객체의 codeverificationCode로 이름 변경
src/pages/user/SignUpPage.tsx defaultValues 객체의 codeverificationCode로 이름 변경
src/services/authService.ts sendEmailCode 함수의 주석 수정, checkEmailCode 함수 추가
src/services/axiosProvider.ts Axios 응답 인터셉터의 오류 처리 로직 수정
src/stores/useStore.ts AuthStore 타입에 isVerified 속성 추가, onVerifyCode 메서드 추가
src/types/UserType.tsx UserSignUpForm, EmailVerificationForm, SearchPasswordForm 타입에서 codeverificationCode로 이름 변경

Possibly related issues

Possibly related PRs

Suggested labels

🛠️ Refactor, 🎨 UI

Suggested reviewers

  • Seok93
  • ice-bear98

🐰 변화의 바람이 불어와
인증의 길을 밝혀주네
코드 이름 바뀌고,
사용자 확인이 쉬워져
모두가 안전하게,
비밀번호를 바꾸는 날을 기다리네! 🌟


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 8

🧹 Outside diff range and nitpick comments (18)
src/constants/settings.ts (1)

7-7: 변경 사항이 적절해 보입니다.

이메일 인증 만료 시간을 15분으로 설정한 것은 합리적인 선택입니다. AUTH_SETTINGS 객체 내에 VERIFIED_EXPIRATION을 추가한 것은 인증 관련 설정을 한 곳에 모아 관리하는 좋은 방법입니다.

가독성을 높이기 위해 상수에 간단한 주석을 추가하는 것이 좋을 것 같습니다. 다음과 같이 변경하는 것은 어떨까요?

-  VERIFIED_EXPIRATION: 15 * MINUTE,
+  VERIFIED_EXPIRATION: 15 * MINUTE, // 이메일 인증 만료 시간
src/pages/user/SearchPasswordPage.tsx (2)

Line range hint 43-59: onSubmit 함수 리팩토링 제안

onSubmit 함수의 구조를 개선할 수 있을 것 같습니다:

  1. try-catch 블록 내부의 로직을 별도의 함수로 추출하여 가독성을 높이세요.
  2. 에러 처리 로직을 더 세분화하여 다양한 에러 상황에 대응할 수 있도록 개선하세요.
  3. TODO 주석에 언급된 대로 useAxios 훅을 사용하여 네트워크 요청을 처리하면 코드를 더 간결하게 만들 수 있습니다.

다음과 같은 구조로 리팩토링을 고려해보세요:

const handleSearchPassword = async (data: SearchPasswordForm) => {
  const fetchData = await searchUserPassword(data);
  setTempPassword(fetchData.data.password);
};

const handleError = (error: unknown) => {
  if (error instanceof AxiosError && error.response) {
    if (error.response.status === 401) handleVerificationError();
    else if (error.response.status === 404) toastError('사용자를 찾을 수 없습니다.');
    else toastError(error.response.data.message);
  } else {
    toastError('예상치 못한 에러가 발생했습니다.');
  }
};

const onSubmit = async (data: SearchPasswordForm) => {
  setLoading(true);
  try {
    await handleSearchPassword(data);
  } catch (error) {
    handleError(error);
  } finally {
    setLoading(false);
  }
};

이렇게 리팩토링하면 각 함수의 책임이 명확해지고, 에러 처리도 더 세분화될 수 있습니다.


Line range hint 61-76: 컴포넌트 구조 개선 제안

현재 SearchPasswordPage 컴포넌트의 구조를 더 작고 집중된 컴포넌트들로 나누면 코드의 가독성과 재사용성을 높일 수 있을 것 같습니다:

  1. 폼 처리 로직을 커스텀 훅으로 추출하세요. 예: useSearchPasswordForm

  2. 로딩 스피너, 검색 결과, 검색 데이터 폼을 별도의 컴포넌트로 분리하세요. 예:

    • LoadingSpinner
    • SearchResultDisplay
    • SearchPasswordForm
  3. 메인 컴포넌트에서는 이러한 작은 컴포넌트들을 조합하여 사용하세요.

예시 구조:

export default function SearchPasswordPage() {
  const { formMethods, loading, tempPassword, handleSubmit } = useSearchPasswordForm();

  return (
    <FormProvider {...formMethods}>
      <AuthFormLayout onSubmit={handleSubmit}>
        {loading && <LoadingSpinner />}
        {!loading && tempPassword && <SearchResultDisplay password={tempPassword} />}
        {!loading && !tempPassword && <SearchPasswordForm />}
      </AuthFormLayout>
    </FormProvider>
  );
}

이렇게 구조를 개선하면 각 컴포넌트의 책임이 명확해지고, 테스트와 유지보수가 더 쉬워질 것입니다.

src/pages/user/SearchIdPage.tsx (1)

40-40: setValue 함수 호출의 변경이 적절합니다.

'code'에서 'verificationCode'로의 변경이 setValue 함수 호출에도 일관되게 적용되었습니다. 이는 폼 필드의 이름 변경과 일치하며, 값 재설정이 올바르게 이루어지도록 합니다.

오류 처리를 개선하기 위해 다음과 같은 변경을 고려해 보세요:

- setValue('verificationCode', '');
+ setValue('verificationCode', '', { shouldValidate: true });

이 변경으로 값을 재설정할 때 유효성 검사가 즉시 트리거되어, 사용자에게 더 빠른 피드백을 제공할 수 있습니다.

src/pages/setting/UserPasswordSettingPage.tsx (3)

13-13: 인증 확인 로직이 잘 구현되었습니다. 단, useEffect의 의존성 배열을 개선할 수 있습니다.

isVerified 상태와 useEffect를 사용하여 사용자 인증을 확인하고 필요시 리다이렉션하는 로직이 잘 구현되었습니다.

하지만 useEffect의 의존성 배열에 navigate 함수를 추가하는 것이 좋습니다:

useEffect(() => {
  if (!isVerified) navigate('/setting/auth', { replace: true });
}, [isVerified, navigate]);

이렇게 하면 navigate 함수가 변경될 때마다 (드물지만 가능한 시나리오) effect가 올바르게 동작하게 됩니다.

Also applies to: 25-27


30-31: 네트워크 로직 개선에 대한 TODO 주석을 작업 항목으로 만들어주세요.

현재 코드에 "useAxios 훅을 이용한 네트워크 로직으로 변경" 이라는 TODO 주석이 있습니다. 이 개선 사항을 놓치지 않도록 별도의 작업 항목(예: GitHub Issue)으로 만들어 추적하는 것이 좋겠습니다.

이렇게 하면 코드의 일관성을 유지하고 향후 유지보수를 용이하게 할 수 있습니다.

이 TODO에 대한 GitHub Issue를 생성해드릴까요?


Line range hint 30-40: 에러 처리를 더 구체적으로 개선할 수 있습니다.

현재 에러 처리 로직이 잘 구현되어 있지만, 더 구체적인 에러 메시지를 제공하면 사용자 경험을 향상시킬 수 있습니다. 예를 들어:

try {
  await updateUserPassword(submitData);
  toastSuccess('비밀번호가 변경되었습니다.');
  setTimeout(() => {
    navigate('/setting/user', { replace: true });
  }, 2000);
} catch (error) {
  if (error instanceof AxiosError) {
    switch (error.response?.status) {
      case 400:
        toastError('잘못된 요청입니다. 입력 정보를 확인해주세요.');
        break;
      case 401:
        toastError('인증에 실패했습니다. 다시 로그인해주세요.');
        // 로그인 페이지로 리다이렉션 로직 추가
        break;
      case 403:
        toastError('비밀번호 변경 권한이 없습니다.');
        break;
      default:
        toastError('서버 오류가 발생했습니다. 잠시 후 다시 시도해주세요.');
    }
  } else {
    toastError('예상치 못한 에러가 발생했습니다.');
  }
}

이렇게 하면 사용자에게 더 명확한 피드백을 제공할 수 있습니다.

src/stores/useStore.ts (2)

15-15: onVerifyCode 메서드 추가 승인 및 문서화 제안

AuthStore 타입에 onVerifyCode 메서드를 추가한 것은 적절합니다. 이는 이메일 인증 프로세스를 트리거하는 데 사용될 것으로 보입니다.

메서드의 목적과 사용 방법을 명확히 하기 위해 간단한 JSDoc 주석을 추가하는 것이 좋겠습니다. 예를 들어:

/** 이메일 인증 코드를 확인하고 사용자의 인증 상태를 업데이트합니다. */
onVerifyCode: () => void;

54-64: onVerifyCode 구현 승인 및 개선 제안

onVerifyCode 메서드의 구현이 잘 되었습니다. 인증 상태를 설정하고 일정 시간 후에 만료시키는 로직이 PR의 목적에 잘 부합합니다.

다음과 같은 작은 개선을 제안합니다:

  1. 타임아웃 ID를 저장하고 필요한 경우 취소할 수 있도록 하는 것이 좋겠습니다. 이렇게 하면 사용자가 재인증을 시도할 때 이전 타임아웃을 정리할 수 있습니다.
onVerifyCode: () => {
  let timeoutId: NodeJS.Timeout;

  set((state) => {
    // 이전 타임아웃이 있다면 취소
    if (state.verificationTimeoutId) {
      clearTimeout(state.verificationTimeoutId);
    }

    timeoutId = setTimeout(() => {
      set({ isVerified: false, verificationTimeoutId: null });
    }, AUTH_SETTINGS.VERIFIED_EXPIRATION);

    return { isVerified: true, verificationTimeoutId: timeoutId };
  });
},
  1. 인증 만료 시간을 상수로 정의하고 있는데, 이 값이 어떻게 설정되었는지 주석으로 설명하면 좋겠습니다. 특히 PR 설명에서 언급된 6초 테스트 값이 그대로 사용되고 있다면, 이를 명확히 해주세요.
src/pages/setting/UserSettingPage.tsx (3)

Line range hint 26-31: 폼 제출 로직 구현 필요

onSubmit 함수가 현재 폼 데이터를 콘솔에 로그하고 있지만, 실제 제출 로직은 구현되지 않았습니다. TODO 주석에 언급된 대로 폼 제출 로직을 구현해야 합니다.

폼 제출 로직 구현에 도움이 필요하신가요? 기본적인 구조를 제안해 드릴 수 있습니다.


6-6: 사용되지 않는 import 제거 고려

USER_INFO_DUMMY가 import되었지만 현재 코드에서 사용되지 않는 것으로 보입니다. 사용되지 않는 import는 제거하는 것이 좋습니다.

다음과 같이 수정하는 것을 고려해 보세요:

-import { USER_INFO_DUMMY } from '@mocks/mockData';

Line range hint 26-31: 에러 처리 로직 추가 권장

폼 제출 시 발생할 수 있는 에러에 대한 처리가 구현되어 있지 않습니다. 사용자 경험 향상을 위해 에러 처리 로직을 추가하는 것이 좋습니다.

다음과 같은 에러 처리 로직 추가를 고려해 보세요:

const onSubmit = async (data: EditUserInfoForm) => {
  try {
    const { username, email, profileImageName, ...filteredData } = data;
    // TODO: API 호출 로직 구현
    // const response = await api.updateUserInfo(filteredData);
    console.log('User info updated successfully');
  } catch (error) {
    console.error('Failed to update user info:', error);
    // TODO: 사용자에게 에러 메시지 표시
  }
};
src/services/authService.ts (1)

Line range hint 77-87: LGTM! 인증되지 않은 사용자를 위한 적절한 변경사항입니다.

authAxios에서 defaultAxios로의 변경은 이메일 인증 코드 전송이 인증되지 않은 사용자를 위한 것임을 명확히 합니다. 이는 일반적인 이메일 인증 흐름과 일치합니다.

함수 주석을 더 명확하게 하기 위해 다음과 같이 수정하는 것은 어떨까요?

/**
- * 이메일 인증 번호 발송 요청 API
+ * 이메일 인증 번호 발송 요청 API (인증 불필요)
 *
 * @export
 * @async
 * @param {RequestEmailCode} email - 이메일
 * @param {AxiosRequestConfig} [axiosConfig={}] - axios 요청 옵션 설정 객체
 * @returns {Promise<AxiosResponse>}
 */
src/pages/user/SignUpPage.tsx (1)

35-35: 변경 사항이 일관성 있게 적용되었습니다.

'code'에서 'verificationCode'로의 이름 변경이 onSubmit 함수 내에서도 일관되게 적용되었습니다. 이는 좋은 변경입니다.

작은 개선 사항으로, 폼 데이터를 서버로 보내기 전에 'verificationCode'의 유효성을 한 번 더 확인하는 것이 좋을 것 같습니다. 예를 들어:

if (!verificationCode) {
  return toastError('인증 코드를 입력해주세요.');
}

이렇게 하면 사용자 경험을 개선하고 불필요한 서버 요청을 줄일 수 있습니다.

Also applies to: 40-40

src/mocks/services/authServiceHandler.ts (2)

21-21: 인증 로직 개선

USER_INFO_DUMMY를 사용하여 사용자 이름과 비밀번호를 검증하는 것은 좋은 접근 방식입니다. 이는 코드의 일관성과 유지보수성을 향상시킵니다.

보안을 더욱 강화하기 위해 비밀번호 비교 시 시간 상수 비교 함수를 사용하는 것을 고려해 보세요. 예를 들어:

import { timingSafeEqual } from 'crypto';

if (username === USER_INFO_DUMMY.username && 
    timingSafeEqual(Buffer.from(password), Buffer.from(USER_INFO_DUMMY.password))) {
  // ...
}

이렇게 하면 타이밍 공격에 대한 추가적인 보호를 제공할 수 있습니다.


131-139: 이메일 인증 코드 확인 API 추가

이메일 인증 코드 확인을 위한 새로운 API 핸들러를 추가한 것은 좋은 변경사항입니다. 이는 PR의 목표인 이메일 인증 로직 구현과 일치합니다.

보안을 강화하기 위해 인증 코드 비교 시에도 시간 상수 비교를 사용하는 것이 좋습니다. 예를 들어:

import { timingSafeEqual } from 'crypto';

if (email !== USER_INFO_DUMMY.email || 
    !timingSafeEqual(Buffer.from(verificationCode), Buffer.from(VERIFICATION_CODE_DUMMY))) {
  // ...
}

이렇게 하면 타이밍 공격에 대한 추가적인 보호를 제공할 수 있습니다.

src/mocks/mockData.ts (1)

37-37: 상수 이름 변경이 적절합니다.

상수 이름을 emailVerificationCode에서 VERIFICATION_CODE_DUMMY로 변경한 것은 좋은 선택입니다. 이 변경으로 다음과 같은 이점이 있습니다:

  1. 다른 더미 데이터 상수들(예: JWT_TOKEN_DUMMY)과 일관성이 유지됩니다.
  2. 이 값이 테스트용 더미 데이터임을 명확히 나타냅니다.

더 나아가, 이 상수가 이메일 인증용이라는 것을 명확히 하기 위해 EMAIL_VERIFICATION_CODE_DUMMY로 이름을 변경하는 것을 고려해 보시는 것은 어떨까요? 이렇게 하면 상수의 목적이 더욱 명확해질 것 같습니다.

src/pages/setting/UserAuthenticatePage.tsx (1)

31-32: 인증 성공 시 사용자에게 알림 메시지를 표시해주세요

이메일 인증 코드 검증에 성공한 후, 사용자에게 인증 성공 메시지를 표시하면 더 좋은 사용자 경험을 제공할 수 있습니다. onVerifyCode() 호출 후에 성공 토스트 메시지를 추가하는 것을 고려해주세요.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 40ccd8e and 65bdd46.

📒 Files selected for processing (13)
  • src/constants/settings.ts (1 hunks)
  • src/mocks/mockData.ts (1 hunks)
  • src/mocks/services/authServiceHandler.ts (5 hunks)
  • src/pages/setting/UserAuthenticatePage.tsx (3 hunks)
  • src/pages/setting/UserPasswordSettingPage.tsx (2 hunks)
  • src/pages/setting/UserSettingPage.tsx (1 hunks)
  • src/pages/user/SearchIdPage.tsx (2 hunks)
  • src/pages/user/SearchPasswordPage.tsx (2 hunks)
  • src/pages/user/SignUpPage.tsx (3 hunks)
  • src/services/authService.ts (2 hunks)
  • src/services/axiosProvider.ts (2 hunks)
  • src/stores/useStore.ts (3 hunks)
  • src/types/UserType.tsx (2 hunks)
🧰 Additional context used
Biome
src/mocks/services/authServiceHandler.ts

[error] 118-121: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

🔇 Additional comments not posted (19)
src/types/UserType.tsx (3)

20-20: 'code'에서 'verificationCode'로의 이름 변경이 적절합니다.

'code'에서 'verificationCode'로의 이름 변경은 타입의 의도를 더 명확하게 전달합니다. 이는 코드의 가독성과 유지보수성을 향상시킵니다.


29-29: 'EmailVerificationForm' 타입에서의 일관된 이름 변경을 승인합니다.

'code'에서 'verificationCode'로의 이름 변경이 EmailVerificationForm 타입에서도 일관되게 적용되었습니다. 이는 코드베이스 전체의 일관성을 유지하는 데 도움이 됩니다.


31-31: 모든 관련 타입에서의 일관된 이름 변경을 승인합니다.

SearchPasswordForm 타입에서도 'code'가 'verificationCode'로 변경되었습니다. 이로써 모든 관련 타입(UserSignUpForm, EmailVerificationForm, SearchPasswordForm)에서 일관된 이름 변경이 이루어졌습니다. 이러한 일관된 변경은 코드의 전반적인 품질과 유지보수성을 향상시킵니다.

src/pages/user/SearchIdPage.tsx (3)

36-39: setError 함수 호출의 변경이 적절합니다.

'code'에서 'verificationCode'로의 변경이 setError 함수 호출에도 일관되게 적용되었습니다. 이는 폼 필드의 이름 변경과 일치하며, 오류 처리가 올바르게 연결되도록 보장합니다.


Line range hint 1-75: 전반적인 변경 사항이 적절합니다.

'code'에서 'verificationCode'로의 변수명 변경이 일관되게 적용되었습니다. 이러한 변경은 코드의 가독성을 향상시키고, 변수의 목적을 더 명확하게 표현합니다. 폼 관리, 오류 처리, 값 재설정 등 모든 관련 로직이 올바르게 업데이트되었습니다.

다음 사항을 고려해 보세요:

  1. 제안된 setValue 함수 호출 개선을 통해 사용자에게 더 빠른 피드백을 제공할 수 있습니다.
  2. 이메일 인증 확인 API가 아직 구현되지 않았다는 점을 고려하여, 향후 실제 API 구현 시 관련 로직을 재검토하고 필요한 경우 수정하세요.

전체적으로, 이 변경사항은 PR의 목표를 잘 달성하고 있으며, 코드 품질을 향상시키고 있습니다.


23-23: 변수명 변경이 적절합니다.

'code'에서 'verificationCode'로의 변경은 변수의 목적을 더 명확하게 표현합니다. 이는 코드의 가독성을 향상시킵니다.

다음 스크립트를 실행하여 변경된 변수명이 파일 전체에서 일관되게 사용되는지 확인하세요:

✅ Verification successful

변수명이 일관되게 변경되었습니다.

'code' 변수의 사용이 제거되고, 'verificationCode'로 모두 변경되었습니다. 변경사항이 문제없이 반영되었습니다.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# 설명: 'code'에서 'verificationCode'로의 변경이 일관되게 적용되었는지 확인합니다.

# 테스트: 'code' 변수 사용 여부 확인. 예상 결과: 'code' 변수 사용이 없어야 함.
rg '\bcode\b' src/pages/user/SearchIdPage.tsx

# 테스트: 'verificationCode' 변수 사용 확인. 예상 결과: 'verificationCode' 변수 사용이 있어야 함.
rg '\bverificationCode\b' src/pages/user/SearchIdPage.tsx

Length of output: 208

src/pages/setting/UserPasswordSettingPage.tsx (1)

1-2: import 문 변경이 적절합니다.

새로운 기능을 위해 필요한 useEffect, useNavigate, 그리고 useStore를 적절히 추가했습니다. 또한 import 문을 재정렬하여 가독성을 향상시켰습니다.

Also applies to: 8-9

src/stores/useStore.ts (1)

11-11: LGTM: isVerified 속성 추가

AuthStore 타입에 isVerified 불리언 속성을 추가한 것은 적절합니다. 이는 사용자의 이메일 인증 상태를 추적하는 데 사용될 것으로 보입니다.

src/pages/setting/UserSettingPage.tsx (2)

6-6: import 문 순서 개선

import 문의 순서를 변경하여 코드 구성이 개선되었습니다. 이는 가독성을 높이고 관련 import를 그룹화하는 데 도움이 됩니다.


11-11: 사용자 정보 접근 방식 개선

useStore에서 사용자 정보를 가져오는 방식이 개선되었습니다. 객체 구조 분해를 사용하여 코드가 더 간결해졌고, 현대적인 JavaScript 관행에 더 잘 부합합니다.

다만, 다음 사항을 고려해 보시기 바랍니다:

  1. userInfo가 undefined일 경우에 대한 처리가 필요할 수 있습니다. 옵셔널 체이닝을 사용하거나 기본값을 제공하는 것이 좋습니다.
  2. 컴포넌트가 다시 렌더링될 때마다 useStore가 호출됩니다. 성능 최적화를 위해 useMemo나 useCallback을 고려해 볼 수 있습니다.

다음 스크립트를 실행하여 useStore의 사용을 확인해 보세요:

src/services/authService.ts (1)

89-99: ⚠️ Potential issue

이메일 인증 로직이 잘 구현되었습니다. 하지만 authAxios 사용에 대해 재고해 볼 필요가 있습니다.

새로운 checkEmailCode 함수의 추가는 PR의 목적과 잘 부합합니다. 그러나 이메일 인증 과정에서 authAxios를 사용하는 것은 일반적이지 않습니다.

이메일 인증은 보통 로그인 전에 이루어지는 과정이므로, authAxios 대신 defaultAxios를 사용하는 것이 더 적절할 수 있습니다. 다음과 같이 수정하는 것을 고려해보세요:

export async function checkEmailCode(verifyForm: EmailVerificationForm, axiosConfig: AxiosRequestConfig = {}) {
-  return authAxios.post('user/verify/code', verifyForm, axiosConfig);
+  return defaultAxios.post('user/verify/code', verifyForm, axiosConfig);
}

만약 인증된 사용자만 이 기능을 사용해야 한다면, 함수 주석에 이를 명시하는 것이 좋습니다.

다음 스크립트를 실행하여 authAxios의 사용을 확인해 보세요:

이 결과를 바탕으로 authAxios의 사용이 일관되게 적용되고 있는지 확인하시기 바랍니다.

src/pages/user/SignUpPage.tsx (2)

23-23: 변경 사항이 적절합니다.

'code'에서 'verificationCode'로의 이름 변경은 필드의 목적을 더 명확하게 나타냅니다. 이는 코드의 가독성을 향상시키는 좋은 변경입니다.


Line range hint 1-160: 이메일 인증 로직 구현에 대한 확인이 필요합니다.

PR 목표에 언급된 이메일 인증 로직의 구현이 이 파일에서 직접적으로 보이지 않습니다. 'verificationCode' 필드의 추가는 좋은 시작이지만, 실제 인증 프로세스의 구현이 필요해 보입니다.

다음 사항들을 확인해 주세요:

  1. 이메일 인증 요청 및 확인을 처리하는 함수가 구현되어 있는지
  2. 인증 정보를 Zustand에 저장하는 로직이 있는지
  3. 인증 만료 시 사용자를 리다이렉트하는 로직이 구현되어 있는지

이러한 로직들이 다른 파일에 구현되어 있다면, 그 파일들을 리뷰에 포함시키는 것이 좋을 것 같습니다.

다음 스크립트를 실행하여 관련 구현을 찾아볼 수 있습니다:

#!/bin/bash
# Description: Search for email verification related implementations

# Look for email verification related functions
rg --type typescript "function.*(email|verification|authenticate)" -g '!*.test.ts'

# Look for Zustand store related to authentication
rg --type typescript "create.*Store.*auth" -g '!*.test.ts'

# Look for redirection logic related to authentication
rg --type typescript "(redirect|navigate).*auth" -g '!*.test.ts'
src/mocks/services/authServiceHandler.ts (5)

4-4: 코드 개선: 상수 도입

VERIFICATION_CODE_DUMMYUSER_INFO_DUMMY를 도입한 것은 좋은 변경사항입니다. 이는 코드의 유지보수성을 향상시키고 하드코딩을 줄이는 데 도움이 됩니다.


Line range hint 121-129: 이메일 인증 로직 개선

이메일 인증 번호 요청 API의 주석을 업데이트하고 USER_INFO_DUMMY.email을 사용하여 이메일을 검증하는 변경사항은 적절합니다. 이는 코드의 일관성을 유지하고 가독성을 향상시킵니다.

🧰 Tools
Biome

[error] 118-121: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


143-145: 사용자 이름 복구 API 개선

변수명을 code에서 verificationCode로 변경하고 VERIFICATION_CODE_DUMMY를 사용하여 인증 코드를 검증하는 변경사항은 적절합니다. 이는 코드의 일관성과 가독성을 향상시킵니다.


160-164: 비밀번호 복구 API 개선

사용자 이름 복구 API와 마찬가지로, 변수명을 code에서 verificationCode로 변경하고 VERIFICATION_CODE_DUMMY를 사용하여 인증 코드를 검증하는 변경사항은 적절합니다. 이는 코드의 일관성을 유지하고 가독성을 향상시킵니다.


118-121: 정적 분석 도구 제안 검토

Biome 정적 분석 도구가 118-121 라인에 대해 옵셔널 체이닝(optional chaining)을 사용하도록 제안했습니다. 이 변경이 필요한지 확인하기 위해 해당 코드 부분을 더 자세히 살펴볼 필요가 있습니다.

다음 스크립트를 실행하여 해당 코드 부분을 확인해 주세요:

이 결과를 바탕으로 옵셔널 체이닝 적용이 적절한지 판단할 수 있을 것입니다.

🧰 Tools
Biome

[error] 118-121: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

src/services/axiosProvider.ts (1)

9-9: Axios 타입 선언 추가 확인

axios에서 AxiosInstanceAxiosRequestConfig 타입을 가져와 타입 안전성을 높였습니다.

src/pages/user/SearchPasswordPage.tsx Show resolved Hide resolved
src/pages/user/SearchPasswordPage.tsx Show resolved Hide resolved
src/pages/user/SignUpPage.tsx Outdated Show resolved Hide resolved
src/pages/setting/UserAuthenticatePage.tsx Outdated Show resolved Hide resolved
src/pages/setting/UserAuthenticatePage.tsx Outdated Show resolved Hide resolved
src/services/axiosProvider.ts Show resolved Hide resolved
src/services/axiosProvider.ts Show resolved Hide resolved
src/services/axiosProvider.ts Show resolved Hide resolved
Copy link
Contributor

@Seok93 Seok93 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

비밀번호 변경전 인증하는 로직 확인했습니다. LGTM! 다음 기획에 반영하기로 변경되어서 이번에 못넣는게 아쉽군요 ㅎㅎ 그래도 주석만 해제하면 바로바로 붙일 수 있을 것 같네요. 고생하셨습니다!

@Yoonyesol
Copy link
Contributor Author

@Seok93 리뷰 감사합니다! 네 생각보다 주석 처리 해야 하는 영역이 적어서 수정 작업도 금방 할 수 있을 것 같아요.ㅎㅎ

@Yoonyesol Yoonyesol merged commit 5834eae into develop Sep 27, 2024
@Yoonyesol Yoonyesol deleted the feature/#146-email-auth-for-password-update-access branch September 27, 2024 15:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🌟 Feature 새로운 기능 개발했어요
Projects
None yet
Development

Successfully merging this pull request may close these issues.

비밀번호 변경 전 인증 페이지의 인증 로직 구현
2 participants