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: 멤버가 여러 종류의 역할을 가질 수 있도록 변경 #561

Merged
merged 25 commits into from
Aug 3, 2024

Conversation

uwoobeat
Copy link
Member

@uwoobeat uwoobeat commented Aug 2, 2024

🌱 관련 이슈

📌 작업 내용 및 특이사항

개요

  • 이번 PR은 엑세스 토큰 및 시큐리티의 인증주체(PrincipalDetails)에 대하여 멤버 역할 외 관리자 역할, 스터디 역할을 추가하는 것입니다.
  • 이렇게 하면 해당 토큰으로 로그인하는 유저가 가진 역할을 알 수 있고, 관리자 전용 API 혹은 멘토 전용 API에 엑세스할 수 있게 됩니다.

역할 추가

  • MemberRole 외에 MemberManageRole, MemberStudyRole 을 추가했습니다.
  • 관리자 역할의 경우 어드민 / 일반 사용자를, 스터디 역할의 경우 멘토 / 학생을 구분하는 역할을 합니다.

시큐리티 로직

  • PrincipalDetails는 스프링 시큐리티에서 사용되는 '인증 주체'입니다. 시큐리티는 이 인증 주체의 getAuthorities() 메서드를 호출하여 해당 주체가 어떤 역할을 가지고 있는지 검증합니다. 시큐리티 설정 클래스의 hasRoles() 에 따른 검증이 바로 이것입니다.
  • getAuthorities() 메서드는 리턴값이 Collection<? extends GrantedAuthority> 이기 때문에 한 인증주체가 여러 역할을 가질 수 있게 합니다.
  • 여기에 MemberRole 외 나머지 역할들을 리스트로 추가하는 것이 최종 목적이라 할 수 있겠습니다.

MemberAuthInfo

  • 기존에는 1) 멤버 ID 2) 멤버 역할 두 가지 필드만 필요했는데요, 이번에 두 가지 역할이 추가되면서 파라미터가 4개로 늘었습니다.
  • 파라미터가 많은 메서드는 좋지 못하고, 4개의 값을 한번에 다뤄야 하는 경우가 많기에, MemberAuthInfo 라는 DTO로 묶어냈습니다.
  • (참고) PrincipalDetails 내부 필드에 멤버 도메인 참조를 넣으면 영속성 컨텍스트 문제가 있기 때문에 조회되는 즉시 DTO로 매핑하거나 이전처럼 각 필드로 변환하는 것이 좋습니다.
  • MemberAuthInfo 로 래핑하여 메서드 간 호출이 발생하기 때문에 이후에 역할값이 추가되더라도 훨씬 더 유연하게 대응할 수 있습니다.

기타

  • 기존에 JwtUtil 에서는 buildToken 이라는 메서드를 통해 엑세스 토큰과 리프레시 토큰 모두를 생성했는데요, 이번에 엑세스 토큰과 리프레시 토큰의 클레임 차이가 커지면서, 각각의 생성 메서드로 분리하도록 변경했습니다.

📝 참고사항

  • 추후 상용 배포 시 기존 멤버 역할 필드가 null로 삽입되기 때문에, 적절히 채워줘야 합니다.

📚 기타

Summary by CodeRabbit

Summary by CodeRabbit

  • New Features

    • 회원 인증 정보를 통합하는 새로운 MemberAuthInfo DTO 추가.
    • 관리 및 학습 역할을 포함한 역할 관리 시스템 확장.
  • Bug Fixes

    • 토큰 생성 및 검증 프로세스 개선으로 사용자 인증 흐름 안정화.
  • Refactor

    • JWT 관련 메서드의 매개변수를 통합하여 코드 가독성 및 유지보수성 향상.
    • Redis 관련 테스트 설정을 간소화하여 테스트 격리 및 속도 향상.
  • Chores

    • GitHub Actions 워크플로우 파일의 Docker 관련 명령어 업데이트.

@uwoobeat uwoobeat requested a review from a team as a code owner August 2, 2024 13:23
@uwoobeat uwoobeat self-assigned this Aug 2, 2024
Copy link

coderabbitai bot commented Aug 2, 2024

Warning

Rate limit exceeded

@seulgi99 has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 2 minutes and 42 seconds before requesting another review.

How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

Commits

Files that changed from the base of the PR and between 8c890cc and ac38e54.

Walkthrough

이번 변경사항은 멤버의 역할 관리를 개선하기 위한 것으로, MemberRole에서 ADMIN 역할을 제거하고 새로운 manageRolestudyRole을 도입했습니다. 이를 통해 멤버에게 여러 역할을 부여할 수 있으며, JWT 토큰 구조와 인증 흐름도 개선되었습니다. 이로 인해 코드의 유지 보수성과 명확성이 향상되었습니다.

