Skip to content

[Refactor] analysis 도메인 책임 분리 #279

Description

@shinae1023

어떤 기능인가요?

analysis 도메인의 내부 구조를 책임 단위로 분리해 AnalysisServiceAnalysisResultPersistenceService의 복잡도를 낮춥니다.

상세 내용

현재 [AnalysisService.java]에 아래 책임이 함께 섞여 있습니다.

  • persistence
  • sanitization
  • response assembling
  • validation / normalization

이번 이슈에서는 외부 API 동작은 유지하고, 내부 구조만 단계적으로 분리합니다.

  1. [Refactor] AnalysisResponseAssembler 분리 (#이슈번호)
    수정 범위:
    src/main/java/com/jobdri/jobdri_api/domain/analysis/service/core/AnalysisResultPersistenceService.java
    신규 후보:
    src/main/java/com/jobdri/jobdri_api/domain/analysis/service/core/AnalysisResponseAssembler.java

작업 내용:
toResponse(...)
isValidQuestionAnalysisForResponse(...)
AnalysisQuestionResponse, QuestionAnalysisResponse 조립 로직을 별도 assembler로 이동합니다.
AnalysisResultPersistenceService는 응답 DTO를 직접 조립하지 않고 assembler를 호출만 하도록 변경합니다.

리뷰 포인트:
응답 스키마 변경 없이 내부 조립 책임만 이동되었는지 확인합니다.

  1. [Refactor] Analysis payload sanitization 전용 서비스 분리 (#이슈번호)
    수정 범위:
    src/main/java/com/jobdri/jobdri_api/domain/analysis/service/core/AnalysisResultPersistenceService.java
    신규 후보:
    src/main/java/com/jobdri/jobdri_api/domain/analysis/service/sanitization/AnalysisResultSanitizationService.java

작업 내용:
sanitizeAndPersistAnalysisPayload(...)
analysisResultPayload(...)
buildHighlights(...)
buildNonOverlappingHighlights(...)
buildMissingKeywords(...)
readHighlights(...)
readMissingKeywords(...)
serializeHighlights(...)
serializeMissingKeywords(...)
같은 sanitize / deserialize / serialize 로직을 전용 서비스로 이동합니다.

리뷰 포인트:
저장 결과와 조회 결과의 응답 값이 기존과 동일한지 확인합니다.

  1. [Refactor] Analysis result validation/normalization 분리 (#이슈번호)
    수정 범위:
    src/main/java/com/jobdri/jobdri_api/domain/analysis/service/core/AnalysisResultPersistenceService.java
    신규 후보:
    src/main/java/com/jobdri/jobdri_api/domain/analysis/service/core/AnalysisResultValidationService.java

작업 내용:
verifyAnswerSnapshot(...)
validateRequiredScores(...)
validateScore(...)
normalizeFeedback(...)
normalizeImprovement(...)
등 저장 전 검증과 정규화 규칙을 전용 서비스로 이동합니다.

리뷰 포인트:
유효성 검증 실패 조건과 예외 메시지가 기존과 달라지지 않았는지 확인합니다.

  1. [Refactor] AnalysisResultPersistenceService를 저장 전용으로 축소 (#이슈번호)
    수정 범위:
    src/main/java/com/jobdri/jobdri_api/domain/analysis/service/core/AnalysisResultPersistenceService.java

작업 내용:
이 단계에서는 AnalysisResultPersistenceService가 아래 역할만 남도록 정리합니다.
Analysis 엔티티 생성
QuestionAnalysis 생성 및 저장
기존 분석 교체
MockApply 상태 변경

리뷰 포인트:
클래스 이름과 실제 책임이 일치하는지 확인합니다.

  1. [Refactor] AnalysisService 공개 API 정리 (#이슈번호)
    수정 범위:
    src/main/java/com/jobdri/jobdri_api/domain/analysis/service/core/AnalysisService.java
    영향 가능 파일:
    src/main/java/com/jobdri/jobdri_api/domain/analysis/infrastructure/async/AnalysisAsyncWorkerBridge.java
    src/main/java/com/jobdri/jobdri_api/domain/analysis/controller/AnalysisController.java
    src/main/java/com/jobdri/jobdri_api/domain/analysis/controller/JobPostingAnalysisController.java

작업 내용:
analyze(...)
prepareAnalysisExecution(...)
executeAnalysis(...)
finalizeAnalysis(...)
getAnalysis(...)
의 공개 범위와 역할을 다시 정리합니다.
AnalysisService는 facade / orchestration 성격만 남기고, 세부 구현은 하위 서비스에 위임하도록 맞춥니다.

리뷰 포인트:
외부 호출 지점의 동작 변화 없이 서비스 책임만 정리되었는지 확인합니다.

체크 리스트

  • Response assembling 책임 분리
  • Sanitization 책임 분리
  • Validation / normalization 책임 분리
  • AnalysisResultPersistenceService 저장 전용 축소
  • AnalysisService facade 역할 정리
  • 기존 분석 API 응답 호환성 확인
  • 관련 테스트 통과 확인

로컬 테스트 완료

  • ./gradlew test --tests com.jobdri.jobdri_api.domain.analysis.service.core.AnalysisServiceTest
  • ./gradlew test --tests com.jobdri.jobdri_api.domain.analysis.service.async.AnalysisAsyncTaskServiceTest
  • ./gradlew test --tests com.jobdri.jobdri_api.domain.analysis.service.question.QuestionServiceTest

기타

이번 이슈는 외부 API path / response 변경 없이 내부 구조 개선에 집중합니다.
가능하면 각 단계는 신규 클래스 1개 추가 + 기존 클래스 1개 축소 수준으로 유지해 커밋 크기를 작게 가져갑니다.

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions