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: #142 이메일 인증 기능 구현 #143

Merged
merged 8 commits into from
Sep 23, 2024

Conversation

Yoonyesol
Copy link
Contributor

@Yoonyesol Yoonyesol commented Sep 20, 2024

PR Type

What kind of change does this PR introduce?

  • [Feat] 새로운 기능을 추가했어요.

Related Issues

#142 이메일 인증 기능 구현

What does this PR do?

  • 이메일 인증 네트워크 로직 작성
  • 이메일 인증 연결
    • ID 찾기
    • PW 찾기
  • MSW의 하드코딩된 이메일 인증 번호를 mockData에서 import 해오는 방식으로 변경
  • 테스트

View

이메일 인증 구현

Other information

  • 이메일 인증 코드의 일치 여부는 ID, PW 찾기 API 내부에서 확인되는 방식입니다. 인증번호가 일치하지 않을 시 서버에서는 401 에러를 반환합니다.
  • 401 에러 반환 시 유저에게 에러 발생 사실을 알려주어야 했기에, handleVerificationError 함수를 실행하도록 처리했습니다. 이 처리 때문에 현재 네트워크 코드가 지저분해 보이는데, useAxios 적용되면 수정 및 리팩토링하도록 하겠습니다.
  • 회원가입, 비밀번호 변경 전 인증 페이지의 이메일 인증은 해당 API를 작성하면서 적용하도록 하겠습니다!
  • 추가: 에러 발생을 명시할 때, 토스트 + 입력 필드 setError 두 가지를 사용하고 있는데, 너무 번잡하다면 AI 리뷰대로 둘 중 하나를 삭제해도 좋을 것 같습니다. 다른 분들의 의견은 어떤지 궁금합니다🧐

@Yoonyesol Yoonyesol added the 🌟 Feature 새로운 기능 개발했어요 label Sep 20, 2024
@Yoonyesol Yoonyesol self-assigned this Sep 20, 2024
Copy link

coderabbitai bot commented Sep 20, 2024

Walkthrough

이번 변경 사항은 이메일 인증 프로세스와 관련된 여러 컴포넌트 및 훅의 구조를 수정하고, 변수 이름을 변경하는 작업을 포함합니다. FooterLinks, SearchDataForm, SearchResultSection 등에서 변수 이름이 nav에서 navigate로 변경되었으며, 이메일 인증 관련 속성과 로직이 여러 컴포넌트에 통합되었습니다. 또한, 새로운 API 엔드포인트와 서비스 함수가 추가되어 이메일 인증 코드 요청 기능이 개선되었습니다.

Changes

파일 경로 변경 요약
src/components/user/auth-form/FooterLinks.tsx 변수 이름 navnavigate로 변경. 버튼 클릭 핸들러에서 사용되는 모든 인스턴스 수정.
src/components/user/auth-form/SearchDataForm.tsx 새로운 props 추가: isVerificationRequested, requestVerificationCode, expireVerificationCode. 이메일 인증 로직 통합.
src/components/user/auth-form/SearchResultSection.tsx 변수 이름 navnavigate로 변경. 버튼 클릭 핸들러 수정.
src/hooks/useEmailVerification.ts requestVerificationCode 함수 수정 및 verifyCode 함수 제거. 이메일 인증 요청 로직 단순화.
src/mocks/mockData.ts 새로운 상수 emailVerificationCode 추가.
src/mocks/services/authServiceHandler.ts 이메일 인증을 위한 새로운 API 엔드포인트 추가 및 코드 검증 로직 수정.
src/pages/setting/UserAuthenticatePage.tsx onSubmit 함수에서 verifyCode 호출 제거. 이메일 요청 로직 수정.
src/pages/user/SearchIdPage.tsx 이메일 인증 관련 로직 수정 및 handleVerificationError 함수 추가.
src/pages/user/SearchPasswordPage.tsx verifyCode 함수 제거 및 이메일 인증 관련 props 추가.
src/pages/user/SignUpPage.tsx onSubmit 함수에서 verifyCode 호출 제거. 이메일 요청 로직 수정.
src/services/authService.ts 새로운 비동기 함수 sendEmailCode 추가.
src/types/UserType.tsx 새로운 타입 RequestEmailCode 추가.