Changes

파일 경로 변경 요약
.github/workflows/... Docker 명령어를 docker-compose에서 docker compose로 변경.
.github/workflows/... gradlew 실행 권한 설정 단계 순서 재조정.
src/main/java/com/gdschongik/gdsc/domain/auth/application/... createAccessToken 메서드가 MemberAuthInfo 객체를 받도록 변경, 역할 관리 확장.
src/main/java/com/gdschongik/gdsc/domain/auth/dto/... memberIdmemberRole 필드를 MemberAuthInfo로 대체.
src/main/java/com/gdschongik/gdsc/domain/discord/domain/... MemberRoleMemberManageRole로 변경, 관리자 권한 검증 로직 수정.
src/main/java/com/gdschongik/gdsc/domain/member/application/... createTemporaryToken 메서드 수정, MemberAuthInfo를 사용하여 JWT 생성.
src/main/java/com/gdschongik/gdsc/domain/member/domain/... manageRolestudyRole 필드 추가, 역할 관리 기능 확장.
src/main/java/com/gdschongik/gdsc/domain/member/domain/MemberManageRole.java 멤버 관리 역할 정의를 위한 새 enum 추가, ADMINNONE 포함.
src/main/java/com/gdschongik/gdsc/domain/member/domain/MemberRole.java ADMIN 역할 제거 및 생성자 수정.
src/main/java/com/gdschongik/gdsc/domain/member/domain/MemberStudyRole.java MENTORSTUDENT 역할 정의를 위한 새 enum 추가.
src/main/java/com/gdschongik/gdsc/global/common/constant/... TOKEN_MANAGE_ROLE_NAME, TOKEN_STUDY_ROLE_NAME 상수 추가.
src/main/java/com/gdschongik/gdsc/global/security/... memberIdmemberRolememberAuthInfo로 통합.
src/main/java/com/gdschongik/gdsc/global/security/... 인증 성공 처리 로직 수정, MemberAuthInfo를 통해 토큰 생성.
src/main/java/com/gdschongik/gdsc/global/security/... setAuthenticationToContext 메서드 파라미터를 UserDetails로 변경.
src/main/java/com/gdschongik/gdsc/global/security/MemberAuthInfo.java 멤버 인증 정보를 캡슐화하는 DTO 정의.
src/main/java/com/gdschongik/gdsc/global/security/PrincipalDetails.java 역할 관리 기능 확장을 위한 멤버 변수 수정 및 새 메서드 추가.
src/main/java/com/gdschongik/gdsc/global/util/JwtUtil.java JWT 토큰 생성 메서드 수정, MemberAuthInfo를 사용하여 인증 정보 처리.
src/test/java/com/gdschongik/gdsc/helper/IntegrationTest.java logoutAndReloginAs 메서드에 추가적인 역할 매개변수 포함.
src/test/java/com/gdschongik/gdsc/config/... Redis 테스트 환경 설정을 Spring의 구성 방식으로 변경.
src/test/java/com/gdschongik/gdsc/helper/RedisCleaner.java Redis 관리 기능을 위한 새 클래스 추가.
src/test/java/com/gdschongik/gdsc/helper/RepositoryTest.java Redis 관련 설정 및 클린업 방식 변경.
src/test/java/com/gdschongik/gdsc/domain/email/application/... Redis 설정 관련 의존성 제거.

Assessment against linked issues

