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: #172 소셜 회원가입/로그인 기능 구현 #191

Merged
merged 10 commits into from
Oct 9, 2024

Conversation

Yoonyesol
Copy link
Contributor

@Yoonyesol Yoonyesol commented Oct 5, 2024

PR Type

What kind of change does this PR introduce?

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

Related Issues

What does this PR do?

  • 소셜 회원가입 기능 구현
    • 카카오
    • 구글
  • 소셜 로그인 기능 구현
    • 카카오
    • 구글

View

성공
소셜로그인

실패 (msw 엔드포인트 오류)
소셜로그인 실패

Other information

간단한 설명
소셜 로그인의 로직을 간단히 말씀드리면 다음과 같습니다.

  1. client 클라이언트 측에서 공급업체(카카오/구글)에 인가코드를 요청
  2. client 공급업체 측에서 받은 인가코드를 백엔드에 전송
  3. server 백엔드는 인가 코드를 이용해 액세스 토큰을 공급업체에서 받아옴
  4. server 액세스 토큰을 이용해 공급업체에게 api 요청을 보내 유저 정보를 가져옴
  5. server 만약 유저 정보가 db에 없다면(식별은 이메일로 진행 중입니다), 신규 회원가입 시키고(새로운 유저 정보를 db에 추가) 클라이언트 측에 AT, RT 공급
  6. server 유저 정보가 db에 존재한다면, 로그인 유저이므로 AT, RT만 공급
  7. client 백엔드에게서 받은 AT, RT로 유저의 로그인을 관리

참고 자료

추가
React strict 모드의 특성상 SocialCallBackPage 내부의 useEffect가 2번 실행되면서, 구글/카카오 측에 여러 번 로그인 요청이 가며 에러가 발생했습니다.
이를 방지하기 위해 useRef를 이용해 렌더링을 초기 1회로 제한하는 방법을 사용했습니다.

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

coderabbitai bot commented Oct 5, 2024

Walkthrough

이 변경 사항은 소셜 로그인 기능을 구현하기 위해 여러 컴포넌트와 서비스에 새로운 기능을 추가하고 기존 기능을 수정합니다. 새로운 SocialButton 컴포넌트가 추가되어 구글과 카카오 로그인을 처리하며, SocialCallBackPage가 소셜 로그인 콜백을 처리합니다. 또한, 인증 서비스 핸들러에 새로운 API 엔드포인트가 추가되어 소셜 로그인 요청을 처리합니다. 이와 함께 관련된 타입 정의와 라우팅도 업데이트되었습니다.

Changes

파일 경로 변경 요약
src/components/user/auth-form/SocialButton.tsx 새로운 SocialButton 컴포넌트 추가, 소셜 로그인 기능 구현
src/layouts/AuthFormLayout.tsx onSubmit 프로퍼티를 선택적으로 변경
src/mocks/services/authServiceHandler.ts 소셜 로그인 API 엔드포인트 추가, Kakao 및 Google 로그인 처리
src/pages/user/SignInPage.tsx 기존 로그인 버튼을 SocialButton 컴포넌트로 대체
src/pages/user/SocialCallBackPage.tsx 소셜 로그인 콜백을 처리하는 새로운 컴포넌트 추가
src/routes/MainRouter.tsx Kakao 및 Google 콜백을 처리하는 새로운 라우트 추가
src/services/authService.ts 소셜 로그인 기능을 위한 socialLogin 함수 추가
src/types/UserType.tsx SocialLoginProvider 타입 추가 및 User 타입 업데이트

Assessment against linked issues

