Conversation
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (3)
📝 WalkthroughWalkthrough로드맵 생성에 다국어 번역을 도입했습니다. 영문/베트남어/중국어 대상으로 Google Translate를 호출해 번역을 생성·저장하고, 기존 서비스들을 로케일 기반 조회로 업데이트했으며 비동기 RoadmapAsyncService를 제거했습니다. Changes
Sequence Diagram(s)sequenceDiagram
actor Client
participant MemberController
participant RoadMapService
participant RoadMapPersistService
participant Database
participant RoadmapTranslationService
participant GoogleTranslationService
participant RoadmapTranslationPersistService
Client->>MemberController: POST /roadmap/generate
MemberController->>RoadMapService: createRoadmap(memberId)
RoadMapService->>RoadMapPersistService: saveRoadMap(member, response)
RoadMapPersistService->>Database: save phases/actions/guidelines/mistakes/actionItems
RoadMapPersistService-->>RoadMapService: RoadmapTranslationTarget
RoadMapService-->>MemberController: RoadmapTranslationTarget
par 번역 비동기 처리
MemberController->>RoadmapTranslationService: translateAllLanguages(target)
loop 각 언어 (en, vi, zh-CN)
RoadmapTranslationService->>GoogleTranslationService: translate(target, language)
GoogleTranslationService->>GoogleTranslationService: call Google Translate API
GoogleTranslationService-->>RoadmapTranslationService: translated Target
RoadmapTranslationService->>RoadmapTranslationPersistService: saveTranslations(translated, language)
RoadmapTranslationPersistService->>Database: delete old translations, insert new translations
end
end
MemberController-->>Client: HTTP 200
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60분 Possibly related PRs
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
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 |
There was a problem hiding this comment.
Actionable comments posted: 8
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
src/main/java/org/sopt/kareer/domain/roadmap/service/RoadMapService.java (1)
45-49:⚠️ Potential issue | 🟡 Minor불필요한 null 체크 (데드 코드)
orElseThrow()가 호출되면visa가null일 수 없습니다. 45번 라인에서 예외를 던지므로 47-49번 라인의 null 체크는 절대 true가 될 수 없는 데드 코드입니다.🐛 제안된 수정
MemberVisa visa = memberVisaRepository.findActiveByMemberId(memberId).orElseThrow(() -> new MemberException(MemberErrorCode.VISA_NOT_FOUND)); -List<Document> visaDocs = (visa == null) - ? List.of() - : requiredRetriever.retrieveVisaAll(visa); +List<Document> visaDocs = requiredRetriever.retrieveVisaAll(visa);🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/main/java/org/sopt/kareer/domain/roadmap/service/RoadMapService.java` around lines 45 - 49, The null-check after calling memberVisaRepository.findActiveByMemberId(...).orElseThrow(...) is dead code because orElseThrow guarantees visa is non-null; remove the ternary/conditional using visa and instead directly call requiredRetriever.retrieveVisaAll(visa) after obtaining MemberVisa visa (reference symbols: MemberVisa, memberVisaRepository.findActiveByMemberId, requiredRetriever.retrieveVisaAll, variable visa) so the code is simplified and the unreachable branch is eliminated.
🧹 Nitpick comments (7)
src/main/java/org/sopt/kareer/domain/roadmap/entity/PhaseActionMistakeTranslation.java (1)
23-24: 언어 태그 컬럼 길이가 다국어 확장에 다소 타이트합니다.Line 23의
length = 10은 일부 locale tag 확장 케이스에서 부족할 수 있습니다. 스키마를 조금 넉넉히 잡아두는 편이 안전합니다.🔧 제안 변경안
- `@Column`(nullable = false, length = 10) + `@Column`(nullable = false, length = 35) private String language;🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/main/java/org/sopt/kareer/domain/roadmap/entity/PhaseActionMistakeTranslation.java` around lines 23 - 24, The language column on PhaseActionMistakeTranslation is too short (length = 10) for some RFC-style locale tags; update the `@Column` on the field named "language" in class PhaseActionMistakeTranslation to use a larger length (e.g., length = 35) to safely accommodate extended locale tags while keeping nullable = false.src/main/java/org/sopt/kareer/global/external/ai/prompt/JobPostingRecommendPrompt.java (1)
33-35: 불필요한.formatted()호출템플릿 문자열에 포맷 지정자가 없으므로
.formatted()호출이 불필요합니다. 단순히 상수를 반환하거나, 향후 동적 값 삽입을 위해 의도적으로 유지하는 것이라면 주석으로 명시하는 것이 좋습니다.♻️ 제안된 수정
public static String buildSystemPrompt() { - return JOB_POSTING_SYSTEM_PROMPT_TEMPLATE.formatted(); + return JOB_POSTING_SYSTEM_PROMPT_TEMPLATE; }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/main/java/org/sopt/kareer/global/external/ai/prompt/JobPostingRecommendPrompt.java` around lines 33 - 35, The method buildSystemPrompt unnecessarily calls .formatted() on JOB_POSTING_SYSTEM_PROMPT_TEMPLATE which has no format specifiers; remove the .formatted() and return JOB_POSTING_SYSTEM_PROMPT_TEMPLATE directly in buildSystemPrompt(), or if you intentionally keep .formatted() for future interpolation, add a clarifying comment above buildSystemPrompt() referencing JOB_POSTING_SYSTEM_PROMPT_TEMPLATE to indicate that intent.src/main/java/org/sopt/kareer/domain/roadmap/service/ActionItemService.java (1)
69-69: 불필요한 변수 재할당입니다.
translationMap은 이미 effectively final이므로finalTranslationMap으로 복사할 필요가 없습니다.♻️ 불필요한 변수 제거
- final Map<Long, ActionItemTranslation> finalTranslationMap = translationMap; - List<ActionItemResponse> visaActionItems = activeActionItems.stream() .filter(item -> item.getActionsType() == ActionItemType.VISA) - .map(item -> toResponse(item, finalTranslationMap)) + .map(item -> toResponse(item, translationMap)) .toList(); List<ActionItemResponse> careerActionItems = activeActionItems.stream() .filter(item -> item.getActionsType() == ActionItemType.CAREER) - .map(item -> toResponse(item, finalTranslationMap)) + .map(item -> toResponse(item, translationMap)) .toList();🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/main/java/org/sopt/kareer/domain/roadmap/service/ActionItemService.java` at line 69, Remove the unnecessary reassignment to finalTranslationMap in ActionItemService: use the existing effectively-final translationMap directly wherever finalTranslationMap is referenced, delete the finalTranslationMap declaration/assignment, and ensure no subsequent code relies on that duplicate variable name (update references to translationMap if needed).src/main/java/org/sopt/kareer/domain/roadmap/service/RoadMapPersistService.java (1)
62-84: 개별 save() 호출을 batch 저장으로 최적화할 수 있습니다.현재
PhaseActionGuideline,PhaseActionMistake,ActionItem을 반복문 내에서 개별적으로 저장하고 있습니다. 엔티티 수가 많아지면 N+1 형태의 INSERT 쿼리가 발생할 수 있습니다.♻️ saveAll()을 사용한 batch 저장 제안
각 PhaseAction별로 guideline, mistake, actionItem 리스트를 모아서 한 번에 저장하는 방식을 고려해 보세요:
// 예시: guidelines 저장 최적화 List<PhaseActionGuideline> guidelinesToSave = new ArrayList<>(); for (String g : Optional.ofNullable(phaseActionPlan.guideline()).orElse(Collections.emptyList())) { guidelinesToSave.add(PhaseActionGuideline.create(g, savedPhaseAction)); } List<PhaseActionGuideline> savedGuidelines = phaseActionGuidelineRepository.saveAll(guidelinesToSave); List<RoadmapTranslationTarget.GuidelineTarget> guidelineTargets = savedGuidelines.stream() .map(saved -> new RoadmapTranslationTarget.GuidelineTarget(saved.getId(), saved.getContent())) .toList();🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/main/java/org/sopt/kareer/domain/roadmap/service/RoadMapPersistService.java` around lines 62 - 84, Collect the entities for each PhaseAction before persisting and replace the per-item repository.save calls with batch saves using saveAll: build lists of PhaseActionGuideline, PhaseActionMistake, and ActionItem (using PhaseActionGuideline.create(...), PhaseActionMistake.create(...), ActionItem.create(...)) for the current savedPhaseAction/member, call phaseActionGuidelineRepository.saveAll(...), phaseActionMistakeRepository.saveAll(...), and actionItemRepository.saveAll(...), then map the returned saved entities to RoadmapTranslationTarget.GuidelineTarget, MistakeTarget, and ActionItemTarget (using saved.getId() and the original content/title) so you still populate guidelineTargets, mistakeTargets, and actionItemTargets without per-item INSERTs.src/main/java/org/sopt/kareer/domain/roadmap/service/RoadmapTranslationService.java (1)
38-38:CompletableFuture.allOf()의 결과가 사용되지 않습니다.현재 fire-and-forget 패턴으로 동작하며, 이것이 의도된 것이라면 괜찮습니다. 하지만 코드의 의도를 명확히 하기 위해 결과를 명시적으로 무시하거나 주석을 추가하는 것이 좋습니다.
♻️ 의도를 명확히 하는 방법
- CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])); + // Fire-and-forget: 비동기 번역은 응답에 영향을 주지 않음 + CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));또는 완료를 기다려야 한다면:
- CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])); + CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/main/java/org/sopt/kareer/domain/roadmap/service/RoadmapTranslationService.java` at line 38, The call to CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])) in RoadmapTranslationService is currently fire-and-forget and its result is discarded; either explicitly handle it (e.g., assign to a CompletableFuture variable and call join()/get() or use .thenApply/.exceptionally to handle completion/errors) or make the intent explicit by adding a comment or using CompletableFuture.allOf(...).join() to block until all futures in the futures collection complete; locate the call in class RoadmapTranslationService where the futures variable is used and update it accordingly to either wait for completion or clearly document the intentional non-blocking behavior.src/main/java/org/sopt/kareer/domain/roadmap/service/PhaseService.java (1)
133-133: 불필요한 변수 재할당입니다.
translationMap은 이미 effectively final입니다.♻️ 불필요한 변수 제거
- final Map<Long, PhaseActionTranslation> finalTranslationMap = translationMap; List<HomePhaseDetailResponse.HomePhaseActionResponse> actionResponses = phaseActions.stream() .map(pa -> { - PhaseActionTranslation t = finalTranslationMap.get(pa.getId()); + PhaseActionTranslation t = translationMap.get(pa.getId());🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/main/java/org/sopt/kareer/domain/roadmap/service/PhaseService.java` at line 133, The assignment creating finalTranslationMap from translationMap in PhaseService is unnecessary because translationMap is already effectively final; remove the redundant finalTranslationMap declaration and update subsequent references to use translationMap directly (search for finalTranslationMap usages in the PhaseService method and replace them with translationMap).src/main/java/org/sopt/kareer/domain/roadmap/service/RoadmapTranslationPersistService.java (1)
47-74: 대량 저장은saveAll/batching으로 묶는 편이 좋습니다.지금은 phase/action/guideline/mistake/action-item마다 개별
save()를 호출해서 번역 수만큼 insert round-trip이 생깁니다. 언어별 저장을 병렬로 태우는 흐름이면 이 메서드가 DB write hot path가 되기 쉬워서, 타입별로 엔티티를 모아saveAll()과 JDBC batching을 같이 쓰는 쪽을 권합니다.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/main/java/org/sopt/kareer/domain/roadmap/service/RoadmapTranslationPersistService.java` around lines 47 - 74, The loop currently calls repository.save() for each translation (PhaseTranslation, PhaseActionTranslation, PhaseActionGuidelineTranslation, PhaseActionMistakeTranslation, ActionItemTranslation), causing many DB round-trips; instead, accumulate translations into typed lists (e.g., List<PhaseTranslation> phaseTranslations, List<PhaseActionTranslation> actionTranslations, etc.) while iterating over target.phases()/actions(), then call phaseTranslationRepository.saveAll(phaseTranslations), phaseActionTranslationRepository.saveAll(actionTranslations), guidelineTranslationRepository.saveAll(...), mistakeTranslationRepository.saveAll(...), and actionItemTranslationRepository.saveAll(...) once each; ensure JDBC batching is enabled in config (hibernate.jdbc.batch_size) so these saveAll calls are executed as batched inserts.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@src/main/java/org/sopt/kareer/domain/roadmap/service/ActionItemService.java`:
- Around line 62-67: The code uses
LocaleContextHolder.getLocale().toLanguageTag() which yields BCP-47 tags (e.g.,
"en-US") that don't match the short codes in TARGET_LANGUAGES, causing
actionItemTranslationRepository.findAllByActionItem_IdInAndLanguage(...) to
return nothing; change how you derive the language before calling that
repository by normalizing the locale (e.g., use locale.getLanguage() for most
languages and special-case Chinese to "zh-CN" or other mappings used by
RoadmapTranslationService.TARGET_LANGUAGES), add a small helper like
normalizeLanguage(Locale) and replace the current language assignment so
actionItemTranslationRepository.findAllByActionItem_IdInAndLanguage(itemIds,
language) queries the expected codes.
In
`@src/main/java/org/sopt/kareer/domain/roadmap/service/PhaseActionService.java`:
- Around line 61-65: The code in PhaseActionService uses
LocaleContextHolder.getLocale().toLanguageTag() which produces tags like "en-US"
that don't match DB keys (which are "en", "vi", "zh-CN"); create and use a
common normalizer (e.g., LocaleUtils.normalizeLanguageCode(Locale)) that returns
locale.getLanguage() by default and maps "zh" to "zh-CN", then replace
LocaleContextHolder.getLocale().toLanguageTag() with
LocaleUtils.normalizeLanguageCode(LocaleContextHolder.getLocale()) in the call
to
phaseActionTranslationRepository.findByPhaseAction_IdAndLanguage(phaseActionId,
language) so translations resolve consistently (same fix applied as in
ActionItemService).
In `@src/main/java/org/sopt/kareer/domain/roadmap/service/PhaseService.java`:
- Around line 148-150: The currentLanguage() helper returns
LocaleContextHolder.getLocale().toLanguageTag() (e.g., "en-US") which doesn't
match DB keys ("en","vi","zh-CN"); change it to a shared utility (e.g.,
LocaleUtils.getNormalizedLanguage()) and update PhaseService, ActionItemService,
and PhaseActionService to use it: implement getNormalizedLanguage() to return
locale.getLanguage() for most languages, and special-case Chinese to return
"zh-CN" when locale.getCountry() equals "CN" (or other mappings your DB uses),
ensuring returned values exactly match the stored translation keys.
In
`@src/main/java/org/sopt/kareer/domain/roadmap/service/RoadmapTranslationPersistService.java`:
- Around line 34-45: The deletion scope is too
narrow—actionItemTranslationRepository.deleteAllByActionItem_IdInAndLanguage
currently deletes only actionItemIds present in the new target, leaving orphaned
translations when the snapshot shrinks; change the cleanup to delete action-item
translations by the broader actionIds (use actionIds to remove all action items
under those actions) or clear the roadmap/parent scope first, i.e. replace the
actionItem delete call to use actionIds (or add an additional
deleteAllByActionItem_PhaseAction_IdInAndLanguage using actionIds) and ensure
the sequence with
guidelineTranslationRepository.deleteAllByGuideline_PhaseAction_IdInAndLanguage,
mistakeTranslationRepository.deleteAllByMistake_PhaseAction_IdInAndLanguage,
phaseActionTranslationRepository.deleteAllByPhaseAction_IdInAndLanguage and
phaseTranslationRepository.deleteAllByPhase_IdInAndLanguage empties the parent
scope before re-inserting translations.
In
`@src/main/java/org/sopt/kareer/domain/roadmap/service/RoadmapTranslationService.java`:
- Around line 27-38: The async translation tasks started from
RoadmapTranslationService (TARGET_LANGUAGES ->
googleTranslationService.translate -> persistService.saveTranslations) must run
after the parent transaction (e.g., saveRoadMap) commits to avoid
EntityNotFoundException from getReferenceById; fix by moving the invocation out
of the transactional boundary — either register a TransactionSynchronization in
the caller (after saveRoadMap returns) to call the service method that schedules
the CompletableFutures, or convert the scheduling to an application event
handled by a listener annotated with `@TransactionalEventListener`(phase =
AFTER_COMMIT) so translateAllLanguages/translation scheduling only runs after
commit.
In `@src/main/java/org/sopt/kareer/global/external/ai/prompt/RoadmapPrompt.java`:
- Around line 56-57: In RoadmapPrompt, the Korean language directive currently
risks forcing enum-like keys (e.g., status/type/actionsType) into Korean; change
the instruction so it explicitly limits Korean output to
natural-language/content fields only and specify that structural/enum
identifiers (status, type, actionsType, etc.) must remain in English; locate the
Korean-language lines in the RoadmapPrompt class and reword them to say "Only
natural-language content fields should be written in Korean; all structural keys
and enum-like fields (status, type, actionsType, etc.) must be in English,"
ensuring the prompt clearly separates natural-language values from
enum/identifier fields.
In
`@src/main/java/org/sopt/kareer/global/external/google/service/GoogleTranslationService.java`:
- Around line 73-107: The reassemble method risks IndexOutOfBoundsException
because it repeatedly calls translated.get(idx[0]++) without validating bounds;
add a defensive check by creating and using a helper like safeGet(List<String>
translated, int[] idx) inside GoogleTranslationService.reassemble that logs a
warning when idx[0] >= translated.size() and returns a sensible fallback (empty
string or original text) instead of calling get, or alternatively validate total
expected count against translated.size() before the loops (use method names
reassemble and safeGet to locate code and update all translated.get(idx[0]++)
occurrences to call the safe accessor).
- Around line 61-70: The code in GoogleTranslationService that calls
restClient.post(...).retrieve().body(Map.class) assumes the response structure
and can cause NPEs; update the translate call to defensively check the returned
Map for null and expected keys before casting (inspect the variables response,
data, translations and the "translatedText" value), handle HTTP errors from the
REST call (e.g., map non-2xx to a custom exception or wrap the error) and return
a safe fallback (empty list) or throw a clear service exception when keys are
missing or types are unexpected; ensure the method documents/propagates errors
appropriately rather than allowing NullPointerException.
---
Outside diff comments:
In `@src/main/java/org/sopt/kareer/domain/roadmap/service/RoadMapService.java`:
- Around line 45-49: The null-check after calling
memberVisaRepository.findActiveByMemberId(...).orElseThrow(...) is dead code
because orElseThrow guarantees visa is non-null; remove the ternary/conditional
using visa and instead directly call requiredRetriever.retrieveVisaAll(visa)
after obtaining MemberVisa visa (reference symbols: MemberVisa,
memberVisaRepository.findActiveByMemberId, requiredRetriever.retrieveVisaAll,
variable visa) so the code is simplified and the unreachable branch is
eliminated.
---
Nitpick comments:
In
`@src/main/java/org/sopt/kareer/domain/roadmap/entity/PhaseActionMistakeTranslation.java`:
- Around line 23-24: The language column on PhaseActionMistakeTranslation is too
short (length = 10) for some RFC-style locale tags; update the `@Column` on the
field named "language" in class PhaseActionMistakeTranslation to use a larger
length (e.g., length = 35) to safely accommodate extended locale tags while
keeping nullable = false.
In `@src/main/java/org/sopt/kareer/domain/roadmap/service/ActionItemService.java`:
- Line 69: Remove the unnecessary reassignment to finalTranslationMap in
ActionItemService: use the existing effectively-final translationMap directly
wherever finalTranslationMap is referenced, delete the finalTranslationMap
declaration/assignment, and ensure no subsequent code relies on that duplicate
variable name (update references to translationMap if needed).
In `@src/main/java/org/sopt/kareer/domain/roadmap/service/PhaseService.java`:
- Line 133: The assignment creating finalTranslationMap from translationMap in
PhaseService is unnecessary because translationMap is already effectively final;
remove the redundant finalTranslationMap declaration and update subsequent
references to use translationMap directly (search for finalTranslationMap usages
in the PhaseService method and replace them with translationMap).
In
`@src/main/java/org/sopt/kareer/domain/roadmap/service/RoadMapPersistService.java`:
- Around line 62-84: Collect the entities for each PhaseAction before persisting
and replace the per-item repository.save calls with batch saves using saveAll:
build lists of PhaseActionGuideline, PhaseActionMistake, and ActionItem (using
PhaseActionGuideline.create(...), PhaseActionMistake.create(...),
ActionItem.create(...)) for the current savedPhaseAction/member, call
phaseActionGuidelineRepository.saveAll(...),
phaseActionMistakeRepository.saveAll(...), and
actionItemRepository.saveAll(...), then map the returned saved entities to
RoadmapTranslationTarget.GuidelineTarget, MistakeTarget, and ActionItemTarget
(using saved.getId() and the original content/title) so you still populate
guidelineTargets, mistakeTargets, and actionItemTargets without per-item
INSERTs.
In
`@src/main/java/org/sopt/kareer/domain/roadmap/service/RoadmapTranslationPersistService.java`:
- Around line 47-74: The loop currently calls repository.save() for each
translation (PhaseTranslation, PhaseActionTranslation,
PhaseActionGuidelineTranslation, PhaseActionMistakeTranslation,
ActionItemTranslation), causing many DB round-trips; instead, accumulate
translations into typed lists (e.g., List<PhaseTranslation> phaseTranslations,
List<PhaseActionTranslation> actionTranslations, etc.) while iterating over
target.phases()/actions(), then call
phaseTranslationRepository.saveAll(phaseTranslations),
phaseActionTranslationRepository.saveAll(actionTranslations),
guidelineTranslationRepository.saveAll(...),
mistakeTranslationRepository.saveAll(...), and
actionItemTranslationRepository.saveAll(...) once each; ensure JDBC batching is
enabled in config (hibernate.jdbc.batch_size) so these saveAll calls are
executed as batched inserts.
In
`@src/main/java/org/sopt/kareer/domain/roadmap/service/RoadmapTranslationService.java`:
- Line 38: The call to CompletableFuture.allOf(futures.toArray(new
CompletableFuture[0])) in RoadmapTranslationService is currently fire-and-forget
and its result is discarded; either explicitly handle it (e.g., assign to a
CompletableFuture variable and call join()/get() or use
.thenApply/.exceptionally to handle completion/errors) or make the intent
explicit by adding a comment or using CompletableFuture.allOf(...).join() to
block until all futures in the futures collection complete; locate the call in
class RoadmapTranslationService where the futures variable is used and update it
accordingly to either wait for completion or clearly document the intentional
non-blocking behavior.
In
`@src/main/java/org/sopt/kareer/global/external/ai/prompt/JobPostingRecommendPrompt.java`:
- Around line 33-35: The method buildSystemPrompt unnecessarily calls
.formatted() on JOB_POSTING_SYSTEM_PROMPT_TEMPLATE which has no format
specifiers; remove the .formatted() and return
JOB_POSTING_SYSTEM_PROMPT_TEMPLATE directly in buildSystemPrompt(), or if you
intentionally keep .formatted() for future interpolation, add a clarifying
comment above buildSystemPrompt() referencing JOB_POSTING_SYSTEM_PROMPT_TEMPLATE
to indicate that intent.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
Run ID: 447274d5-dd24-46fd-a44c-1ade792d0404
📒 Files selected for processing (29)
.gitignorebuild.gradlesrc/main/java/org/sopt/kareer/domain/member/controller/MemberController.javasrc/main/java/org/sopt/kareer/domain/member/entity/enums/LocalizedOnboardCategoryType.javasrc/main/java/org/sopt/kareer/domain/roadmap/dto/translation/RoadmapTranslationTarget.javasrc/main/java/org/sopt/kareer/domain/roadmap/entity/ActionItemTranslation.javasrc/main/java/org/sopt/kareer/domain/roadmap/entity/PhaseActionGuidelineTranslation.javasrc/main/java/org/sopt/kareer/domain/roadmap/entity/PhaseActionMistakeTranslation.javasrc/main/java/org/sopt/kareer/domain/roadmap/entity/PhaseActionTranslation.javasrc/main/java/org/sopt/kareer/domain/roadmap/entity/PhaseTranslation.javasrc/main/java/org/sopt/kareer/domain/roadmap/repository/ActionItemTranslationRepository.javasrc/main/java/org/sopt/kareer/domain/roadmap/repository/PhaseActionGuidelineTranslationRepository.javasrc/main/java/org/sopt/kareer/domain/roadmap/repository/PhaseActionMistakeTranslationRepository.javasrc/main/java/org/sopt/kareer/domain/roadmap/repository/PhaseActionTranslationRepository.javasrc/main/java/org/sopt/kareer/domain/roadmap/repository/PhaseTranslationRepository.javasrc/main/java/org/sopt/kareer/domain/roadmap/service/ActionItemService.javasrc/main/java/org/sopt/kareer/domain/roadmap/service/PhaseActionService.javasrc/main/java/org/sopt/kareer/domain/roadmap/service/PhaseService.javasrc/main/java/org/sopt/kareer/domain/roadmap/service/RoadMapPersistService.javasrc/main/java/org/sopt/kareer/domain/roadmap/service/RoadMapService.javasrc/main/java/org/sopt/kareer/domain/roadmap/service/RoadmapAsyncService.javasrc/main/java/org/sopt/kareer/domain/roadmap/service/RoadmapTranslationPersistService.javasrc/main/java/org/sopt/kareer/domain/roadmap/service/RoadmapTranslationService.javasrc/main/java/org/sopt/kareer/global/external/ai/prompt/JobPostingRecommendPrompt.javasrc/main/java/org/sopt/kareer/global/external/ai/prompt/RoadmapPrompt.javasrc/main/java/org/sopt/kareer/global/external/ai/service/OpenAiService.javasrc/main/java/org/sopt/kareer/global/external/google/service/GoogleTranslationService.javasrc/main/resources/application.ymlsrc/test/java/org/sopt/kareer/support/ControllerTestSupport.java
💤 Files with no reviewable changes (2)
- src/test/java/org/sopt/kareer/support/ControllerTestSupport.java
- src/main/java/org/sopt/kareer/domain/roadmap/service/RoadmapAsyncService.java
Related issue 🛠
Work Description 📝
Summary by CodeRabbit
새로운 기능
리팩토링
문서/설정