Objective Addressed Explanation
멤버의 역할을 ADMIN으로부터 분리하고 여러 역할을 지원하도록 변경 (✅ #441)
토큰 구조 개선 및 인증 주체의 역할 관리를 향상시키기 (✅ #441)
기존 권한 검증 로직을 새로운 구조에 맞게 수정 (✅ #441)

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>.
    • 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 generate interesting stats about this repository and render them as a table.
    • @coderabbitai show all the console.log statements in this repository.
    • @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 as 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.

Additionally, you can add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.

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

github-actions bot commented Aug 2, 2024

Job Summary for Gradle

Check Style and Test to Develop :: build-test
Gradle Root Project Requested Tasks Gradle Version Build Outcome Build Scan®
gdsc check 8.5 Build Scan published

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: 0

Outside diff range, codebase verification and nitpick comments (1)
src/test/java/com/gdschongik/gdsc/helper/IntegrationTest.java (1)

94-96: 함수 호출을 업데이트하세요.

logoutAndReloginAs 함수의 호출이 새로운 서명을 따르지 않습니다. 다음 파일에서 호출을 업데이트해야 합니다:

  • src/test/java/com/gdschongik/gdsc/domain/study/application/StudyMentorServiceTest.java
  • src/test/java/com/gdschongik/gdsc/domain/order/application/OrderServiceTest.java
  • src/test/java/com/gdschongik/gdsc/domain/member/application/OnboardingMemberServiceTest.java
  • src/test/java/com/gdschongik/gdsc/domain/email/application/UnivEmailVerificationServiceTest.java
  • src/test/java/com/gdschongik/gdsc/domain/membership/application/MembershipServiceTest.java
Analysis chain

좋습니다! 하지만 함수 사용을 확인하세요.

코드 변경이 승인되었습니다.

그러나 logoutAndReloginAs 함수의 모든 호출이 새로운 서명을 따르는지 확인하세요.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify all function calls to `logoutAndReloginAs` match the new signature.

# Test: Search for the function usage. Expect: Only occurrences of the new signature.
rg --type java -A 5 $'logoutAndReloginAs'

Length of output: 13650

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 6acc16c and 6c9d1c2.

Files selected for processing (17)
  • .github/workflows/pull_request_gradle_build.yml (1 hunks)
  • src/main/java/com/gdschongik/gdsc/domain/auth/application/JwtService.java (3 hunks)
  • src/main/java/com/gdschongik/gdsc/domain/auth/dto/AccessTokenDto.java (1 hunks)
  • src/main/java/com/gdschongik/gdsc/domain/discord/domain/DiscordValidator.java (2 hunks)
  • src/main/java/com/gdschongik/gdsc/domain/member/application/OnboardingMemberService.java (2 hunks)
  • src/main/java/com/gdschongik/gdsc/domain/member/domain/Member.java (6 hunks)
  • src/main/java/com/gdschongik/gdsc/domain/member/domain/MemberManageRole.java (1 hunks)
  • src/main/java/com/gdschongik/gdsc/domain/member/domain/MemberRole.java (1 hunks)
  • src/main/java/com/gdschongik/gdsc/domain/member/domain/MemberStudyRole.java (1 hunks)
  • src/main/java/com/gdschongik/gdsc/global/common/constant/SecurityConstant.java (1 hunks)
  • src/main/java/com/gdschongik/gdsc/global/security/CustomOAuth2User.java (1 hunks)
  • src/main/java/com/gdschongik/gdsc/global/security/CustomSuccessHandler.java (1 hunks)
  • src/main/java/com/gdschongik/gdsc/global/security/JwtFilter.java (5 hunks)
  • src/main/java/com/gdschongik/gdsc/global/security/MemberAuthInfo.java (1 hunks)
  • src/main/java/com/gdschongik/gdsc/global/security/PrincipalDetails.java (1 hunks)
  • src/main/java/com/gdschongik/gdsc/global/util/JwtUtil.java (4 hunks)
  • src/test/java/com/gdschongik/gdsc/helper/IntegrationTest.java (2 hunks)
Files skipped from review due to trivial changes (1)
  • .github/workflows/pull_request_gradle_build.yml
Additional comments not posted (32)
src/main/java/com/gdschongik/gdsc/domain/auth/dto/AccessTokenDto.java (1)

3-5: 변경 사항이 잘 반영되었습니다.

MemberAuthInfo를 사용하여 더 나은 캡슐화를 제공합니다.

그러나 새로운 구조가 코드베이스 전체에서 올바르게 사용되고 있는지 확인하십시오.

Verification successful

변경 사항이 잘 반영되었습니다.

MemberAuthInfo가 코드베이스 전체에서 일관되게 사용되고 있습니다.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the usage of `MemberAuthInfo` in the codebase.

# Test: Search for the usage of `MemberAuthInfo`. Expect: Consistent usage across the codebase.
rg --type java -A 5 $'MemberAuthInfo'

Length of output: 10020

src/main/java/com/gdschongik/gdsc/domain/member/domain/MemberManageRole.java (1)

1-13: 새 파일이 잘 정의되었습니다.

MemberManageRole enum이 간단하고 명확하게 정의되었습니다.

그러나 새로운 역할이 코드베이스 전체에서 올바르게 사용되고 있는지 확인하십시오.

Verification successful

새 파일이 잘 정의되었으며 코드베이스 전체에서 일관되게 사용되고 있습니다.

MemberManageRole enum이 여러 파일에서 올바르게 사용되고 있습니다. 주요 보안, 인증, 도메인 검증 등에서 일관된 사용이 확인되었습니다.

  • src/test/java/com/gdschongik/gdsc/helper/IntegrationTest.java
  • src/main/java/com/gdschongik/gdsc/global/security/PrincipalDetails.java
  • src/main/java/com/gdschongik/gdsc/global/security/MemberAuthInfo.java
  • src/main/java/com/gdschongik/gdsc/global/util/JwtUtil.java
  • src/main/java/com/gdschongik/gdsc/domain/discord/domain/DiscordValidator.java
  • src/main/java/com/gdschongik/gdsc/domain/member/domain/Member.java
  • src/main/java/com/gdschongik/gdsc/domain/auth/application/JwtService.java
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the usage of `MemberManageRole` in the codebase.

# Test: Search for the usage of `MemberManageRole`. Expect: Consistent usage across the codebase.
rg --type java -A 5 $'MemberManageRole'

Length of output: 11460

src/main/java/com/gdschongik/gdsc/domain/member/domain/MemberRole.java (1)

4-11: 역할 정의가 단순화되었습니다.

ADMIN 역할이 제거되고 @AllArgsConstructor@RequiredArgsConstructor로 대체되었습니다.

그러나 ADMIN 역할의 제거가 코드베이스의 다른 부분에 영향을 미치지 않는지 확인하십시오.

Verification successful

역할 정의가 단순화되었습니다.

ADMIN 역할이 제거되고 @AllArgsConstructor@RequiredArgsConstructor로 대체되었습니다. ADMIN 역할의 제거가 코드베이스의 다른 부분에 영향을 미치지 않습니다.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the removal of `ADMIN` role in the codebase.

# Test: Search for the usage of `ADMIN` role. Expect: No occurrences of `ADMIN` role.
rg --type java -A 5 $'ROLE_ADMIN'

Length of output: 500


Script:

#!/bin/bash
# Description: Verify the usage of `MemberRole` and `MemberManageRole` in the codebase.

# Test: Search for the usage of `MemberRole` and `MemberManageRole` in the codebase.
rg --type java -A 5 'MemberRole'
rg --type java -A 5 'MemberManageRole'

Length of output: 50349


Script:

#!/bin/bash
# Description: Verify if `MemberRole.ADMIN` is directly referenced in the codebase.

# Test: Search for direct references to `MemberRole.ADMIN`.
rg --type java -A 5 'MemberRole.ADMIN'

Length of output: 38


Script:

#!/bin/bash
# Description: Verify if `ROLE_ADMIN` is referenced elsewhere in the codebase.

# Test: Search for references to `ROLE_ADMIN` in the codebase.
rg --type java -A 5 'ROLE_ADMIN'

Length of output: 500

src/main/java/com/gdschongik/gdsc/domain/member/domain/MemberStudyRole.java (1)

1-13: 좋습니다! MemberStudyRole enum 정의

MemberStudyRole enum이 잘 정의되어 있습니다. MENTORSTUDENT 두 가지 역할을 포함하고 있으며, 각 역할에 대한 문자열 값을 가지고 있습니다.

src/main/java/com/gdschongik/gdsc/global/security/MemberAuthInfo.java (1)

1-15: 좋습니다! MemberAuthInfo 레코드 정의

MemberAuthInfo 레코드가 잘 정의되어 있습니다. 멤버의 ID와 역할 정보를 포함하고 있으며, Member 객체로부터 인스턴스를 생성하는 정적 메서드도 잘 구현되어 있습니다.

src/main/java/com/gdschongik/gdsc/global/security/CustomOAuth2User.java (1)

13-18: 좋습니다! CustomOAuth2User 클래스 변경

CustomOAuth2User 클래스의 변경 사항이 잘 반영되었습니다. MemberAuthInfo를 사용하여 멤버 인증 정보를 캡슐화하고 유지 보수성을 향상시켰습니다.

src/main/java/com/gdschongik/gdsc/global/common/constant/SecurityConstant.java (2)

9-9: 상수 이름과 값이 적절합니다.

TOKEN_MANAGE_ROLE_NAME 상수는 명확하고 일관된 네이밍을 따르고 있습니다.


10-10: 상수 이름과 값이 적절합니다.

TOKEN_STUDY_ROLE_NAME 상수는 명확하고 일관된 네이밍을 따르고 있습니다.

src/main/java/com/gdschongik/gdsc/domain/discord/domain/DiscordValidator.java (2)

6-6: 적절한 import 변경입니다.

MemberManageRole를 사용하도록 import 문이 올바르게 수정되었습니다.


35-37: 관리자 권한 검증 로직이 적절합니다.

getManageRole을 사용하여 관리자 권한을 검증하는 로직이 올바르게 수정되었습니다.

src/main/java/com/gdschongik/gdsc/global/security/PrincipalDetails.java (5)

3-6: 적절한 import 추가입니다.

MemberManageRoleMemberStudyRole를 사용하도록 import 문이 올바르게 추가되었습니다.


9-9: 적절한 어노테이션 변경입니다.

@RequiredArgsConstructor 어노테이션이 필수 필드를 명확히 하기 위해 올바르게 사용되었습니다.


18-20: 필드 정의가 적절합니다.

role, manageRole, studyRole 필드가 올바르게 정의되었습니다.


22-25: 적절한 메서드 추가입니다.

from 메서드가 AccessTokenDto로부터 PrincipalDetails 인스턴스를 올바르게 생성합니다.


29-35: 권한 생성 로직이 적절합니다.

getAuthorities 메서드가 새로운 역할에 대한 GrantedAuthority 객체를 올바르게 생성합니다.

src/main/java/com/gdschongik/gdsc/global/security/CustomSuccessHandler.java (1)

41-43: 확인 필요: MemberAuthInfo 객체의 정확성

MemberAuthInfo 객체가 올바르게 생성되고 사용되는지 확인하십시오.

src/main/java/com/gdschongik/gdsc/domain/auth/application/JwtService.java (2)

29-30: 확인 필요: MemberAuthInfo 객체의 정확성

MemberAuthInfo 객체가 올바르게 생성되고 사용되는지 확인하십시오.

Verification successful

확인 필요: MemberAuthInfo 객체의 정확성

MemberAuthInfo 객체는 JwtService 클래스와 코드베이스의 여러 부분에서 올바르게 생성되고 사용되고 있습니다. 다음 위치를 확인하십시오:

  • JwtService 클래스에서 createAccessToken 메서드
  • JwtUtil 클래스에서 generateAccessToken 메서드
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the correctness of `MemberAuthInfo` object creation and usage in `JwtService`.

# Test: Search for the `MemberAuthInfo` object usage in `JwtService` class. Expect: Correct implementation.
ast-grep --lang java --pattern $'class JwtService {
  $$$
  AccessTokenDto createAccessToken(MemberAuthInfo authInfo) {
    $$$
  }
  $$$  
}'

Length of output: 143


Script:

#!/bin/bash
# Description: Verify the presence of `JwtService` class and usage of `MemberAuthInfo` object.

# Step 1: Search for the `JwtService` class to confirm its presence.
ast-grep --lang java --pattern 'class JwtService { $$$ }'

# Step 2: Search for the usage of `MemberAuthInfo` object across the codebase.
rg 'MemberAuthInfo' -A 5

Length of output: 10068


93-102: 확인 필요: MemberAuthInfo 객체의 정확성

MemberAuthInfo 객체가 올바르게 생성되고 사용되는지 확인하십시오.

Verification successful

확인 완료: MemberAuthInfo 객체의 정확성

MemberAuthInfo 객체가 reissueAccessTokenIfExpired 메서드에서 올바르게 생성되고 사용되고 있습니다.

  • MemberAuthInfo 객체는 만료된 JWT의 클레임을 사용하여 생성됩니다.
  • 클레임에서 역할과 멤버 ID가 올바르게 추출되어 MemberAuthInfo 객체를 인스턴스화하는 데 사용됩니다.
  • MemberAuthInfo 객체는 createAccessToken 메서드에 전달되어 올바르게 사용됩니다.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the correctness of `MemberAuthInfo` object creation and usage in `reissueAccessTokenIfExpired` method.

# Test: Search for the `reissueAccessTokenIfExpired` method in `JwtService` class. Expect: Correct implementation.
ast-grep --lang java --pattern $'class JwtService {
  $$$
  AccessTokenDto reissueAccessTokenIfExpired(String accessTokenValue) {
    $$$
  }
  $$$  
}'

Length of output: 153


Script:

#!/bin/bash
# Locate the JwtService class and extract the reissueAccessTokenIfExpired method to verify MemberAuthInfo object creation and usage.

# Find the JwtService.java file
fd JwtService.java

# Extract the reissueAccessTokenIfExpired method from the JwtService class
ast-grep --lang java --pattern $'class JwtService {
  $$$
  AccessTokenDto reissueAccessTokenIfExpired(String accessTokenValue) {
    $$$
  }
  $$$  
}' --json