Objective Addressed Explanation
소셜 회원가입 기능 구현 (#172)
소셜 로그인 기능 구현 (#172)

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 changed the title Feature/#172 social login Feature/#172 소셜 회원가입/로그인 기능 구현 Oct 5, 2024
@Yoonyesol Yoonyesol changed the title Feature/#172 소셜 회원가입/로그인 기능 구현 Feat: #172 소셜 회원가입/로그인 기능 구현 Oct 5, 2024
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: 10

🧹 Outside diff range and nitpick comments (8)
src/components/user/auth-form/SocialButton.tsx (1)

21-35: 아이콘 크기를 반응형으로 조정하는 것이 좋습니다.

버튼 렌더링과 스타일링이 전반적으로 잘 구현되어 있습니다. 하지만 아이콘 크기를 고정 값으로 설정한 것이 눈에 띕니다.

아이콘 크기를 반응형으로 조정하는 것을 고려해보세요. 예를 들어:

-className={isGoogle ? 'size-42' : 'size-15'}
+className={`w-auto h-${isGoogle ? '10' : '4'} max-w-[42px] max-h-[42px]`}

이렇게 하면 다양한 화면 크기에서 더 일관된 모습을 유지할 수 있습니다.

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

95-96: 소셜 로그인 버튼 구현 개선 제안

SocialButton 컴포넌트를 사용하여 Kakao와 Google 로그인 버튼을 구현한 것은 좋은 접근입니다. 재사용 가능한 컴포넌트를 사용함으로써 코드의 유지보수성이 향상되었습니다.

다만, 다음 사항들을 고려해보시는 것이 어떨까요?

  1. 소셜 로그인 성공 및 실패에 대한 피드백을 추가하는 것이 사용자 경험을 개선하는 데 도움이 될 것 같습니다.
  2. 소셜 로그인 과정에서 발생할 수 있는 오류 처리 로직을 추가하는 것이 좋겠습니다.

이러한 개선사항을 추가하시겠습니까? 필요하다면 구체적인 구현 방법에 대해 제안드릴 수 있습니다.

src/services/authService.ts (1)

57-69: 소셜 로그인 함수가 잘 구현되었습니다. 오류 처리를 고려해 보세요.

socialLogin 함수가 PR의 목표에 맞게 잘 구현되었습니다. 함수 시그니처와 구현이 적절하며, defaultAxios 사용이 파일의 다른 함수들과 일관성이 있습니다.

제안사항:

  • 오류 처리를 추가하는 것을 고려해 보세요. 예를 들어, 잘못된 인증 코드나 네트워크 오류 등에 대한 처리를 포함할 수 있습니다.

오류 처리 예시:

export async function socialLogin(provider: SocialLoginProvider, code: string, axiosConfig: AxiosRequestConfig = {}) {
  try {
    return await defaultAxios.post(`user/login/${provider}`, { code }, axiosConfig);
  } catch (error) {
    console.error(`소셜 로그인 오류 (${provider}):`, error);
    throw error; // 또는 사용자 정의 오류 객체를 throw
  }
}
src/pages/user/SocialCallBackPage.tsx (1)

59-60: loading 상태 관리 개선을 고려해주세요.

if (loading) return; 검사를 하고 있지만, loading 상태를 변경하는 setLoading(true);가 그 다음 줄에 있습니다. 만약 loadingtrue인 경우 함수가 즉시 종료되지만, 그럴 가능성은 낮아 보입니다. 혹시 동시 요청을 방지하려는 목적이라면, 더 명확한 로직으로 수정하는 것을 추천합니다.

예를 들어, handleSocialLogin 함수 외부에서 상태를 관리하거나, 함수 호출 전에 상태를 변경하도록 수정할 수 있습니다.

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

128-138: 에러 발생 시 상세한 로그 남기기 권장

fetchAccessToken 함수에서 에러 발생 시 단순히 null을 반환하고 있습니다. 에러의 원인을 파악하기 위해 console.error 등을 사용하여 에러 정보를 로그로 남기는 것이 좋습니다.

 } catch (error) {
+   console.error('Access Token Fetch Error:', error);
    return null;
 }

140-150: 에러 발생 시 상세한 로그 남기기 권장

fetchUserInfo 함수에서도 에러 발생 시 null을 반환하고 있습니다. 마찬가지로 에러 로그를 추가하여 문제 해결에 도움이 되도록 하는 것이 좋습니다.

 } catch (error) {
+   console.error('User Info Fetch Error:', error);
    return null;
 }

177-177: 닉네임 필드에 사용자 친화적인 값 사용 권장

nicknameuserInfo.id로 설정하면 사용자가 이해하기 어려운 값일 수 있습니다. 대신에 소셜 프로필에서 제공하는 nickname이나 name 값을 사용하는 것이 좋습니다.

 nickname: userInfo.id,
+// 예시: 카카오의 경우 userInfo.properties.nickname 등을 사용할 수 있음

187-199: 토큰 및 쿠키 설정 시 보안 옵션 추가 고려