Possibly related PRs

Suggested labels

🎨 UI

Suggested reviewers

  • Seok93
  • ice-bear98

Poem

🐇 변화의 바람이 불어오네,
이메일 인증, 새로워지네.
클릭 한 번에 길이 열리고,
사용자 경험, 더욱 빛나리.
함께 나아가자, 새로운 길로,
우리 모두의 여정, 즐거움으로! 🌼


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.

@Yoonyesol Yoonyesol linked an issue Sep 20, 2024 that may be closed by this pull request
8 tasks
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: 5

Outside diff range and nitpick comments (2)
src/pages/user/SearchPasswordPage.tsx (1)

28-35: TODO 주석을 처리하는 데 도움이 필요하신가요?

useAxios 훅 적용 후 handleVerificationError 함수를 수정하거나 삭제해야 한다는 TODO 주석이 있습니다. 이 작업을 제가 도와드릴까요? 필요한 경우 GitHub 이슈를 생성해 드릴까요?

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

28-35: 'handleVerificationError' 함수 추가 및 TODO 처리 필요

handleVerificationError 함수를 추가하여 인증 오류를 처리하고 있습니다. 주석에 따르면 useAxios 훅 적용 후 해당 함수를 수정하거나 삭제해야 합니다.

해당 TODO 항목의 구현을 도와드릴까요? 새로운 GitHub 이슈를 생성해 드릴까요?

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 23a6fed and bf094f0.

Files selected for processing (12)
  • src/components/user/auth-form/FooterLinks.tsx (2 hunks)
  • src/components/user/auth-form/SearchDataForm.tsx (2 hunks)
  • src/components/user/auth-form/SearchResultSection.tsx (2 hunks)
  • src/hooks/useEmailVerification.ts (1 hunks)
  • src/mocks/mockData.ts (1 hunks)
  • src/mocks/services/authServiceHandler.ts (3 hunks)
  • src/pages/setting/UserAuthenticatePage.tsx (2 hunks)
  • src/pages/user/SearchIdPage.tsx (3 hunks)
  • src/pages/user/SearchPasswordPage.tsx (3 hunks)
  • src/pages/user/SignUpPage.tsx (2 hunks)
  • src/services/authService.ts (2 hunks)
  • src/types/UserType.tsx (1 hunks)
Additional comments not posted (32)
src/components/user/auth-form/SearchResultSection.tsx (2)

9-9: 좋아 보입니다!

변수명을 nav에서 navigate로 변경한 것은 코드의 가독성을 향상시킵니다. useNavigate hook을 사용하여 navigation 함수를 가져오는 것도 올바른 방법입니다.


19-19: 잘 수정되었습니다!

버튼의 onClick 핸들러에서 nav 대신 navigate 변수를 사용하도록 업데이트된 것이 보입니다. 버튼을 클릭하면 '/signin' 경로로 올바르게 이동할 것으로 보입니다.

src/types/UserType.tsx (1)

43-44: 잘 작성된 새로운 타입입니다!

새로 추가된 RequestEmailCode 타입은 User 타입에서 email 속성만 선택하여 정의되었습니다. 이 타입은 이메일 인증 코드를 요청할 때 데이터의 형태를 정의하는 데 사용될 수 있습니다. 타입 이름이 명확하고 파일의 명명 규칙을 따르고 있으며, 파일 끝에 배치되어 전체 구조를 유지하고 있습니다. 기존 타입을 보완하며 변경 사항이 없으므로 승인합니다.

src/hooks/useEmailVerification.ts (4)

2-3: LGTM!

AxiosErrorsendEmailCode를 가져오는 것은 에러 처리와 이메일 인증 코드 전송에 필요합니다. 변경 사항이 적절해 보입니다.


11-25: 잘 구현되었습니다!

