약기법 검수 개요
일본 약기법(광고규정) 검수 기능의 구조와 데이터 흐름을 설명합니다.
약기법 검수 개요
일본 약기법(薬機法) 등 광고규정 위반 여부를 AI로 검수하는 기능입니다. 캠페인별 opt-in 방식이며(어드민 토글), 판정은 Python(sns-crawler)이, 게이팅·트리거·저장은 Spring 이 담당합니다.
검수 대상과 저장 위치
| 대상 | 트리거 | 저장 위치 | 조회 방법 |
|---|---|---|---|
| 가이드라인 | 가이드라인 완성(COMPLETED) 시 자동 | MongoDB guidelines.regulationRiskResult | 가이드라인 검수 결과 조회 — 어드민 + 기업 |
| 스크립트 제출물 | 크리에이터 1차 제출 시 + AI 검수 재요청 시 기존 AI 스크립트 검수와 병렬 실행 | ai_script_review_results 문서의 data.regulationRiskResult (병합) | GET /ai/influence/contents/ai-review/script/{reviewId} 응답의 regulationRiskResult |
| 영상 제출물 | 크리에이터 2차 제출 시 + AI 검수 재요청 시 기존 AI 영상 검수와 병렬 실행 | ai_review_results 문서의 data.regulationRiskResult (병합) | GET /ai/influence/contents/ai-review/{collabNo}/{applicationId}/{itemId} 응답의 regulationRiskResult |
| 캡션 제출물 | 크리에이터 2차 제출 시 (영상과 한 세트) | ai_review_results (캡션 itemId, 약기법 단독) | 위와 동일한 API 에 캡션 itemId 로 조회 |
| 광고주 피드백 (검수의 검수) | 광고주 피드백 정식 제출 시 | regulation_review_results (reviewId + 타입) | 피드백 검수 결과 조회 |
제출물(스크립트/영상/캡션) 약기법 결과는 별도 API 가 아니라 기존 AI 검수 조회 API 응답에 regulationRiskResult 필드로 병합되어 내려갑니다. 같은 검수인데 저장소가 갈리면 디버그가 불편하다는 합의에 따른 설계입니다.
크리에이터가 쿼터를 써서 AI 검수를 재요청하는 경로(POST /ai/influence/contents/ai-review/request/script/{reviewId},
.../request/video/{itemId})에서도 동일하게 약기법 검수가 병렬 실행되어 같은 문서에 병합됩니다.
최초 제출 경로와 저장 위치·병합 키가 같으므로 재요청이 이전 결과를 덮어써도 약기법 결과가 사라지지 않습니다.
쿼터 환불은 일반 AI 검수 성공 여부로만 판단합니다 — 약기법만 실패해도 검수 횟수는 차감된 채 유지됩니다(부가 정보이므로).
regulationRiskResult 노출은 조회 경로에 따라 다릅니다.
| 경로 | 크리에이터(ROLE_USER) |
|---|---|
GET /ai/influence/contents/ai-review/result/script/{reviewId}.../result/video/{itemId} — 크리에이터 전용 | ✅ 노출 |
GET /ai/influence/contents/ai-review/script/{reviewId}.../ai-review/{collabNo}/{applicationId}/{itemId} — 어드민·기업용 | ❌ 제거 |
크리에이터 전용 경로는 본인이 제출한 스크립트·영상의 규정 위반 내용을 보고 수정하라고 그대로 내려보냅니다.
assertOwner 로 신청 당사자만 통과하므로 남의 검수 결과는 조회되지 않습니다.
검수의 검수(광고주 피드백 약기법 검수)는 여전히 어드민 전용입니다 —
저장소(regulation_review_results)와 API 가 달라 이 경로로는 나가지 않습니다.
엔드포인트별 권한 — /ai/admin/regulation 아래 엔드포인트지만 가이드라인 2개만 기업에 열려 있습니다.
광고주 본인이 작성한 콘텐츠라 결과를 못 받으면 고칠 수가 없기 때문입니다.
| 엔드포인트 | 권한 |
|---|---|
GET /{collabNo}/guidelinePOST /{collabNo}/guideline/review | 어드민 + 기업(본인 캠페인만, 소유권 검증) |
| 토글 조회·변경, 피드백 조회·재실행 | 어드민 전용 |
크리에이터(ROLE_USER)는 어느 쪽도 호출할 수 없습니다.
opt-in 플래그
- 저장: MongoDB
guidelines.regulationReviewEnabled(boolean, DDL 없음) - 토글: 사용 여부 변경 — 가이드라인 문서가 있어야 설정 가능
- 노출: 캠페인 상세(
GET /ai/progress-table/item) 응답의regulationReviewEnabled필드
실행 상태 구분 (4상태)
검수 결과 페이로드의 status 로 실행 이력을 구분합니다.
| 상태 | 의미 |
|---|---|
(결과 없음 / null) | 실행된 적 없음 |
IN_PROGRESS | 실행 중 (startedAt 포함, 10분 이상 지속되면 실패 간주 후 수동 재실행) |
FAILED | 실패 (error 포함) |
high | low | pass | 완료 — 위반 최고 위험도 기준 판정 |
판정 결과 형식
{
"status": "high",
"summary": "일본 약기법·경품표시법 기준으로 검수한 결과입니다.",
"violations": [
{
"kind": "expression",
"text": "シミが完全に消える",
"text_ko": "기미가 완전히 사라진다",
"type": "효능범위초과",
"risk": "high",
"basis": "약기법 제66조 (과대광고 금지)",
"reason": "화장품 효능 범위를 벗어난 의약품적 효능 표현입니다.",
"fix": "メラニンの生成を抑え、シミ・そばかすを防ぐ",
"fix_ko": "멜라닌 생성을 억제해 기미·주근깨를 방지"
}
]
}timeRange: 영상 검수만 —[시작초, 끝초]scene/part: 스크립트 검수만 — 장면 번호 /subtitle·narration·videoScenefeedback_id: 피드백 검수만 — 위반을 유발한TB_CONTENT_FEEDBACK.id