SecureSameSite 속성을 설정하고 있지만, 실제 운영 환경에서는 HttpOnly 옵션을 추가하여 클라이언트 측 스크립트에서 쿠키에 접근하지 못하도록 하는 것이 바람직합니다.

 'Set-Cookie': [
   `refreshToken=${refreshToken}; SameSite=Strict; Secure; Path=/; Expires=${refreshTokenExpiryDate}; Max-Age=${AUTH_SETTINGS.REFRESH_TOKEN_EXPIRATION / 1000}`,
   `refreshTokenExpiresAt=${refreshTokenExpiryDate}; SameSite=Strict; Secure; Path=/; Expires=${refreshTokenExpiryDate}; Max-Age=${AUTH_SETTINGS.REFRESH_TOKEN_EXPIRATION / 1000}`,
+  // HttpOnly 옵션 추가 권장
 ],
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 0728622 and e328147.

📒 Files selected for processing (8)
  • src/components/user/auth-form/SocialButton.tsx (1 hunks)
  • src/layouts/AuthFormLayout.tsx (1 hunks)
  • src/mocks/services/authServiceHandler.ts (3 hunks)
  • src/pages/user/SignInPage.tsx (2 hunks)
  • src/pages/user/SocialCallBackPage.tsx (1 hunks)
  • src/routes/MainRouter.tsx (2 hunks)
  • src/services/authService.ts (2 hunks)
  • src/types/UserType.tsx (1 hunks)
🔇 Additional comments (12)
src/layouts/AuthFormLayout.tsx (1)

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

onSubmit 프로퍼티를 선택적으로 만든 것은 소셜 로그인 구현에 적합한 변경입니다. 이를 통해 AuthFormLayout 컴포넌트를 폼 제출이 필요하지 않은 상황(예: 소셜 로그인 버튼만 있는 경우)에서도 사용할 수 있게 되었습니다.

이 변경으로 인해 컴포넌트의 유연성이 향상되었으며, PR의 목표인 소셜 로그인 기능 구현에 도움이 될 것입니다.

src/components/user/auth-form/SocialButton.tsx (1)

1-8: LGTM: 임포트 및 타입 정의가 적절합니다.

임포트와 SocialButtonProps 타입 정의가 명확하고 적절하게 구현되어 있습니다. 소셜 로그인 기능에 필요한 아이콘과 타입을 잘 가져오고 있습니다.

src/types/UserType.tsx (2)

3-3: 소셜 로그인 제공자 타입 추가 승인

새로운 SocialLoginProvider 타입의 추가는 Kakao와 Google 소셜 로그인 구현이라는 PR 목표와 잘 부합합니다. 이는 타입 안전성을 향상시키고 소셜 로그인 제공자 정의를 중앙화하여 코드의 유지보수성을 개선합니다.


9-9: User 타입의 provider 필드 수정 승인

User 타입의 provider 필드 수정은 새로 정의된 SocialLoginProvider 타입을 활용하여 타입 안전성을 향상시킵니다. 'LOCAL' 옵션을 유지함으로써 이전 버전과의 호환성도 보장하고 있습니다. 이 변경사항은 PR의 목표와 일치하며 코드의 일관성을 유지합니다.

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

6-6: LGTM: SocialButton 컴포넌트 가져오기

SocialButton 컴포넌트를 가져오는 import 문이 올바르게 추가되었습니다. 이는 소셜 로그인 기능 구현이라는 PR 목표와 일치합니다.


Line range hint 1-98: 전반적인 리뷰 요약

SignInPage 컴포넌트의 변경사항은 소셜 로그인 기능 구현이라는 PR의 목표를 잘 달성하고 있습니다. SocialButton 컴포넌트의 도입으로 코드의 재사용성과 유지보수성이 향상되었습니다.

주요 개선 사항:

  1. 소셜 로그인 버튼이 성공적으로 구현되었습니다.
  2. isSubmitting prop을 통해 중복 제출을 방지하고 있습니다.

추가 개선 제안:

  1. 소셜 로그인의 성공 및 실패에 대한 사용자 피드백 메커니즘을 추가하는 것이 좋겠습니다.
  2. 소셜 로그인 과정에서의 오류 처리를 강화하면 좋겠습니다.

전반적으로 잘 구현된 변경사항입니다. 제안된 개선사항을 반영하면 더욱 견고한 구현이 될 것 같습니다.

