Refactor/KD-53 로그인 응답 필드 추가 및 논문,자격증 조회 API 추가,ScheduleQueryService 전체 조회시 일정 타입순서로 출력하도록 변경#300
Refactor/KD-53 로그인 응답 필드 추가 및 논문,자격증 조회 API 추가,ScheduleQueryService 전체 조회시 일정 타입순서로 출력하도록 변경#300
Conversation
|
Important Review skippedAuto incremental reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the You can disable this status message by setting the WalkthroughCertificate와 Thesis의 상세 조회 API를 추가하고, 인증 토큰 응답에 역할과 졸업 유형을 포함시키며, 관련 쿼리 서비스와 도메인 엔티티를 확장합니다. Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes
Possibly related issues
Possibly related PRs
Suggested reviewers
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Test Coverage Report
Files
|
There was a problem hiding this comment.
Actionable comments posted: 4
🧹 Nitpick comments (10)
aics-api/src/main/resources/db/schema.sql (2)
120-120: 배열 값 사이의 공백 일관성을 개선하세요.
'NEWS','GRADUATION'부분에서 쉼표 뒤에 공백이 누락되었습니다. 같은 줄의 다른 값들('NOTIFICATION', 'NEWS')과의 일관성을 위해 공백을 추가하는 것이 좋습니다.🔎 제안하는 수정
- (ARRAY ['NOTIFICATION', 'NEWS','GRADUATION'])), + (ARRAY ['NOTIFICATION', 'NEWS', 'GRADUATION'])),
118-120: 데이터베이스 제약 조건 업데이트가 도메인 모델과 일치합니다.
post_category_check제약 조건에GRADUATION값이 추가되어 Category enum의 변경사항과 정확히 일치합니다.참고: 이 파일은 전체 스키마 정의이므로, 기존 데이터베이스 환경에는 별도의 마이그레이션 스크립트가 필요할 수 있습니다. 제약 조건 수정을 위한 ALTER TABLE 문이 마이그레이션 계획에 포함되어 있는지 확인하시기 바랍니다.
aics-domain/src/main/java/kgu/developers/domain/schedule/application/query/ScheduleQueryService.java (1)
27-32: 정렬 로직이 올바르게 구현되었습니다.일정 타입별 고정 순서로 정렬하는 로직이 정상적으로 동작합니다. 다만 ORDER 리스트에 모든 SubmissionType 값이 포함되어 있어야 올바르게 작동합니다.
선택적 성능 개선 제안
현재 구현은 정렬 시 매번
ORDER.indexOf()를 호출하여 O(n) 비용이 발생합니다. 일정 데이터가 많아질 경우, 위에서 제안한EnumMap방식을 사용하면 O(1) 조회로 성능을 개선할 수 있습니다.현재 ORDER 크기(6개)와 예상 일정 개수를 고려할 때 성능상 큰 문제는 없지만, 향후 확장성을 위해 고려해볼 수 있습니다.
aics-api/src/main/java/kgu/developers/api/thesis/presentation/response/ThesisDetailResponse.java (2)
15-18: @Schema 어노테이션의 포맷팅 일관성 부족
example속성 뒤에 쉼표 다음 공백이 누락되어 있습니다.🔎 제안하는 수정
- @Schema(description = "졸업 논문 관련 일정 ID",example = "2",requiredMode = REQUIRED) + @Schema(description = "졸업 논문 관련 일정 ID", example = "2", requiredMode = REQUIRED) Long scheduleId, - @Schema(description = "승인 여부", example = "false",requiredMode = REQUIRED) + @Schema(description = "승인 여부", example = "false", requiredMode = REQUIRED) boolean approval,
27-34: 메서드 시그니처 및 삼항 연산자 포맷팅쉼표 뒤에 공백을 추가하면 가독성이 향상됩니다.
🔎 제안하는 수정
- public static ThesisDetailResponse from(Thesis thesis,String physicalPath) { + public static ThesisDetailResponse from(Thesis thesis, String physicalPath) { return ThesisDetailResponse.builder() .id(thesis.getId()) .scheduleId(thesis.getScheduleId()) .approval(thesis.isApproved()) - .thesisFile(thesis.getThesisFileId() != null - ? FilePathResponse.of(thesis.getThesisFileId(),physicalPath): null) + .thesisFile(thesis.getThesisFileId() != null + ? FilePathResponse.of(thesis.getThesisFileId(), physicalPath) : null) .build(); }aics-auth/src/testFixtures/java/auth/application/AuthServiceTest.java (2)
16-16: 명시적인 임포트 사용을 고려하세요.와일드카드 임포트(
import mock.repository.*)는 사용되는 구체적인 Mock 리포지토리들을 숨겨 코드 가독성을 저하시킵니다. 테스트 픽스처에서 여러 Mock 리포지토리를 사용하는 경우이긴 하지만, 명시적인 임포트를 사용하면 의존성 추적이 더 명확해집니다.🔎 명시적 임포트로 변경하는 제안
-import mock.repository.*; +import mock.repository.FakeUserRepository; +import mock.repository.FakeRefreshTokenRepository; +import mock.repository.FakeGraduationUserRepository; +import mock.repository.FakeThesisRepository; +import mock.repository.FakeCertificateRepository;
65-80: 테스트에서 새로운 TokenResponse 필드를 검증하도록 개선하세요.
login_Success테스트가 예외가 발생하지 않는지만 확인하고 있습니다. TokenResponse에 새롭게 추가된role과graduationType필드의 존재와 정확성을 검증하는 어서션을 추가하는 것이 좋습니다.🔎 TokenResponse 필드 검증을 추가하는 제안
@Test @DisplayName("login은 토큰을 발급할 수 있다") public void login_Success() { // given String userId = "202411345"; String password = "password1234"; - // when - // then - assertThatCode(() -> authService.login( + // when + TokenResponse response = authService.login( LoginRequest.builder() .userId(userId) .password(password) - .build()) - ).doesNotThrowAnyException(); + .build()); + + // then + assertThat(response).isNotNull(); + assertThat(response.accessToken()).isNotBlank(); + assertThat(response.refreshToken()).isNotBlank(); + assertThat(response.role()).isEqualTo("USER"); + assertThat(response.graduationType()).isNull(); // 또는 예상되는 값으로 설정 }aics-auth/src/main/java/kgu/developers/auth/api/application/AuthService.java (2)
42-44: 코드 포맷팅을 개선하세요.TokenResponse.of 호출 시 파라미터 사이에 공백이 누락되어 있습니다. 일관된 코드 포맷팅을 위해 쉼표 뒤에 공백을 추가하세요.
🔎 포맷팅 개선 제안
GraduationType graduationType = graduationUserQueryService.getGraduationTypeByUserId(userId); refreshTokenRepository.save(RefreshToken.of(userId, refreshToken)); - return TokenResponse.of(accessToken, refreshToken,role,graduationType); + return TokenResponse.of(accessToken, refreshToken, role, graduationType);
60-61: 코드 포맷팅을 개선하세요.TokenResponse.of 호출 시 파라미터 사이에 공백이 누락되어 있습니다. 일관된 코드 포맷팅을 위해 쉼표 뒤에 공백을 추가하세요.
🔎 포맷팅 개선 제안
GraduationType graduationType = graduationUserQueryService.getGraduationTypeByUserId(userId); - return TokenResponse.of(accessToken, refreshToken,role,graduationType); + return TokenResponse.of(accessToken, refreshToken, role, graduationType);aics-auth/src/main/java/kgu/developers/auth/api/presentation/response/TokenResponse.java (1)
18-22: 포맷팅 수정이 필요하지만 전반적으로 좋습니다.role과 graduationType 필드가 적절하게 추가되었습니다. graduationType을 NOT_REQUIRED로 표시한 것은 null 값이 가능하다는 점에서 올바른 결정입니다.
그러나 21번 라인에 포맷팅 문제가 있습니다.
🔎 포맷팅 개선 제안
- @Schema(description = "졸업타입", example = "THESIS", requiredMode =NOT_REQUIRED) + @Schema(description = "졸업타입", example = "THESIS", requiredMode = NOT_REQUIRED)
📜 Review details
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (18)
aics-api/src/main/java/kgu/developers/api/certificate/application/CertificateFacade.javaaics-api/src/main/java/kgu/developers/api/certificate/presentation/CertificateController.javaaics-api/src/main/java/kgu/developers/api/certificate/presentation/CertificateControllerImpl.javaaics-api/src/main/java/kgu/developers/api/certificate/presentation/response/CertificateDetailResponse.javaaics-api/src/main/java/kgu/developers/api/thesis/application/ThesisFacade.javaaics-api/src/main/java/kgu/developers/api/thesis/presentation/ThesisController.javaaics-api/src/main/java/kgu/developers/api/thesis/presentation/ThesisControllerImpl.javaaics-api/src/main/java/kgu/developers/api/thesis/presentation/response/ThesisDetailResponse.javaaics-api/src/main/resources/db/schema.sqlaics-auth/src/main/java/kgu/developers/auth/api/application/AuthService.javaaics-auth/src/main/java/kgu/developers/auth/api/presentation/response/TokenResponse.javaaics-auth/src/testFixtures/java/auth/application/AuthServiceTest.javaaics-common/src/main/java/kgu/developers/common/config/SecurityConfig.javaaics-domain/src/main/java/kgu/developers/domain/certificate/application/query/CertificateQueryService.javaaics-domain/src/main/java/kgu/developers/domain/graduationUser/application/query/GraduationUserQueryService.javaaics-domain/src/main/java/kgu/developers/domain/post/domain/Category.javaaics-domain/src/main/java/kgu/developers/domain/schedule/application/query/ScheduleQueryService.javaaics-domain/src/main/java/kgu/developers/domain/thesis/application/query/ThesisQueryService.java
🧰 Additional context used
🧬 Code graph analysis (3)
aics-domain/src/main/java/kgu/developers/domain/thesis/application/query/ThesisQueryService.java (1)
aics-domain/src/main/java/kgu/developers/domain/thesis/exception/ThesisNotFoundException.java (1)
ThesisNotFoundException(7-11)
aics-auth/src/main/java/kgu/developers/auth/api/presentation/response/TokenResponse.java (1)
aics-auth/src/main/java/kgu/developers/auth/api/presentation/AuthControllerImpl.java (1)
Builder(16-40)
aics-domain/src/main/java/kgu/developers/domain/certificate/application/query/CertificateQueryService.java (1)
aics-domain/src/main/java/kgu/developers/domain/certificate/exception/CertificateNotFoundException.java (1)
CertificateNotFoundException(7-11)
🔇 Additional comments (17)
aics-domain/src/main/java/kgu/developers/domain/post/domain/Category.java (1)
11-11: 졸업 카테고리 추가가 올바르게 구현되었습니다.새로운
GRADUATIONenum 상수가 기존 패턴과 일관되게 추가되었으며, 문법적으로도 정확합니다.aics-domain/src/main/java/kgu/developers/domain/schedule/application/query/ScheduleQueryService.java (2)
10-13: LGTM!정렬 로직 구현에 필요한 import 문들이 올바르게 추가되었습니다.
19-26: ORDER 리스트에 모든 SubmissionType enum 값이 포함되어 있습니다. 검증 결과 SubmissionType 열거형의 6개 값(SUBMITTED, MIDTHESIS, FINALTHESIS, CERTIFICATE, APPROVED, OTHER) 모두가 ORDER 리스트에 정확히 동일한 순서로 정의되어 있습니다. 따라서 indexOf()가 -1을 반환하는 상황은 발생하지 않으며, 현재 구현은 올바르게 작동합니다.Likely an incorrect or invalid review comment.
aics-domain/src/main/java/kgu/developers/domain/certificate/application/query/CertificateQueryService.java (1)
3-3: 구현이 깔끔하고 일관성이 있습니다.기존
isApproved메서드와 동일한 패턴을 따르며, 적절한 예외 처리가 되어 있습니다.Also applies to: 18-21
aics-api/src/main/java/kgu/developers/api/thesis/presentation/ThesisControllerImpl.java (1)
5-5: REST API 엔드포인트가 올바르게 구현되었습니다.Facade 계층으로의 위임이 적절하며, 기존 POST 엔드포인트와 일관된 구조를 가지고 있습니다.
Also applies to: 9-9, 31-35
aics-domain/src/main/java/kgu/developers/domain/thesis/application/query/ThesisQueryService.java (1)
3-3: 구현이 CertificateQueryService와 일관성 있게 작성되었습니다.동일한 패턴을 따르며, 적절한 예외 처리와 소프트 삭제 체크가 구현되어 있습니다.
Also applies to: 18-21
aics-api/src/main/java/kgu/developers/api/certificate/presentation/CertificateController.java (1)
5-7: API 인터페이스가 적절하게 정의되었습니다.Swagger 문서화가 완료되어 있으며, ThesisController와 일관된 패턴을 따릅니다.
Also applies to: 40-49
aics-api/src/main/java/kgu/developers/api/certificate/presentation/CertificateControllerImpl.java (1)
6-8: 엔드포인트 구현이 깔끔하고 인터페이스 계약을 올바르게 따릅니다.Facade 계층으로의 위임이 적절하며, ThesisControllerImpl과 동일한 패턴을 유지합니다.
Also applies to: 33-37
aics-api/src/main/java/kgu/developers/api/thesis/presentation/ThesisController.java (1)
5-7: API 인터페이스 정의가 적절합니다.Swagger 문서화가 완료되어 있고, CertificateController와 일관된 구조를 가지고 있습니다.
Also applies to: 39-49
aics-api/src/main/java/kgu/developers/api/certificate/presentation/response/CertificateDetailResponse.java (1)
11-27: 응답 객체 구조가 잘 설계되었습니다.Builder 패턴과 정적 팩토리 메서드를 적절히 활용하고 있으며, null 처리도 올바르게 구현되어 있습니다.
Also applies to: 29-38
aics-api/src/main/java/kgu/developers/api/certificate/application/CertificateFacade.java (1)
34-40: LGTM!
getById메서드의 로직이 올바르게 구현되었습니다.certificateFileId에 대한 null 체크와 조건부 파일 경로 조회 패턴이 적절합니다.메서드 시그니처의 쉼표 뒤에 공백 추가를 권장합니다:
getById(Long id)→ 이미 괜찮음, 단 일관성을 위해 코드 전반의 포맷팅 스타일 통일을 고려해 주세요.aics-api/src/main/java/kgu/developers/api/thesis/application/ThesisFacade.java (1)
40-46: LGTM!
CertificateFacade.getById와 동일한 패턴을 따르고 있어 코드 일관성이 좋습니다.thesisFileIdnull 체크 및 조건부 파일 경로 조회 로직이 적절합니다.aics-auth/src/testFixtures/java/auth/application/AuthServiceTest.java (2)
4-5: 새로운 의존성 임포트가 적절합니다.GraduationUserQueryService와 GraduationUserExcelImpl 임포트가 테스트 픽스처 설정에 필요하며 올바르게 추가되었습니다.
42-47: GraduationUserQueryService 의존성 주입이 올바릅니다.모든 필요한 Fake 리포지토리들(FakeGraduationUserRepository, FakeThesisRepository, FakeCertificateRepository)과 GraduationUserExcelImpl을 포함하여 GraduationUserQueryService가 적절하게 구성되었습니다.
aics-auth/src/main/java/kgu/developers/auth/api/application/AuthService.java (1)
8-9: 새로운 GraduationUserQueryService 의존성이 적절하게 추가되었습니다.졸업 유형 정보를 조회하기 위한 GraduationUserQueryService 의존성이 올바르게 추가되었습니다.
Also applies to: 28-28
aics-auth/src/main/java/kgu/developers/auth/api/presentation/response/TokenResponse.java (2)
4-4: 새로운 임포트가 적절합니다.GraduationType과 NOT_REQUIRED 임포트가 새로운 필드를 위해 올바르게 추가되었습니다.
Also applies to: 7-7
25-31: 팩토리 메서드 업데이트가 올바릅니다.
TokenResponse.of메서드가 새로운 role과 graduationType 파라미터를 받도록 올바르게 업데이트되었으며, 빌더를 통해 모든 필드를 적절하게 설정하고 있습니다.
| requiredMode = NOT_REQUIRED) | ||
| FilePathResponse certificateFile | ||
| ) { | ||
| public static CertificateDetailResponse from(Certificate certificate,String physicalPath) { |
There was a problem hiding this comment.
메서드 시그니처의 포맷을 수정해주세요.
파라미터 사이에 공백이 누락되었습니다. certificate,String을 certificate, String으로 수정해주세요.
🔎 포맷 수정 제안
- public static CertificateDetailResponse from(Certificate certificate,String physicalPath) {
+ public static CertificateDetailResponse from(Certificate certificate, String physicalPath) {📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| public static CertificateDetailResponse from(Certificate certificate,String physicalPath) { | |
| public static CertificateDetailResponse from(Certificate certificate, String physicalPath) { |
🤖 Prompt for AI Agents
In
aics-api/src/main/java/kgu/developers/api/certificate/presentation/response/CertificateDetailResponse.java
around line 28, the method signature has a missing space after the comma
("certificate,String"); update the signature to include a space between
parameters ("certificate, String") so it follows standard Java formatting
conventions.
| @RequestPart ThesisSubmitRequest request | ||
| ); | ||
| @Operation(summary = "졸업 논문 개별 조회 API", description = """ | ||
| - Description :논문 id로 조회합니다. |
There was a problem hiding this comment.
문서화 형식을 일관되게 수정해주세요.
"Description :논문" 부분에서 콜론 뒤에 공백이 없습니다. 24-25번 줄의 다른 설명과 일관성을 위해 "Description : 논문"으로 수정해주세요.
🔎 형식 수정 제안
- - Description :논문 id로 조회합니다.
+ - Description : 논문 id로 조회합니다.📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| - Description :논문 id로 조회합니다. | |
| - Description : 논문 id로 조회합니다. |
🤖 Prompt for AI Agents
In
aics-api/src/main/java/kgu/developers/api/thesis/presentation/ThesisController.java
around line 40, the documentation line reads "Description :논문 id로 조회합니다." and is
missing a space after the colon; update it to "Description : 논문 id로 조회합니다." so
it matches the formatting used on lines 24-25 (colon + single space).
aics-common/src/main/java/kgu/developers/common/config/SecurityConfig.java
Outdated
Show resolved
Hide resolved
.../java/kgu/developers/domain/graduationUser/application/query/GraduationUserQueryService.java
Show resolved
Hide resolved
Codecov Report❌ Patch coverage is @@ Coverage Diff @@
## develop #300 +/- ##
=============================================
- Coverage 87.50% 86.56% -0.94%
- Complexity 65 67 +2
=============================================
Files 22 24 +2
Lines 256 268 +12
Branches 15 17 +2
=============================================
+ Hits 224 232 +8
- Misses 19 21 +2
- Partials 13 15 +2
Continue to review full report in Codecov by Sentry.
🚀 New features to boost your workflow:
|
JangYeongHu
left a comment
There was a problem hiding this comment.
LGTM 👍👍
작업이 많았을텐데 수고 많으셨습니다!
Summary
해당 PR에 대한 요약을 작성해주세요.
로그인 토큰을 보내줄때 role,graduationType값을 함께 보내도록 추가하였습니다.
논문 및 자격증 단건 조회 API를 구현하였습니다.
Schedule을 조회할때 수정할때마다 일정 순서가 변경하는 문제때문에 조회시 순서를 고정으로 보내도록 수정하였습니다.
기존 category에 'GRADUATION' 값을 추가해주었습니다.
Tasks
To Reviewer
논문,자격증 테스트 코드가없어 추후 추가 작업을 해야할거같습니다.
Screenshot
(없을 경우 삭제) 작업한 내용에 대한 스크린샷을 첨부해주세요.