Length of output: 258


Script:

#!/bin/bash
# Locate the JwtService class and list all methods to verify the existence of reissueAccessTokenIfExpired method.

# List all methods in the JwtService class
ast-grep --lang java --pattern $'class JwtService {
  $$$
  $_ $_($_) {
    $$$
  }
  $$$  
}' src/main/java/com/gdschongik/gdsc/domain/auth/application/JwtService.java

Length of output: 169


Script:

#!/bin/bash
# Locate the JwtService class and search for the reissueAccessTokenIfExpired method.

# Search for the reissueAccessTokenIfExpired method in the JwtService.java file
rg 'reissueAccessTokenIfExpired' src/main/java/com/gdschongik/gdsc/domain/auth/application/JwtService.java -A 10

Length of output: 636


Script:

#!/bin/bash
# Extract the complete reissueAccessTokenIfExpired method from the JwtService.java file.

# Extract the reissueAccessTokenIfExpired method from the JwtService.java file with more context lines
rg 'reissueAccessTokenIfExpired' src/main/java/com/gdschongik/gdsc/domain/auth/application/JwtService.java -A 30 -B 5

Length of output: 1102

src/main/java/com/gdschongik/gdsc/global/security/JwtFilter.java (3)

60-61: 확인 필요: PrincipalDetails.from 메서드의 정확성

