Skip to content

[Feat] 로드맵 fast api 연동 #30

Description

@sungho1949

배경

현재 AI 기능은 PDF 기반 분석 결과 생성 및 조회만 지원하고 있다.

새로운 Portfolio-RoadMap 서비스에서는 완료된 코드 분석 결과(JSON)를 기반으로 개발자 역량을 평가하고 학습 로드맵을 생성할 수 있으며, 이를 위해 BE ↔ AI(FastAPI) 연동이 필요하다.

로드맵 평가는 여러 개의 코드 분석 결과를 입력으로 받아 비동기 작업으로 수행되며, 평가 완료 시 Webhook과 SSE를 통해 사용자에게 실시간으로 결과를 전달해야 한다.


요구사항

1. 로드맵 평가 작업 생성 API 추가

  • POST /api/v1/ai/jobs/roadmap/assess

  • 입력:

    • analysisIds
    • merge
  • 인증 사용자 기준으로 요청 처리

2. 코드 분석 결과 URL 변환

  • 전달받은 analysisIds

    • 요청 사용자 소유
    • 상태가 DONE
  • 인 분석만 조회

  • 분석 결과의 resultCdnUrl 목록을 생성하여 AI 서버에 전달

3. IDOR 방어

  • 분석 조회 시 사용자 조건을 포함한 벌크 조회 수행

예시:

findAllByIdInAndUser_Id(...)
  • 타 사용자 소유 분석 ID는 자동 제외

4. AI Job 생성

  • AiJobType.ROADMAP_FROM_ANALYSES 추가
  • 로드맵 평가 전용 AiJob 생성
  • fileId = null

5. AI 서버 연동

FastAPI Endpoint:

POST /roadmap/assess

요청 예시:

{
  "ai_job_id": "uuid",
  "code_analysis_urls": [
    "...",
    "..."
  ],
  "merge": true
}
  • BE에서 ai_job_id(UUID) 생성
  • FastAPI에 전달
  • 완료 시 동일 ID를 반환받아 작업 매핑

6. 완료 Webhook 추가

POST /api/v1/ai/roadmap/complete

인증:

X-INTERNAL-API-KEY

요청 예시:

{
  "ai_job_id": "uuid",
  "status": "DONE",
  "result": [...],
  "error_message": null
}

7. 결과 저장

  • 로드맵 결과(JSON 배열)를 저장할 수 있도록 AiJob 확장
  • 컬럼:
result_json TEXT
  • 완료 시:

    • 상태 변경
    • 결과 저장

8. SSE 실시간 전달

기존 SSE 채널을 활용하여:

GET /api/v1/ai/jobs/subscribe

로드맵 완료 이벤트 전달

SSE Payload:

{
  "jobId": "...",
  "status": "DONE",
  "resultJson": "[...]"
}

9. 상태 조회 응답 확장

JobStatusResponse

추가:

String resultJson
  • PDF 작업 응답에는 포함되지 않도록 처리

DB 변경사항

Flyway

V20260605__add_ai_jobs_result_json.sql
ALTER TABLE ai_jobs
ADD COLUMN result_json TEXT;

완료 조건

  • 로드맵 평가 요청 API 추가
  • AI 서버 /roadmap/assess 연동
  • ROADMAP_FROM_ANALYSES Job 타입 추가
  • 코드 분석 URL 변환 로직 구현
  • IDOR 방어 적용
  • 완료 Webhook 추가
  • 결과 JSON 저장 기능 구현
  • SSE 실시간 전송 구현
  • 상태 조회 응답 확장
  • Flyway 마이그레이션 추가
  • 단위 테스트 작성 및 통과
  • 기존 PDF 기반 AI 기능 회귀 없음

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Fields

No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions