96 lines
4.5 KiB
Markdown
96 lines
4.5 KiB
Markdown
# 콜드메일 확인 버튼 UX 개선 및 IR Deck 종합 결론 형식 개선
|
|
|
|
**날짜**: 2026-01-26
|
|
**작성자**: happybell80
|
|
**관련 파일**:
|
|
- `rb8001/app/router/slack/interactive.py`
|
|
- `rb8001/app/services/slack/coldmail_service.py`
|
|
- `rb8001/app/services/workflows/coldmail_workflow.py`
|
|
- `frontend-ir-valuation/src/pages/ir-valuation.tsx`
|
|
|
|
---
|
|
|
|
## 문제 상황
|
|
|
|
### 문제 1: 콜드메일 "맞음" 버튼 UX
|
|
- 사용자가 "맞음" 버튼 클릭 시 즉시 피드백 없음
|
|
- LangGraph 워크플로우 재개 및 리스트 등록 처리 중 진행 상황 확인 불가
|
|
- 처리 완료까지 오랜 시간 소요 (이메일 상세 조회, 첨부파일 처리, DB 저장, Slack API 호출 등)
|
|
|
|
### 문제 2: IR Deck 종합 결론 형식
|
|
- 현재 형식: 요약 → 핵심 리스크 → 핵심 강점 순서
|
|
- 사용자가 핵심 결론을 파악하기 위해 전체를 읽어야 함
|
|
|
|
---
|
|
|
|
## 해결 방안
|
|
|
|
### Phase 1: 콜드메일 "맞음" 버튼 UX 개선
|
|
|
|
#### 1.1 interactive.py에서 channel, message_ts 전달
|
|
- **파일**: `rb8001/app/router/slack/interactive.py:96-105, 106-114`
|
|
- **변경**: `handle_coldmail_confirm` 호출 시 `channel`, `message_ts` 파라미터 추가
|
|
|
|
#### 1.2 즉시 피드백 메시지 전송
|
|
- **파일**: `rb8001/app/services/slack/coldmail_service.py:56-94`
|
|
- **변경**: 함수 시작 시 IR 분석 버튼과 동일한 패턴으로 "로빙 중…" 메시지 전송
|
|
- **메시지 형식**: `{"type": "context", "elements": [{"type": "mrkdwn", "text": ":robot_face: 로빙 중…"}]}`
|
|
- **스레드**: `message_ts`를 `thread_ts`로 사용하여 동일 스레드에 전송
|
|
|
|
#### 1.3 워크플로우 상태에 loading_ts 저장
|
|
- **파일**: `rb8001/app/services/workflows/coldmail_workflow.py:28-37, 185-197`
|
|
- **변경**:
|
|
- `ColdmailState`에 `loading_ts: str`, `loading_channel: str` 필드 추가 (옵션)
|
|
- `handle_coldmail_confirm`에서 `Command(resume=...)`에 `loading_ts`, `loading_channel` 포함
|
|
- `wait_confirmation_node`에서 `decision`에서 추출하여 상태에 저장
|
|
|
|
#### 1.4 처리 완료 후 메시지 업데이트
|
|
- **파일**: `rb8001/app/services/workflows/coldmail_workflow.py:202-270`
|
|
- **변경**: `confirm_node`에서 리스트 등록 완료 후 "로빙 중…" 메시지를 "✅ 리스트 등록 완료"로 업데이트
|
|
- **API**: `skill-slack`의 `/api/v1/update` 엔드포인트 사용
|
|
|
|
#### 1.5 에러 처리
|
|
- **파일**: `rb8001/app/services/slack/coldmail_service.py:175-200, 154-200`
|
|
- **변경**: 워크플로우 재개 실패 시 에러 메시지 업데이트, 폴백 처리 시에도 피드백 제공
|
|
|
|
### Phase 2: IR Deck 종합 결론 형식 개선
|
|
|
|
#### 2.1 프론트엔드 형식 변경
|
|
- **파일**: `frontend-ir-valuation/src/pages/ir-valuation.tsx:515-539`
|
|
- **변경**: 섹션 순서 변경 (요약 → 강점 → 리스크)
|
|
- **코드**: 532-537줄(강점)을 524-530줄(리스크) 앞으로 이동
|
|
|
|
---
|
|
|
|
## 구현 완료
|
|
|
|
- **rb8001 커밋**: `d21361e` (feat: 콜드메일 확인 버튼 UX 개선)
|
|
- **frontend-ir-valuation 커밋**: `db88293` (feat: IR Deck 종합 결론 형식 개선)
|
|
- **테스트**: `test_coldmail_confirm_ux.py` 6개 테스트 모두 통과
|
|
- **기존 테스트**: `test_coldmail_interrupt_return_pattern.py` 4개 테스트 모두 통과 (회귀 테스트 통과)
|
|
|
|
---
|
|
|
|
## 교훈
|
|
|
|
### LangGraph 상태 전달 패턴 재사용
|
|
- `Command(resume=...)`에 포함된 값은 `wait_confirmation_node`의 `interrupt()` 반환값(`decision`)으로 전달됨
|
|
- 기존 `confirmed_email_id` 저장 패턴과 동일하게 `loading_ts`, `loading_channel` 저장 가능
|
|
- **교훈**: 기존 검증된 패턴을 재사용하면 구현 복잡도 감소 및 안정성 향상
|
|
|
|
### 즉시 피드백의 중요성
|
|
- 사용자 액션에 대한 즉시 피드백이 없으면 진행 상황을 알 수 없어 불안감 발생
|
|
- IR 분석 버튼의 "로빙 중…" 패턴을 재사용하여 일관된 UX 제공
|
|
- **교훈**: 긴 처리 시간이 필요한 작업은 반드시 즉시 피드백 제공
|
|
|
|
### TDD 원칙 준수
|
|
- 테스트 먼저 작성(Red) → 구현(Green) → 리팩터 순서로 진행
|
|
- 기존 테스트 패턴 재사용으로 테스트 작성 시간 단축
|
|
- **교훈**: TDD 방식으로 진행하면 구현 전에 기대 행동을 명확히 하고, 회귀 테스트도 자동화 가능
|
|
|
|
---
|
|
|
|
## 참고 문서
|
|
- 계획 문서: `DOCS/journey/plans/260126_coldmail_confirm_ux_and_ir_conclusion_format_improvement.md`
|
|
- 관련 트러블슈팅: `260121_coldmail_multi_confirm_loop_fix.md`, `260121_coldmail_interrupt_state_preservation_fix.md`
|