PrincipalDetails.from 메서드가 올바르게 구현되고 사용되는지 확인하십시오.

Verification successful

확인 완료: PrincipalDetails.from 메서드의 정확성

PrincipalDetails 클래스와 from 메서드가 올바르게 구현되어 있습니다. from 메서드는 AccessTokenDto 객체를 받아 PrincipalDetails 객체를 생성합니다.

  • PrincipalDetails 클래스 위치:

    • src/main/java/com/gdschongik/gdsc/global/security/PrincipalDetails.java
  • from 메서드 구현:

    public static PrincipalDetails from(AccessTokenDto token) {
        MemberAuthInfo authInfo = token.authInfo();
        return new PrincipalDetails(authInfo.memberId(), authInfo.role(), authInfo.manageRole(), authInfo.studyRole());
    }
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the correctness of `PrincipalDetails.from` method.

# Test: Search for the `from` method in `PrincipalDetails` class. Expect: Correct implementation.
ast-grep --lang java --pattern $'class PrincipalDetails {
  $$$
  static PrincipalDetails from(AccessTokenDto accessTokenDto) {
    $$$
  }
  $$$  
}'

Length of output: 151


Script:

#!/bin/bash
# Description: Verify the existence of `PrincipalDetails` class and its `from` method.

# Step 1: Search for the `PrincipalDetails` class definition.
echo "Searching for PrincipalDetails class..."
ast-grep --lang java --pattern 'class PrincipalDetails { $$$ }'

# Step 2: If the class is found, search for the `from` method within it.
echo "Searching for from method in PrincipalDetails class..."
ast-grep --lang java --pattern 'class PrincipalDetails { $$$ static PrincipalDetails from(AccessTokenDto accessTokenDto) { $$$ } $$$ }'

Length of output: 411


Script:

#!/bin/bash
# Description: Verify the existence of `PrincipalDetails` class and any `from` methods.

# Step 1: Search for the `PrincipalDetails` class in the entire repository.
echo "Searching for PrincipalDetails class in the entire repository..."
rg 'class PrincipalDetails' -A 10

# Step 2: Search for any methods named `from` in the entire repository.
echo "Searching for any methods named from in the entire repository..."
rg 'static PrincipalDetails from' -A 10

Length of output: 2933


44-44: 확인 필요: PrincipalDetails.from 메서드의 정확성

PrincipalDetails.from 메서드가 올바르게 구현되고 사용되는지 확인하십시오.


75-76: 확인 필요: PrincipalDetails.from 메서드의 정확성

PrincipalDetails.from 메서드가 올바르게 구현되고 사용되는지 확인하십시오.

Verification successful

확인 완료: PrincipalDetails.from 메서드의 정확성

PrincipalDetails.from 메서드는 올바르게 구현되었습니다.

  • PrincipalDetails 클래스는 src/main/java/com/gdschongik/gdsc/global/security/PrincipalDetails.java 파일에 있습니다.
  • from 메서드는 AccessTokenDto 객체에서 MemberAuthInfo를 추출하여 새로운 PrincipalDetails 객체를 생성합니다.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the correctness of `PrincipalDetails.from` method.

# Test: Search for the `from` method in `PrincipalDetails` class. Expect: Correct implementation.
ast-grep --lang java --pattern $'class PrincipalDetails {
  $$$
  static PrincipalDetails from(AccessTokenDto accessTokenDto) {
    $$$
  }
  $$$  
}'

Length of output: 151


Script:

#!/bin/bash
# Description: Verify the existence and correctness of `PrincipalDetails.from` method.

# Step 1: Search for the `PrincipalDetails` class definition.
ast-grep --lang java --pattern 'class PrincipalDetails { $$$ }'

# Step 2: Search for the `from` method within the `PrincipalDetails` class.
ast-grep --lang java --pattern 'class PrincipalDetails {
  $$$
  static PrincipalDetails from($_) {
    $$$
  }
  $$$  
}'

Length of output: 190


Script:

#!/bin/bash
# Description: Verify the existence and correctness of `PrincipalDetails.from` method.

# Step 1: List all Java files and search for the `PrincipalDetails` class definition.
files=$(fd --type f --extension java)
for file in $files; do
  if grep -q 'class PrincipalDetails' "$file"; then
    echo "Found PrincipalDetails class in: $file"
    # Step 2: Search for the `from` method within the identified file.
    grep -A 10 'class PrincipalDetails' "$file" | grep -A 10 'static PrincipalDetails from'
  fi
done

Length of output: 62926

src/main/java/com/gdschongik/gdsc/domain/member/application/OnboardingMemberService.java (1)

92-95: 좋습니다! 하지만 함수 사용을 확인하세요.

코드 변경이 승인되었습니다.

그러나 createTemporaryToken 함수의 모든 호출이 새로운 서명을 따르는지 확인하세요.

src/main/java/com/gdschongik/gdsc/global/util/JwtUtil.java (5)

38-46: 좋습니다!

generateAccessToken 메서드가 MemberAuthInfo를 사용하도록 변경되어 코드의 명확성과 유지 보수성이 향상되었습니다.


48-58: 좋습니다!

buildAccessToken 메서드가 MemberAuthInfo의 속성을 사용하여 토큰을 생성하도록 변경되어 캡슐화가 개선되었습니다.


67-70: 좋습니다!

generateRefreshToken 메서드가 buildRefreshToken을 호출하여 토큰을 생성하도록 변경되어 코드가 간결해졌습니다.


71-78: 좋습니다!

buildRefreshToken 메서드가 회원 ID를 사용하여 리프레시 토큰을 생성하도록 변경되어 불필요한 매개변수가 제거되었습니다.


90-96: 좋습니다!

parseAccessToken 메서드가 파싱된 클레임에서 MemberAuthInfo 객체를 생성하도록 변경되어 모든 관련 역할 정보가 일관되게 캡처되고 반환됩니다.

src/main/java/com/gdschongik/gdsc/domain/member/domain/Member.java (5)

39-40: 새로운 필드 manageRole 추가 확인

MemberManageRole 타입의 manageRole 필드가 추가되었습니다. 이 필드는 @Enumerated(EnumType.STRING)으로 저장됩니다. 이는 데이터베이스에 문자열로 저장되므로 적절합니다.


42-43: 새로운 필드 studyRole 추가 확인

MemberStudyRole 타입의 studyRole 필드가 추가되었습니다. 이 필드는 @Enumerated(EnumType.STRING)으로 저장됩니다. 이는 데이터베이스에 문자열로 저장되므로 적절합니다.


78-79: 생성자 업데이트 확인

생성자에 manageRolestudyRole 파라미터가 추가되었습니다. 이는 새로운 역할 필드를 초기화할 수 있게 합니다. 올바르게 적용되었습니다.

Also applies to: 93-94


114-115: createGuestMember 메소드 업데이트 확인

createGuestMember 메소드가 manageRoleNONE, studyRoleSTUDENT를 할당하도록 업데이트되었습니다. 이는 게스트 멤버의 기본 역할을 설정하는 데 적절합니다.


287-290: 새로운 메소드 assignToMentor 추가 확인

assignToMentor 메소드가 추가되어 studyRoleMENTOR로 업데이트합니다. 상태 변경 가능 여부를 검증하는 로직이 포함되어 있어 적절합니다.

Copy link

github-actions bot commented Aug 2, 2024

Job Summary for Gradle

Check Style and Test to Develop :: build-test
Gradle Root Project Requested Tasks Gradle Version Build Outcome Build Scan®
gdsc check 8.5 Build Scan published

Copy link
Member

@Sangwook02 Sangwook02 left a comment

Choose a reason for hiding this comment

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

lgtm

Copy link
Member

@AlmondBreez3 AlmondBreez3 left a comment

Choose a reason for hiding this comment

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

lgtm

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: 0

Outside diff range, codebase verification and nitpick comments (1)
src/test/java/com/gdschongik/gdsc/config/TestRedisConfig.java (1)

3-7: 불필요한 주석 제거

Spring의 테스트 기능을 사용하여 Redis 설정을 단순화했습니다. 이로 인해 불필요한 주석을 제거할 수 있습니다.

- // import statements
Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 6c9d1c2 and f2ac4d9.

Files selected for processing (7)
  • .github/workflows/production_build_deploy.yml (1 hunks)
  • build.gradle (1 hunks)
  • src/test/java/com/gdschongik/gdsc/config/TestRedisConfig.java (1 hunks)
  • src/test/java/com/gdschongik/gdsc/domain/email/application/UnivEmailVerificationServiceTest.java (2 hunks)
  • src/test/java/com/gdschongik/gdsc/helper/IntegrationTest.java (3 hunks)
  • src/test/java/com/gdschongik/gdsc/helper/RedisCleaner.java (1 hunks)
  • src/test/java/com/gdschongik/gdsc/helper/RepositoryTest.java (3 hunks)
Files skipped from review due to trivial changes (1)
  • .github/workflows/production_build_deploy.yml
Files skipped from review as they are similar to previous changes (1)
  • src/test/java/com/gdschongik/gdsc/helper/IntegrationTest.java
Additional comments not posted (11)
src/test/java/com/gdschongik/gdsc/config/TestRedisConfig.java (1)

9-12: Spring 테스트 설정의 적절한 사용

Spring의 테스트 설정 기능을 적절하게 사용하여 Redis 설정을 단순화했습니다. 이 접근 방식은 유지 보수성과 명확성을 향상시킵니다.

src/test/java/com/gdschongik/gdsc/helper/RepositoryTest.java (3)

13-13: 적절한 의존성 주입

RedisCleaner@Import하여 테스트 설정을 개선했습니다. 이로 인해 Redis 리소스의 신뢰성과 격리가 향상됩니다.


24-25: RedisCleaner 의존성 주입

RedisCleaner를 의존성 주입하여 Redis 정리 작업을 수행합니다. 이는 테스트의 신뢰성을 높이는 좋은 접근 방식입니다.


30-30: Redis 정리 작업 포함

setUp 메서드에 redisCleaner.execute()를 추가하여 각 테스트 전에 Redis 정리 작업을 수행합니다. 이는 테스트의 격리성을 보장합니다.

src/test/java/com/gdschongik/gdsc/helper/RedisCleaner.java (5)

1-1: 패키지 선언

패키지 선언이 적절하게 되어 있습니다.


3-10: 필요한 의존성 및 어노테이션 사용

lettuce 라이브러리를 사용하여 Redis에 연결하고, 필요한 의존성 및 어노테이션을 적절하게 사용했습니다.


12-14: 컴포넌트 및 필수 생성자 사용

@Component@RequiredArgsConstructor를 사용하여 필요한 의존성을 주입하고 있습니다. 이는 Spring의 의존성 주입 패턴을 잘 따르고 있습니다.


20-27: Redis 클라이언트 설정

afterPropertiesSet 메서드에서 Redis 클라이언트를 설정하고 있습니다. 이는 초기화 후 필요한 설정을 수행하는 좋은 방법입니다.


29-31: Redis 데이터베이스 정리

execute 메서드에서 flushdb 명령을 사용하여 Redis 데이터베이스를 정리합니다. 이는 테스트 환경을 깨끗하게 유지하는 데 도움이 됩니다.

src/test/java/com/gdschongik/gdsc/domain/email/application/UnivEmailVerificationServiceTest.java (1)

Line range hint 1-1:
Redis 설정 제거 확인 필요

TestRedisConfig 설정이 제거되었습니다. 이로 인해 Redis 설정에 의존하던 테스트가 영향을 받을 수 있습니다. 테스트가 올바르게 작동하는지 확인해 주세요.

Also applies to: 6-6

build.gradle (1)

Line range hint 1-1:
Testcontainers 의존성 제거 확인 필요

testImplementation 'org.testcontainers:testcontainers' 의존성이 제거되었습니다. 이로 인해 컨테이너화된 환경에 의존하던 테스트가 영향을 받을 수 있습니다. 테스트가 올바르게 작동하는지 확인해 주세요.

Also applies to: 41-41

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: 0

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between f2ac4d9 and 8c890cc.

Files selected for processing (3)
  • .github/workflows/develop_build_deploy.yml (1 hunks)
  • .github/workflows/production_build_deploy.yml (1 hunks)
  • .github/workflows/pull_request_gradle_build.yml (1 hunks)
Files skipped from review due to trivial changes (1)
  • .github/workflows/develop_build_deploy.yml
Files skipped from review as they are similar to previous changes (2)
  • .github/workflows/production_build_deploy.yml
  • .github/workflows/pull_request_gradle_build.yml

Copy link

github-actions bot commented Aug 2, 2024

Job Summary for Gradle

Check Style and Test to Develop :: build-test
Gradle Root Project Requested Tasks Gradle Version Build Outcome Build Scan®
gdsc check 8.5 Build Scan published

Copy link

github-actions bot commented Aug 2, 2024

Job Summary for Gradle

Check Style and Test to Develop :: build-test
Gradle Root Project Requested Tasks Gradle Version Build Outcome Build Scan®
gdsc check 8.5 Build Scan published

Copy link
Contributor

@seulgi99 seulgi99 left a comment

Choose a reason for hiding this comment

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

LGTM

@uwoobeat uwoobeat merged commit 769f670 into develop Aug 3, 2024
1 check passed
@uwoobeat uwoobeat deleted the feature/441-multiple-role branch August 3, 2024 06:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

✨ 멤버가 여러 종류의 역할을 가질 수 있도록 변경
4 participants