[리드관리 PR2] 세그먼트 (조건 저장형 동적 세그먼트)
ID: 73725727-a986-40e4-ace1-f46991d56c24
계획서: docs/features/admin_lead_management.md (§4.1, §4.5, §6, §7-PR2)
선행: PR1.
목표: 운영자가 필터 조건을 저장하면 대상이 자동 산출되는 동적 세그먼트. 캠페인 발송 대상의 기반.
작업:
- 마이그레이션 marketing_segments(uuid): name(unique), description, conditions(jsonb), cached_count(int,0), count_refreshed_at, created_by_id(FK users).
- MarketingSegment 모델 + 검증.
- Marketing::SegmentQuery 서비스: conditions(jsonb) → AR 스코프 변환. 화이트리스트 기반(허용 키/값 외 무시 → SQL 인젝션 차단). 지원 조건(MVP): funnel_stages(OR), facts(AND: has_paid_diagnosis 등), diagnosis_target, locale, email_subscription, created_after, first_diagnosis_after, days_since_diagnosis_gte, utm_source.
- Admin::Marketing::SegmentsController CRUD + member post :refresh_count. 조건 빌더 폼(select/checkbox). show: 대상 수 + 샘플 리드 20명 + "이 세그먼트로 캠페인 만들기" 버튼. 저장/refresh 시 cached_count 갱신.
테스트:
- SegmentQuery: 미허용 키/값 무시(인젝션 차단), funnel_stages OR, facts AND 결합.
- days_since_diagnosis_gte 경계값 정확.
- refresh_count가 실제 대상 수와 일치.
주의: "진단 결과 유형(WAY/DOMAIN)" 조건은 §4.5 스파이크(결과 점수 저장 위치 확인) 후 fast-follow. 이 PR 범위에서 제외.
완료 기준: 세그먼트 생성/저장 후 show에서 자동 산출된 대상 수·샘플 노출.
첨부 이미지
이미지 추가 (Ctrl+V로 붙여넣기 또는 클릭)
JPEG, PNG, GIF, WebP / 최대 10MB
활동 로그
-
Cclaude PR2 세그먼트(조건 저장형 동적 세그먼트) TDD 구현 완료 (커밋 f5d7206)
2026년 06월 10일 07:16:58
상세 보기
## 변경 사항
- `app/services/marketing/segment_query.rb`: conditions(jsonb)→User 관계. 화이트리스트(알려진 키만 처리, 나머지 무시) + 전 바인드 파라미터 → SQL 인젝션 차단. 지원: funnel_stages(OR), facts(AND: has_completed/paid_diagnosis, is_applicant/graduate), diagnosis_target, locale, email_subscription, created_after, first_diagnosis_after, days_since_diagnosis_gte, utm_source.
- `db/migrate/20260610071005_*` + `app/models/marketing_segment.rb`: name(unique), description, conditions(jsonb), cached_count, count_refreshed_at, created_by. `members`(실시간), `refresh_count!`.
- `app/controllers/admin/marketing/segments_controller.rb`: CRUD + `refresh_count`. strong params로 conditions 구조 허용 + 빈 값 정리(cleaned_conditions).
- 뷰: index/new/edit/_form(조건 빌더: 퍼널 단계·언어·진단대상 체크박스 + 수신동의/경과일/가입일) / show(실시간 대상 수 + 샘플 20명).
- `app/helpers/admin/marketing/segments_helper.rb`: 조건 요약 칩 라벨.
- 사이드바 "세그먼트" + ko.yml i18n.## 테스트
- 신규: segment_query(11, 인젝션/OR/AND/경계값 포함), marketing_segment(5), segments_controller(8)
- 회귀: admin+models+services **1530 runs, 0 failures**## 참고
- "이 세그먼트로 캠페인 만들기" 버튼은 campaigns 라우트(PR4) 생성 후 show에 추가 예정.
- 결과유형(WAY/DOMAIN) 조건은 스파이크 후 fast-follow(범위 외). -
Cclaude 상태 변경: 진행 중 → 리뷰
2026년 06월 10일 07:16:48
-
Cclaude 상태 변경: 할 일 → 진행 중
2026년 06월 10일 07:07:16