requestVerificationCode 함수가 이메일 매개변수를 받도록 업데이트되었고, 비동기적으로 동작하도록 변경되었습니다. 이미 인증 요청이 이루어졌는지 확인하고, 그렇지 않은 경우 sendEmailCode를 사용하여 이메일 코드를 전송하려고 시도합니다. 성공 시 isVerificationRequested 상태를 true로 설정하고 성공 토스트 메시지를 표시합니다. 에러 발생 시 AxiosError를 구체적으로 처리하여 응답에서 에러 메시지를 표시하거나, 예상치 못한 에러에 대해 일반적인 에러 메시지를 표시합니다. 함수 로직이 올바르게 구현되었고, 에러 처리도 적절히 이루어지고 있습니다.


Line range hint 28-32: 변경 사항 없음

expireVerificationCode 함수는 변경되지 않았습니다. 인증 코드 만료 시 isVerificationRequested 상태를 false로 설정하고 적절한 에러 토스트 메시지를 표시합니다. 함수 로직이 올바르게 유지되고 있습니다.


Line range hint 34-38: 내보내는 객체 업데이트

내보내는 반환 객체가 verifyCode 함수를 제외하도록 업데이트되었습니다. 이제 isVerificationRequested, requestVerificationCode, expireVerificationCode를 포함합니다. 이는 훅의 변경 사항과 일치하며, 더 이상 사용되지 않는 verifyCode 함수를 제거했습니다. 필요한 함수와 상태는 여전히 내보내져 사용할 수 있습니다.

src/components/user/auth-form/FooterLinks.tsx (3)

35-35: 좋습니다!

nav에서 navigate로 변수 이름을 변경한 것은 코드의 가독성과 명확성을 향상시킵니다. 또한 useNavigate 훅을 사용하여 React Router에서 탐색 기능을 얻는 것이 올바른 방법입니다.


42-42: 잘 수정되었습니다!

버튼 클릭 핸들러에서 nav 대신 navigate 함수를 사용하도록 업데이트한 것은 변수 이름 변경과 일관성이 있습니다. 또한 navigate 함수에 link.path를 인수로 전달하여 지정된 경로로의 탐색을 올바르게 처리합니다.


51-51: 잘 수정되었습니다!

회원가입 버튼에서 nav 대신 navigate 함수를 사용하도록 수정한 것은 변수 이름 변경과 일관성이 있습니다. 또한 /signup 경로를 navigate 함수에 전달하여 회원가입 페이지로의 탐색을 올바르게 처리합니다.

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

9-9: 좋아 보입니다!

useEmailVerification 훅에서 필요한 속성들을 잘 가져왔습니다. 속성 이름도 명확하고 이해하기 쉽네요.


54-54: 잘 수정되었습니다!

requestVerificationCode 호출을 handleSubmit으로 감싸고 watch 메서드를 사용하여 이메일을 가져오도록 변경한 것은 좋은 선택입니다. 이렇게 하면 버튼 클릭 시 폼 유효성 검사를 거치고 최신 이메일 값을 사용하여 인증 코드 요청을 보낼 수 있습니다. 이는 인증 코드 요청의 신뢰성을 향상시키는 데 도움이 됩니다.

src/components/user/auth-form/SearchDataForm.tsx (7)

6-6: LGTM!

SearchPasswordForm 타입을 올바르게 import 하였습니다.


10-12: LGTM!

이메일 인증 기능과 관련된 새로운 prop 타입들이 SearchDataFormProps에 올바르게 추가되었습니다.


15-20: LGTM!

SearchDataForm 컴포넌트의 prop destructuring이 새로운 이메일 인증 관련 prop들을 포함하도록 올바르게 업데이트되었습니다.


24-26: LGTM!

useFormContext hook에서 watch를 올바르게 destructure하고, generic 타입을 SearchPasswordForm으로 업데이트하였습니다.


34-34: LGTM!

아이디 입력 필드의 ValidationInput 컴포넌트에 전달되는 errors prop을 올바르게 업데이트하였습니다.


42-42: LGTM!

