Idea Analysis 비동기 처리 — Ai::AnalyzeIdeaJob + Build::IdeaAnalysesController + Turbo Stream + 테스트

ID: f2beadc8-913a-446f-a903-ded90a9e7525

높음 리뷰

## 목표
PRD Section 12.2 기반 Ai::AnalyzeIdeaJob + Build::IdeaAnalysesController 구현. 비동기 AI 분석 + Turbo Stream 실시간 갱신.

## 현재 상태
- Ai::IdeaAnalyzerService 구현 완료 (app/services/ai/idea_analyzer_service.rb)
- Build::IdeaAnalysesController 스텁 존재 (show, create)
- Build::ProjectsController 구현 완료
- 라우트: `resources :projects do resource :idea_analysis, only: [:show, :create] end`
- Solid Queue 설정 완료 (Gemfile에 solid_queue 포함)

## PRD 코드 (Section 12.2)
```ruby
class Ai::AnalyzeIdeaJob < ApplicationJob
queue_as :ai_processing

def perform(project_id)
project = Project.find(project_id)
Ai::IdeaAnalyzerService.new(
project: project,
user: project.user
).call

Turbo::StreamsChannel.broadcast_update_to(
"project_#{project_id}",
target: "idea_analysis_result",
partial: "build/idea_analyses/result",
locals: { project: project }
)
rescue => e
Rails.logger.error("AnalyzeIdeaJob failed: #{e.message}")
raise
end
end
```

## 구현 사항

### 1. app/jobs/ai/analyze_idea_job.rb
- PRD 코드 기반 (Sentry 대신 Rails.logger.error)
- queue_as :ai_processing
- 성공 시 Turbo Stream broadcast

### 2. Build::IdeaAnalysesController
```ruby
class Build::IdeaAnalysesController < ApplicationController
before_action :set_project
before_action :authorize_owner!

def show
# 분석 결과 표시 (또는 분석 전이면 "분석하기" 버튼)
end

def create
# Job 큐잉
Ai::AnalyzeIdeaJob.perform_later(@project.id)
redirect_to build_project_idea_analysis_path(@project), notice: "AI 분석을 시작했습니다. 잠시 후 결과가 표시됩니다."
# 또는 Turbo Stream으로 로딩 UI 표시
end

private

def set_project
@project = Project.find(params[:project_id])
end

def authorize_owner!
redirect_to build_projects_path, alert: I18n.t("errors.messages.not_authorized") unless @project.user == Current.user
end
end
```

### 3. 뷰
**build/idea_analyses/show.html.erb**:
- 분석 결과가 있으면: one_line_definition, core_features, target_customer, revenue_model, competitor_analysis 표시
- 분석 전이면: "아이디어 분석하기" 버튼
- turbo_stream_from "project_#{@project.id}" — 실시간 갱신 수신
- id="idea_analysis_result" div — Turbo Stream 업데이트 타겟

**build/idea_analyses/_result.html.erb** (partial):
- 분석 결과 카드 (one_line_definition, core_features 리스트, target_customer, revenue_model, competitor_analysis)
- "재분석" 버튼

**로딩 UI**:
- 분석 중일 때 스피너/로딩 상태 표시
- Turbo Stream이 result를 업데이트하면 로딩 → 결과로 전환

### 4. 다크 테마
- bg-bg, bg-surface, text-text-primary, bg-accent 토큰 사용
- 기존 Partial 활용 (_button, _card)

### ⚠️ 주의
- build/idea_analyses/ 범위만 수정 (developer-1은 learn/ 작업 중)
- Project, User 모델 건드리지 않기
- Turbo Stream broadcast: `turbo_stream_from` 헬퍼 사용
- Solid Queue가 development에서 inline 실행될 수 있음 — perform_later 사용
- 한국어 Flash/UI 텍스트

### 테스트 (TDD)
- Build::IdeaAnalysesController: show(인증, 소유자 확인), create(Job 큐잉 확인)
- Ai::AnalyzeIdeaJob: perform 시 서비스 호출 + broadcast 확인 (mock)
- 인증/소유자 접근 제어

### 완료 기준
- "분석하기" 버튼 → Job 큐잉
- 분석 결과 표시
- Turbo Stream 실시간 갱신
- 재분석 가능
- bin/rails test 전체 통과

첨부 이미지

이미지 추가 (Ctrl+V로 붙여넣기 또는 클릭)

JPEG, PNG, GIF, WebP / 최대 10MB

담당자: developer-2
생성일: 2026년 03월 26일 09:31

활동 로그

  • D
    developer-2 상태 변경: 할 일 → 리뷰

    2026년 03월 26일 09:34:38