-
Notifications
You must be signed in to change notification settings - Fork 0
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
[YS-65] feat: 테스트용 토큰 강제 발급 API & AccessToken 갱신 API 구현 #16
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
미리 올라간 GoogleOAuth PR과 충돌이 생길 거 같아 해당 PR은 hold합니다. 리뷰만 부탁드려요~
Walkthrough이 풀 리퀘스트는 Dobby 백엔드 애플리케이션의 여러 컴포넌트에 걸쳐 중요한 변경 사항을 포함하고 있습니다. 주요 변경 사항은 멤버 ID 타입 변경, 테스트 토큰 생성 기능 추가, 의존성 업데이트 등을 포함합니다. 새로운 UseCase 인터페이스와 GenerateTestToken 클래스가 도입되어 테스트 토큰 생성을 위한 표준화된 접근 방식을 제공합니다. Changes
Poem
🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
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)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this 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
🧹 Nitpick comments (2)
src/main/kotlin/com/dobby/backend/DobbyBackendApplication.kt (1)
3-3
: UseCase 관련 임포트 추가
새로운UseCase
인터페이스를 통해 도메인 로직을 확장 가능하게 설계한 점이 좋습니다. 다만, 다른 패키지 구조와의 충돌이나 중복 정의가 없는지 점검이 필요합니다.src/main/kotlin/com/dobby/backend/domain/usecase/GenerateTestToken.kt (1)
8-10
: Input 데이터 클래스 설계
Input
클래스로memberId
만 받고 있어 단일 책임을 잘 지키고 있습니다. 추후 확장 가능성(예: 추가 파라미터)을 고려하여 유지보수성을 검토해주세요.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (13)
build.gradle.kts
(2 hunks)src/main/kotlin/com/dobby/backend/DobbyBackendApplication.kt
(1 hunks)src/main/kotlin/com/dobby/backend/domain/gateway/TokenGateway.kt
(1 hunks)src/main/kotlin/com/dobby/backend/domain/model/Member.kt
(1 hunks)src/main/kotlin/com/dobby/backend/domain/usecase/GenerateTestToken.kt
(1 hunks)src/main/kotlin/com/dobby/backend/domain/usecase/UseCase.kt
(1 hunks)src/main/kotlin/com/dobby/backend/infrastructure/database/entity/common/AuditingEntity.kt
(1 hunks)src/main/kotlin/com/dobby/backend/infrastructure/database/entity/enum/RoleType.kt
(1 hunks)src/main/kotlin/com/dobby/backend/infrastructure/gateway/TokenGatewayImpl.kt
(1 hunks)src/main/kotlin/com/dobby/backend/presentation/api/controller/AuthController.kt
(1 hunks)src/main/kotlin/com/dobby/backend/presentation/api/dto/response/TestMemberSignInResponse.kt
(1 hunks)src/test/kotlin/com/dobby/backend/domain/usecase/GenerateTestTokenTest.kt
(1 hunks)src/test/kotlin/com/dobby/backend/infrastructure/token/JwtTokenProviderTest.kt
(2 hunks)
✅ Files skipped from review due to trivial changes (4)
- src/main/kotlin/com/dobby/backend/infrastructure/database/entity/enum/RoleType.kt
- src/main/kotlin/com/dobby/backend/domain/usecase/UseCase.kt
- src/main/kotlin/com/dobby/backend/infrastructure/database/entity/common/AuditingEntity.kt
- src/main/kotlin/com/dobby/backend/presentation/api/dto/response/TestMemberSignInResponse.kt
🔇 Additional comments (22)
src/main/kotlin/com/dobby/backend/domain/model/Member.kt (3)
4-4
: 멤버 ID 타입 변경으로 인한 데이터 일관성 확인 필요
String
타입에서 Long
타입으로 변경되어, 숫자 범위 초과 방지와 DB 연동 시 일관성을 충분히 검토해야 합니다.
11-11
: newMember 함수 파라미터 타입 수정
매개변수 타입을 Long
으로 명시하여, ULID와 같은 문자열 식별자 로직이 제거되었습니다. 이후 다른 생성 로직과 호환 여부를 다시 한번 확인하시기 바랍니다.
15-15
: memberId 할당 시 주의
memberId
가 DB나 외부 API에서 넘어오는 값이라면, 무조건 존재하는 값임을 전제로 가정해도 되는지 재확인이 필요합니다.
src/main/kotlin/com/dobby/backend/domain/gateway/TokenGateway.kt (1)
8-9
: 테스트용 토큰 발급 메서드 추가
테스트 목적에 특화된 메서드를 제공함으로써, 실제 회원 정보가 아닌 임시 회원 식별자를 기반으로 토큰을 발급할 수 있게 되었습니다. 보안적으로 잘 구분되어 있는지, 즉 테스트용 토큰이 실제 운영 토큰과 혼동될 여지가 없는지 확인이 필요합니다.
src/main/kotlin/com/dobby/backend/DobbyBackendApplication.kt (1)
6-14
: 컴포넌트 스캔 전략 업데이트
@ComponentScan
으로 UseCase
를 스캔하도록 변경하여, 필요한 빈이 적절히 주입될 것으로 보입니다. 이 설정 변경이 기존 컴포넌트 스캔 구조와 충돌하지 않는지, 그리고 다른 레이어(Controller, Repository 등)도 정상적으로 스캔되는지 확인하세요.
src/main/kotlin/com/dobby/backend/domain/usecase/GenerateTestToken.kt (4)
1-4
: 테스트 토큰 생성 UseCase 정의
domain.usecase
패키지에 새 클래스를 추가하여 책임을 명확히 분리했습니다. 향후 테스트 토큰 외에도 확장이 필요하다면, 다른 UseCase와의 의존성 충돌이 없는지 관리가 중요합니다.
5-7
: TokenGateway 주입 확인
DI(의존성 주입) 구문이 깔끔하며, TokenGateway
의 구체 구현체와도 적절히 연동될 것으로 보입니다.
12-15
: Output 데이터 클래스 설계
accessToken
과 refreshToken
을 분리하여 반환함으로써, 후속 로직에서 각각의 토큰을 명확히 처리할 수 있어 가독성이 높습니다.
17-23
: 토큰 발급 로직 간결화
memberId
만으로 새 토큰을 발급하는 로직이 명확하게 분리되어 있습니다. 별도의 에러 처리(예: memberId가 잘못되었을 때)가 필요하다면, 예외 발생 또는 별도 검증 로직 추가를 고려해 보세요.
src/main/kotlin/com/dobby/backend/presentation/api/controller/AuthController.kt (3)
13-15
: 클래스 주입 방식 확인
GenerateTestToken
의존성을 생성자 파라미터로 주입하여 관리하는 방식이 적절해 보입니다. Spring의 DI 흐름도 명확하게 유지되고 있어 좋습니다.
16-19
: API 문서화 및 파라미터 검증 고려
테스트 토큰 발급 목적과 사용 의도가 명확하게 기술되어 있습니다. 다만 @RequestParam
으로 받는 memberId
범위 및 유효성 검증 로직이 필요할 수 있으니, 혹시 모를 예외 상황(예: 유효하지 않은 memberId
)에 대비해 검증 로직을 고려해보세요.
25-28
: 응답 DTO 명확성
TestMemberSignInResponse
에 accessToken, refreshToken이 분리되어 있어 구조가 명확합니다. 확장 가능성도 좋아 보입니다.
src/test/kotlin/com/dobby/backend/domain/usecase/GenerateTestTokenTest.kt (3)
9-11
: Mock 객체 활용 알맞음
TokenGateway
를 목으로 설정하고 GenerateTestToken
의 실제 동작을 검증하는 방식이 적절합니다. 비즈니스 로직만 테스트하도록 분리되어 있어 테스트 품질이 좋아 보입니다.
13-17
: 테스트 설명 및 시나리오 명시
given("memberId가 주어졌을 때")
와 실제 토큰 문자열 설정은 가독성이 좋습니다. 비즈니스 요구사항을 코드로 잘 표현하고 있습니다.
25-28
: 결과 검증 로직 간결성
실제 생성된 accessToken, refreshToken을 일관성 있게 검사하여 목적에 충실합니다.
src/main/kotlin/com/dobby/backend/infrastructure/gateway/TokenGatewayImpl.kt (2)
29-35
: 테스트용 토큰 생성 로직 분리
generateAccessTokenForTestMember
메서드가 실제 멤버 객체 없이 memberId
만으로 동작하도록 별도로 분리된 점이 뛰어납니다. 테스트 도메인이나 시나리오에서만 필요한 로직을 명확히 구분한 것으로 보이며, 재사용성에도 긍정적 영향을 줍니다.
37-43
: Refresh 토큰 로직 일관성
generateRefreshTokenForTestMember
역시 UsernamePasswordAuthenticationToken
생성을 동일 패턴으로 유지하고 있으므로, 인증 로직에 대한 일관성이 잘 유지됩니다.
src/test/kotlin/com/dobby/backend/infrastructure/token/JwtTokenProviderTest.kt (3)
6-7
: Kotest Matchers 활용
shouldBe
, shouldNotBe
사용으로 테스트가 가독성 좋게 개선되었습니다.
21-28
: Member 객체 변경사항 반영
memberId = 1
과 같이 Long 타입을 직접 주입하여 테스트함으로써 실제 사용 시나리오에 가까운 검증이 가능합니다.
34-44
: 파싱 검증 로직 견고성
토큰 파싱 후 principal
에서 memberId
를 추출해 원본과 비교하는 로직이 명확하고 에러 범위를 잘 커버합니다.
build.gradle.kts (2)
64-64
: 테스트 환경 구성이 적절합니다.
MockK 라이브러리 추가는 코틀린 테스트 작성을 위한 좋은 선택입니다. PR의 목적인 테스트용 토큰 발급 API 구현에 필요한 테스트 작성을 위해 적절한 버전의 의존성이 추가되었습니다.
43-43
: springdoc-openapi 버전 업그레이드 검증 필요
springdoc-openapi 라이브러리의 버전 업그레이드가 기존 API 문서화에 영향을 미치지 않는지 확인이 필요합니다.
✅ Verification successful
springdoc-openapi 2.7.0 버전 업그레이드는 안전합니다
2.5.0에서 2.7.0으로의 업그레이드는 주로 버그 수정과 기능 개선을 포함하고 있으며, 호환성을 깨뜨리는 변경사항은 없습니다. 주요 개선사항:
- Kotlin ByteArray 필드 설명 누락 문제 해결
- RequestBody 메타 어노테이션 지원 추가
- OAS v3.1 웹훅 지원 추가
- 다양한 버그 수정
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Check for breaking changes in springdoc-openapi versions
# Get the changelog or release notes
gh api \
-H "Accept: application/vnd.github+json" \
repos/springdoc/springdoc-openapi/releases | \
jq -r '.[] | select(.tag_name | contains("v2.5") or contains("v2.6") or contains("v2.7")) | .body'
Length of output: 17046
@@ -10,7 +11,7 @@ import java.time.LocalDate | |||
@Entity(name = "member") | |||
@Inheritance(strategy = InheritanceType.JOINED) | |||
@DiscriminatorColumn(name = "role_type") | |||
open class Member ( | |||
class MemberEntity ( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
로직을 구현하면서 알았는데 Entity와 model을 한 클래스에서 불러와 구현해야 하는 경우가 있어, 이름으로 구분을 주기 위해 다시 Entity를 뒤에 붙였습니다!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
저도 이 부분이 우려되어서 초반에 네이밍을 달리했었던 기억이 납니다!
좋은 변화라고 생각합니다
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
SRP 원칙이 잘 준수된 것 같습니다. 구현량이 많으셨을 텐데 짧은 시간 내에 꼼꼼하게 잘 구현해주셔서 감사합니다
미리 리뷰 남깁니다.
LGTM
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
저희 요구사항에서는 RoleType이 RESEARCHER, PARTICIPANT로 구분된다는 점 참고 부탁드립니다
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 부분 아까 알아채서 최근 커밋에서 고쳤습니다! 좋은 지적 감사합니다👍🏻
@@ -10,7 +11,7 @@ import java.time.LocalDate | |||
@Entity(name = "member") | |||
@Inheritance(strategy = InheritanceType.JOINED) | |||
@DiscriminatorColumn(name = "role_type") | |||
open class Member ( | |||
class MemberEntity ( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
저도 이 부분이 우려되어서 초반에 네이밍을 달리했었던 기억이 납니다!
좋은 변화라고 생각합니다
* feat: define domain models and enums for the project - 프로젝트의 핵심 데이터를 표현하는 엔티티 클래스 정의 - 표준화를 위한 enum 클래스 구현 - 프로젝트 확장성과 명확성을 위한 기본 도메인 설계 완료 * refact: update domain structures for refactoring - `AuditingEntityListener` 추가 - 기존: 리스트 순차 탐색 ➡️ Map의 key값으로 탐색 개선 - 패키지명 `enums` ➡️ `enum` 으로 변경 * fix: fixing some errors(Member, AuditingEntity) - `AuditingEntity` 변경 내용 추가 - `Member` 의존성 알맞게 주입 * feat: 구글 OAuth 로그인 구현 - Google OAuth 로그인 구현 - 추후 회원가입 로직의 OAuth 정보 받아오는 과정 고려하여, 도메인 클래스 일부 수정 - `.env` 파일 로드를 위한 의존성 파일 추가 * fix: add dotenv libraries - 에러 수정을 위해 빌드 파일에 `dotenv` 라이브러리 추가 * fix: delete import which occurs dependency error * fix: resolve context loading issue with active test profile - 테스트 중 적절한 빈 구성 보장을 위해 `@ActiveProfiles("test")` 추가 - `SecurityFilterChain` 관련 Application Context 로딩 오류 해결 * feat: implement google oauth login - 구글 oauth 로그인 구현 - 구글 oauth token, email, name 정보 가져오도록 설정 * refact: seperate responsibilities according to Clean Architecture principal - Google API 호출 로직을 `FetchGoogleUserInfoUseCase`로 이동하여 책임 분리 개선 - `OauthService` 를 수정하여 사용자 정보 조회를 새로운 UseCase로 위임 * test: test code for Google OAuth login logic, AuditingEntity - 구글 OAuth 로직에 대한 test code 작성: `OauthServiceTest` `FetchGoogleUserInfoTest` - `AuditingEntityTest` 에 대한 test code 작성 - JaCoco 커버리지 테스트에서 AuditingEntityTest 커버리지 0.5로 목표치 미달 → 추후 테스트 커버리지 개선 필요 * test: add OauthMapperTest and MemberServiceTest for refact test coverage - `OauthMapperTest` 테스트 코드 추가 - `MemberServiceTest` 테스트 코드 추가 - `AuditingEntityTest` → 테스트 커버리지 50%로 목표치 70% 달성 실패, 추후 개선 필요 * feat : add Google OAuth integration - Google OAuth 연동을 위한 `GoogleAuthFeignClient` 추가 - 사용자 정보를 가져오는 `GoogleUserInfoFeignClient` 구현 - GoogleTokenRequest 및 GoogleTokenResponse DTO 정의 - OauthLoginResponse에 사용자 정보 및 accessToken, refreshToken 포함 - 기존 WebClientConfig 삭제 → FeignClient로 대체 * fix: add dependency code and custom exception code - Google OAuth 로그인 시도 시 발생할 수 있는 예외처리 - Application에 FeignClient 설정 * fix: adjust things to build safely * refact: update test codes to satisfy the newly requirement * refact: reflect pr reviews and update changes - 중복된 선언: `@Repository` 어노테이션 제거 - SwaggerConfig 가독성 개선 * refact: reflect code from reviews - 빌드 파일에 중복된 의존성 제거 - `OAuthController` 제거 → `AuthController` 로 통일 - 파일 끝에 EOF 추가
Quality Gate passedIssues Measures |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OAuthLoginResponse
형태를 해당 PR에서 사용한 Response와 일치하도록 수정했습니다. 새로 추가된 커밋들은 대부분 conflicts 해결한 부분들이라 OAuthLoginResponse
부분만 확인해주시면 좋겠습니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
UseCase interface로 책임 분리해주셔서 감사했습니다!
덕분에 책임 분리된 코드로 잘 리팩토링된 것 같아요~
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
제 담당이었던 직전 PR에서 작업 중간에 수정된 부분이 많아서 번거로우셨을텐데 conflict 해결을 잘해주셔서 감사합니다!
수고하셨어요 👍👍
💡 작업 내용
✅ 셀프 체크리스트
🙋🏻 확인해주세요
🔗 Jira 티켓
https://yappsocks.atlassian.net/browse/YS-65
Summary by CodeRabbit
의존성 업데이트
새로운 기능
내부 구조 변경