이메일 입력 필드의 ValidationInput 컴포넌트에 전달되는 errors prop을 올바르게 업데이트하였습니다.


Line range hint 50-60: LGTM!

인증번호 입력 필드의 ValidationInput 컴포넌트에 전달되는 errors prop을 올바르게 업데이트하였습니다.

또한, VerificationButton 컴포넌트의 requestCode prop을 watch에서 얻은 이메일 값으로 requestVerificationCode를 호출하도록 업데이트하였습니다.

src/services/authService.ts (1)

75-86: 잘 구현되었습니다!

이메일 인증 코드를 전송하는 sendEmailCode 함수가 잘 구현되었습니다. 함수의 목적과 매개변수가 JSDoc 주석으로 명확하게 문서화되어 있고, authAxios 인스턴스를 사용하여 인증이 필요한 POST 요청을 보내고 있습니다. 함수는 Axios 응답을 resolve하는 프로미스를 반환합니다.

이 함수는 이메일 인증 기능의 핵심 부분으로, 기존 코드와 잘 통합되어 있으며 확립된 패턴과 규칙을 따르고 있습니다. 전반적으로 코드 변경 사항이 잘 구현되었습니다.

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

4-4: 좋습니다!

emailVerificationCode@mocks/mockData에서 가져오는 것은 모듈의 공개 인터페이스에 포함시키는 적절한 방법입니다.


115-124: 잘 구현되었습니다!

이메일 인증을 위한 새로운 API 엔드포인트가 적절하게 구현되었습니다. 주요 사항은 다음과 같습니다:

  • 제공된 이메일이 미리 정의된 더미 이메일과 일치하는지 올바르게 검증합니다.
  • 이메일이 일치하지 않는 경우, 사용자에게 이메일 확인을 요청하는 명확한 오류 메시지와 함께 400 상태를 반환합니다.
  • 이메일이 유효한 경우, 콘텐츠 없이 200 상태를 반환하는 것이 적절합니다.

전반적으로 이메일 인증 엔드포인트의 구현이 잘 이루어졌습니다.


130-130: 좋은 개선이에요!

이메일 인증 코드 검증 로직을 하드코딩된 값('1234') 대신 emailVerificationCode 변수를 사용하도록 변경한 것은 좋은 개선입니다. 이는 다음과 같은 이점이 있습니다:

  • 필요한 경우 인증 코드를 쉽게 변경할 수 있어 유지 관리와 유연성이 향상됩니다.
  • 모의 데이터에서 emailVerificationCode를 가져오는 것과 일관성이 있습니다.

이 변경은 코드의 가독성과 유지 관리성을 높이는 좋은 실천입니다.


150-150: 일관성 있는 개선이 이루어졌네요!

비밀번호 찾기 API 엔드포인트에서도 이메일 인증 코드 검증 로직이 emailVerificationCode 변수를 사용하도록 업데이트되었습니다. 이는 이전 변경사항과 일관성이 있으며, 다음과 같은 장점이 있습니다:

  • 하드코딩된 값 대신 변수를 사용하여 유지 관리와 유연성이 향상됩니다.
  • 모의 데이터에서 emailVerificationCode를 가져오는 것과 일관성이 있습니다.
  • 서로 다른 API 엔드포인트에서 이메일 코드 검증의 일관성을 보장합니다.

이러한 변경은 코드베이스 전반에 걸쳐 모범 사례를 적용하고 있음을 보여줍니다.

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

16-16: LGTM!

useEmailVerification 훅에서 이메일 인증 관련 상태와 함수를 잘 가져왔네요. 이 프로퍼티들은 이메일 인증 프로세스를 관리하는 데 사용될 것 같아요.


150-150: 폼 상태에서 이메일을 가져오도록 변경한 것이 좋아요!

이전에는 handleSubmit 메서드를 직접 전달했는데, 이제는 인라인 함수를 사용하여 폼 상태에서 이메일을 가져오도록 변경했네요. 이렇게 하면 항상 최신 이메일 값을 사용하여 인증 요청을 보낼 수 있어요. 인증 프로세스의 신뢰성이 향상될 거예요.

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