src/routes/MainRouter.tsx (4)

14-14: LGTM: SocialCallBackPage 컴포넌트 가져오기

SocialCallBackPage 컴포넌트를 가져오는 import 문이 적절하게 추가되었습니다. 다른 페이지 컴포넌트 import와 일관성 있게 작성되었습니다.


49-49: LGTM: Kakao 인증 콜백 라우트 추가

Kakao 소셜 로그인을 위한 콜백 라우트가 적절하게 추가되었습니다. 경로와 컴포넌트 설정이 PR 목표와 일치합니다.


50-50: LGTM: Google 인증 콜백 라우트 추가

Google 소셜 로그인을 위한 콜백 라우트가 적절하게 추가되었습니다. 경로와 컴포넌트 설정이 PR 목표와 일치합니다.


14-14: 전반적인 변경 사항 검토: 소셜 로그인 기능 추가

이 PR의 변경 사항은 Kakao와 Google 소셜 로그인 기능을 추가하는 PR 목표를 잘 달성하고 있습니다. 주요 변경 사항은 다음과 같습니다:

  1. SocialCallBackPage 컴포넌트 import 추가
  2. Kakao 인증 콜백 라우트 추가
  3. Google 인증 콜백 라우트 추가

이러한 변경 사항들은 기존 라우팅 구조에 잘 통합되어 있으며, React Router 규칙을 준수하고 있습니다. 전반적으로 변경 사항이 간결하고 목적에 부합하며, 기존 코드와 일관성을 유지하고 있습니다.

Also applies to: 49-50

src/services/authService.ts (2)

15-15: LGTM: SocialLoginProvider 타입 가져오기가 올바르게 추가되었습니다.

SocialLoginProvider 타입을 가져오는 것이 새로운 socialLogin 함수와 일관성 있게 추가되었습니다. 이는 코드의 타입 안전성을 향상시키는 좋은 방법입니다.


Line range hint 1-69: PR 목표에 부합하는 변경사항입니다.

이 PR의 변경사항은 소셜 로그인 기능 구현이라는 목표에 잘 부합합니다. SocialLoginProvider 타입의 추가와 socialLogin 함수의 구현은 Kakao와 Google을 통한 소셜 로그인 기능을 지원하기 위한 중요한 단계입니다.

주요 포인트:

  1. 코드 구조가 기존 파일의 패턴을 잘 따르고 있습니다.
  2. 타입 안전성이 잘 유지되고 있습니다.
  3. axios를 사용한 API 호출이 일관성 있게 구현되었습니다.

전반적으로 변경사항이 잘 구현되었으며, 제안된 오류 처리 개선을 고려하면 더욱 견고한 구현이 될 것 같습니다.

src/components/user/auth-form/SocialButton.tsx Outdated Show resolved Hide resolved
src/components/user/auth-form/SocialButton.tsx Outdated Show resolved Hide resolved
src/types/UserType.tsx Show resolved Hide resolved
src/pages/user/SocialCallBackPage.tsx Outdated Show resolved Hide resolved
src/pages/user/SocialCallBackPage.tsx Outdated Show resolved Hide resolved
src/pages/user/SocialCallBackPage.tsx Outdated Show resolved Hide resolved
src/pages/user/SocialCallBackPage.tsx Outdated Show resolved Hide resolved
src/mocks/services/authServiceHandler.ts Show resolved Hide resolved
src/mocks/services/authServiceHandler.ts Outdated Show resolved Hide resolved
src/mocks/services/authServiceHandler.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.

소셜 로그인 재미있게 잘 봤습니다☺️ 코드 리뷰 몇가지 있으니 확인 부탁드려요.

src/components/user/auth-form/SocialButton.tsx Outdated Show resolved Hide resolved
src/mocks/services/authServiceHandler.ts Show resolved Hide resolved
src/mocks/services/authServiceHandler.ts Outdated Show resolved Hide resolved
src/mocks/services/authServiceHandler.ts Outdated Show resolved Hide resolved
src/pages/user/SocialCallBackPage.tsx Show resolved Hide resolved
src/pages/user/SocialCallBackPage.tsx 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 Yoonyesol merged commit 617bcc4 into develop Oct 9, 2024
@Yoonyesol Yoonyesol deleted the feature/#172-social-login branch October 9, 2024 13:53
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