-
Notifications
You must be signed in to change notification settings - Fork 0
[CMAT-49] fix: 채용 공고 목록 조회 API 반환 데이터 추가 #30
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
Conversation
Walkthrough이 PR은 다양한 서비스 및 컨버터에서 PageResponseDTO 객체 생성 방식을 직접 인스턴스화에서 빌더 패턴으로 전환하는 개편을 포함합니다. 추천 리크루트 관련 DTO의 명칭을 기존의 Changes
Sequence Diagram(s)sequenceDiagram
participant RC as RecruitController
participant RQS as RecruitQueryService
participant RQP as RecruitQueryRepositoryImpl
participant RCv as RecruitConverter
participant PR as PageResponseDTO Builder
RC->>RQS: getRecommendRecruitList(page, size, sort, member)
RQS->>RQP: findByKeywordWithBooleanBuilder(criteria, pageable)
RQP-->>RQS: Page<Recruit>
RQS->>RCv: toRecommendRecruitsDTO(member, recruitList)
RCv-->>RQS: RecommendRecruitsDTO
RQS->>PR: Builder() [set page, hasNext, totalPages]
PR-->>RQS: PageResponseDTO<RecommendRecruitsDTO>
RQS-->>RC: ApiResponse with PageResponseDTO
Possibly related PRs
Suggested reviewers
Poem
📜 Recent review detailsConfiguration used: CodeRabbit UI 📒 Files selected for processing (1)
🚧 Files skipped from review as they are similar to previous changes (1)
🪧 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: 1
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (9)
src/main/java/UMC/career_mate/domain/content/service/ContentService.java(1 hunks)src/main/java/UMC/career_mate/domain/contentScrap/service/ContentScrapService.java(1 hunks)src/main/java/UMC/career_mate/domain/recruit/controller/RecruitController.java(2 hunks)src/main/java/UMC/career_mate/domain/recruit/converter/RecruitConverter.java(3 hunks)src/main/java/UMC/career_mate/domain/recruit/dto/response/RecommendRecruitDTO.java(0 hunks)src/main/java/UMC/career_mate/domain/recruit/dto/response/RecommendRecruitsDTO.java(1 hunks)src/main/java/UMC/career_mate/domain/recruit/repository/querydsl/RecruitQueryRepositoryImpl.java(1 hunks)src/main/java/UMC/career_mate/domain/recruit/service/RecruitQueryService.java(4 hunks)src/main/java/UMC/career_mate/global/common/PageResponseDTO.java(1 hunks)
💤 Files with no reviewable changes (1)
- src/main/java/UMC/career_mate/domain/recruit/dto/response/RecommendRecruitDTO.java
🔇 Additional comments (11)
src/main/java/UMC/career_mate/global/common/PageResponseDTO.java (2)
3-3: @JsonInclude 어노테이션 추가에 대한 긍정적 평가null 값을 가진 필드를 JSON 응답에서 제외함으로써 응답 크기를 최적화했습니다.
Also applies to: 7-7
11-12: 페이지네이션 관련 필드 개선사항 확인
- Boolean으로 변경하여 null 상태 표현이 가능해졌습니다
- totalPages 필드 추가로 전체 페이지 수 정보를 제공할 수 있게 되었습니다
이러한 변경은 클라이언트 측의 페이지네이션 구현을 더욱 유연하게 만들어줍니다.
src/main/java/UMC/career_mate/domain/recruit/dto/response/RecommendRecruitsDTO.java (2)
21-29: TODO 주석에 대한 후속 조치 필요필터링과 정렬 확인용 임시 데이터 필드들이 있습니다. 테스트 완료 후 정리가 필요합니다.
이 임시 필드들의 정리를 위한 이슈를 생성해드릴까요?
8-11: DTO 구조 설계에 대한 긍정적 평가
- Builder 패턴을 적절히 활용했습니다
- 중첩 레코드를 사용하여 관련 데이터를 논리적으로 그룹화했습니다
- 각 필드의 의미가 명확하게 문서화되어 있습니다
Also applies to: 13-31
src/main/java/UMC/career_mate/domain/recruit/controller/RecruitController.java (2)
31-41: API 문서화가 잘 되어있습니다페이지네이션과 정렬 옵션에 대한 설명이 명확하게 문서화되어 있습니다.
66-72: Deprecated API에 대한 제거 계획 필요@deprecated 어노테이션이 붙은 테스트용 API endpoint가 있습니다. 프로덕션 환경에서는 이러한 테스트용 API를 노출하지 않는 것이 좋습니다.
이 API의 제거 시점을 계획하고 문서화하는 것을 추천드립니다.
src/main/java/UMC/career_mate/domain/content/service/ContentService.java (1)
76-80: 빌더 패턴 적용으로 코드 가독성 향상PageResponseDTO 생성 시 빌더 패턴을 사용하여 객체 생성 코드의 가독성과 유지보수성이 향상되었습니다.
src/main/java/UMC/career_mate/domain/recruit/repository/querydsl/RecruitQueryRepositoryImpl.java (1)
57-66: 페이지네이션 로직 개선다음과 같은 개선사항이 적용되었습니다:
- 정확한 페이지 크기 제한 설정
- 전체 결과 수 계산 추가로 정확한 페이지 수 산출 가능
이러한 변경으로 페이지네이션의 정확성이 향상되었습니다.
src/main/java/UMC/career_mate/domain/recruit/converter/RecruitConverter.java (1)
56-78: DTO 구조 개선 및 변환 로직 명확화다음과 같은 개선사항이 적용되었습니다:
- RecommendRecruitsDTO를 통한 데이터 캡슐화 강화
- 썸네일 정보를 위한 별도의 변환 메서드 추가로 책임 분리
- 빌더 패턴을 통한 객체 생성 가독성 향상
이러한 변경으로 코드의 구조와 유지보수성이 향상되었습니다.
src/main/java/UMC/career_mate/domain/recruit/service/RecruitQueryService.java (2)
63-77: 반환 타입 변경으로 응답 구조 개선메서드의 반환 타입을 RecommendRecruitsDTO로 변경하여 추천 공고 데이터의 구조가 더 명확해졌습니다.
269-282: 페이지네이션 정보 개선 및 변환 로직 최적화다음과 같은 개선사항이 적용되었습니다:
- totalPages 정보 추가로 전체 페이지 수 제공
- 스트림 API를 활용한 깔끔한 변환 로직
- 빌더 패턴을 통한 응답 객체 생성 개선
이러한 변경으로 클라이언트에 더 완성도 높은 페이지네이션 정보를 제공할 수 있게 되었습니다.
| return PageResponseDTO.<List<ContentScrapResponseDTO>>builder() | ||
| .page(page) | ||
| .hasNext(scraps.hasNext()) | ||
| .result(contentList) | ||
| .build(); | ||
| } |
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.
🛠️ Refactor suggestion
PageResponseDTO 생성 시 totalPages 필드 누락
PageResponseDTO에 새로 추가된 totalPages 필드가 설정되지 않았습니다. 클라이언트의 페이지네이션 구현을 위해 이 정보가 필요할 수 있습니다.
다음과 같이 수정을 제안합니다:
return PageResponseDTO.<List<ContentScrapResponseDTO>>builder()
.page(page)
.hasNext(scraps.hasNext())
+ .totalPages(scraps.getTotalPages())
.result(contentList)
.build();📝 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.
| return PageResponseDTO.<List<ContentScrapResponseDTO>>builder() | |
| .page(page) | |
| .hasNext(scraps.hasNext()) | |
| .result(contentList) | |
| .build(); | |
| } | |
| return PageResponseDTO.<List<ContentScrapResponseDTO>>builder() | |
| .page(page) | |
| .hasNext(scraps.hasNext()) | |
| .totalPages(scraps.getTotalPages()) | |
| .result(contentList) | |
| .build(); | |
| } |
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: 1
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
src/main/java/UMC/career_mate/domain/member/service/MemberService.java(4 hunks)
🔇 Additional comments (2)
src/main/java/UMC/career_mate/domain/member/service/MemberService.java (2)
3-4: 새로운 의존성 추가에 대한 검토가 필요합니다.GPT 답변 관련 기능이 회원 서비스에 추가되었습니다. 이는 단일 책임 원칙(SRP)에 영향을 미칠 수 있으므로, 이 통합의 필요성과 적절성을 검토해야 합니다.
Also applies to: 14-14, 17-17
32-32: 의존성 주입이 적절히 구성되었습니다.
@RequiredArgsConstructor와 함께private final필드로 선언되어 있어 적절한 의존성 주입이 이루어질 것입니다.
| gptAnswerRepository.findByMember(member).ifPresent( | ||
| gptAnswer -> gptAnswer.updateData(RecruitKeyword.getRecruitKeywordFromProfileJob(job), 0) | ||
| ); |
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.
🛠️ Refactor suggestion
프로필 변경 시 GPT 답변 데이터 업데이트 로직 검토가 필요합니다.
다음 사항들을 고려해주세요:
- GPT 답변 업데이트가 실패할 경우의 예외 처리가 없습니다.
- 업데이트 값으로 하드코딩된 0이 사용되고 있습니다.
- 트랜잭션 범위 내에서 이 작업이 실패할 경우의 롤백 처리가 명확하지 않습니다.
다음과 같이 개선하는 것을 제안드립니다:
- gptAnswerRepository.findByMember(member).ifPresent(
- gptAnswer -> gptAnswer.updateData(RecruitKeyword.getRecruitKeywordFromProfileJob(job), 0)
- );
+ try {
+ gptAnswerRepository.findByMember(member).ifPresent(gptAnswer -> {
+ RecruitKeyword keyword = RecruitKeyword.getRecruitKeywordFromProfileJob(job);
+ gptAnswer.updateData(keyword, GptAnswer.DEFAULT_INITIAL_VALUE);
+ });
+ } catch (Exception e) {
+ log.error("GPT 답변 업데이트 중 오류 발생: {}", e.getMessage());
+ throw new GeneralException(CommonErrorCode.GPT_ANSWER_UPDATE_FAILED);
+ }📝 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.
| gptAnswerRepository.findByMember(member).ifPresent( | |
| gptAnswer -> gptAnswer.updateData(RecruitKeyword.getRecruitKeywordFromProfileJob(job), 0) | |
| ); | |
| try { | |
| gptAnswerRepository.findByMember(member).ifPresent(gptAnswer -> { | |
| RecruitKeyword keyword = RecruitKeyword.getRecruitKeywordFromProfileJob(job); | |
| gptAnswer.updateData(keyword, GptAnswer.DEFAULT_INITIAL_VALUE); | |
| }); | |
| } catch (Exception e) { | |
| log.error("GPT 답변 업데이트 중 오류 발생: {}", e.getMessage()); | |
| throw new GeneralException(CommonErrorCode.GPT_ANSWER_UPDATE_FAILED); | |
| } |
#️⃣ 요약 설명
📝 작업 내용
// 핵심 코드를 붙여넣기 해주세요코드에 대한 간단한 설명 부탁드립니다.
동작 확인
💬 리뷰 요구사항(선택)
Summary by CodeRabbit
Refactor
New Features