10-10: 이메일 인증 훅을 올바르게 가져왔습니다

코드에서 useEmailVerification 훅을 정확하게 임포트했습니다.


16-16: 이메일 인증 훅의 상태와 함수를 올바르게 사용했습니다

useEmailVerification 훅에서 필요한 상태와 함수를 정확하게 디스트럭처링하여 가져왔습니다.


26-26: 폼 메서드를 올바르게 디스트럭처링했습니다

폼 전송 및 에러 처리를 위해 handleSubmit, setError, setValue를 정확하게 가져왔습니다.

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

11-11: 'useEmailVerification' 훅 import 추가 확인

훅을 올바르게 import하였습니다.


25-26: 'useEmailVerification' 훅에서 필요한 값 추출

isVerificationRequested, requestVerificationCode, expireVerificationCode를 훅에서 성공적으로 추출하였습니다.


64-71: 'SearchDataForm' 컴포넌트에 새로운 props 전달 확인 필요

SearchDataForm 컴포넌트에 새로운 props인 isVerificationRequested, requestVerificationCode, expireVerificationCode를 전달하고 있습니다. 해당 컴포넌트에서 이 props들을 올바르게 수신하고 사용하는지 확인해 주세요.

다음 스크립트를 실행하여 SearchDataForm 컴포넌트가 이 props들을 수신하는지 확인할 수 있습니다:

Verification successful

새로운 props가 SearchDataForm 컴포넌트에서 올바르게 수신 및 사용됨을 확인

SearchDataForm 컴포넌트가 isVerificationRequested, requestVerificationCode, expireVerificationCode props를 올바르게 수신하고 사용하고 있음을 확인했습니다. 구체적으로:

  • isVerificationRequested는 조건부 렌더링에 사용됩니다.
  • requestVerificationCodeVerificationButton 컴포넌트에 전달되어 사용됩니다.
  • expireVerificationCodeVerificationButton 컴포넌트에 전달됩니다.

따라서 SearchIdPage.tsx에서 전달된 props들이 SearchDataForm 컴포넌트에서 예상대로 처리되고 있습니다.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: SearchDataForm 컴포넌트에서 새로운 props를 수신하는지 확인

# 기대 결과: 컴포넌트가 해당 props를 구조 분해 할당하고 있어야 합니다.
ast-grep --lang tsx --pattern $'function SearchDataForm({ formType, isVerificationRequested, requestVerificationCode, expireVerificationCode, $$$ }) { $$$ }'

Length of output: 4515

src/mocks/mockData.ts Show resolved Hide resolved
src/pages/user/SearchPasswordPage.tsx Show resolved Hide resolved
src/pages/user/SearchPasswordPage.tsx Outdated Show resolved Hide resolved
src/pages/user/SearchIdPage.tsx Show resolved Hide resolved
Seok93
Seok93 previously approved these changes Sep 23, 2024
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.

고생하셨습니다. ai가 말한 부분만 수정하면 괜찮을 것 같아요!

@Yoonyesol
Copy link
Contributor Author

@Seok93 리뷰 감사합니다😊

@Yoonyesol
Copy link
Contributor Author

coderabbitai가 리뷰 해준 내용 중, 네트워크 구현 쪽을 제외하고는 수정을 완료했습니다. 인증 에러 발생 시 오류는 토스트를 제거하고, 입력 필드에만 표시하도록 변경했습니다. 확인 후 리뷰 부탁드립니다!

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.

수정하느라 고생하셨습니다!

Copy link
Contributor

@ice-bear98 ice-bear98 left a comment

Choose a reason for hiding this comment

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

이메일 인증 기능 구현 고생하셨습니다! 작업에 불이 붙으셨네요 ㅎㅎ

@Yoonyesol
Copy link
Contributor Author

@Seok93 @ice-bear98 리뷰 감사합니다!! 마감일까지 더 열심히 해보겠습니다...😂👍

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.

이메일 인증 기능 구현
3 participants