이 문서는 “예전 문서 설명이 아직 남아 있거나, server 모드 중심 사고방식이 남아 있는 상태”에서 9.1.0의 NSFWJS 구조로 넘어갈 때 꼭 바꿔야 할 관점을 정리합니다.
safe / suspect / unsafe / error로 해석| 바꾸기 전 | 바꾼 뒤 |
|---|---|
| “핵심 엔트리 포인트는 nsfw_api_server.php” | “기본 권장 경로는 nsfw_api_browser.js이며, server 경로는 레거시 또는 대체 경로로 본다” |
| “워커 메시지를 처리한다” | “NSFWJS 모델 로드와 결과 정규화를 담당한다” |
| “단순 nsfw 여부를 반환한다” | “safe / suspect / unsafe / error 라벨을 반환한다” |
| “CDN 또는 외부 경로 사용” | “self-hosted vendor 구조를 우선 고려한다” |
T2_NSFW_RUNTIME_ASSET_BASET2_NSFW_BROWSER_MODELT2_NSFW_BROWSER_MODEL_TYPET2_NSFW_BROWSER_MODEL_URLT2_NSFW_BROWSER_BACKEND_PRIORITYNSFWFilterAPI 중심 설명 추가load, _selectBackend, classify, dispose 문서화checkNSFW(file) 결과 구조 업데이트applyNSFWFilter()에서 suspect 처리 추가/vendor 구조 문서화T2EDITOR_URL과 실제 설치 URL 일치 여부 강조| 테스트 항목 | 확인 포인트 |
|---|---|
| 모델 로딩 | model.json이 정상적으로 열리는가 |
| 백엔드 선택 | WebGPU 또는 폴백이 정상적으로 선택되는가 |
| 상태 표시 | 미리보기 카드와 상태바가 결과를 반영하는가 |
| 경고 정책 | suspect와 unsafe가 정책대로 처리되는가 |
| 오류 처리 | 모델 로딩 실패 시 error가 보이는가 |
레거시 구조와 새 구조를 한 문서에 섞어 쓰면 혼란이 커집니다. 가능하면 “현재 기본 경로”와 “레거시 호환 경로”를 별도 절로 나누어 서술하는 편이 좋습니다.
마이그레이션의 핵심은 “파일 교체”보다 “관점 교체”입니다.
suspect 상태를 별도 취급이 문서는 “예전 문서 설명이 아직 남아 있거나, server 모드 중심 사고방식이 남아 있는 상태”에서 9.1.0의 NSFWJS 구조로 넘어갈 때 꼭 바꿔야 할 관점을 정리합니다.
safe / suspect / unsafe / error로 해석| 바꾸기 전 | 바꾼 뒤 |
|---|---|
| “핵심 엔트리 포인트는 nsfw_api_server.php” | “기본 권장 경로는 nsfw_api_browser.js이며, server 경로는 레거시 또는 대체 경로로 본다” |
| “워커 메시지를 처리한다” | “NSFWJS 모델 로드와 결과 정규화를 담당한다” |
| “단순 nsfw 여부를 반환한다” | “safe / suspect / unsafe / error 라벨을 반환한다” |
| “CDN 또는 외부 경로 사용” | “self-hosted vendor 구조를 우선 고려한다” |
T2_NSFW_RUNTIME_ASSET_BASET2_NSFW_BROWSER_MODELT2_NSFW_BROWSER_MODEL_TYPET2_NSFW_BROWSER_MODEL_URLT2_NSFW_BROWSER_BACKEND_PRIORITYNSFWFilterAPI 중심 설명 추가load, _selectBackend, classify, dispose 문서화checkNSFW(file) 결과 구조 업데이트applyNSFWFilter()에서 suspect 처리 추가/vendor 구조 문서화T2EDITOR_URL과 실제 설치 URL 일치 여부 강조| 테스트 항목 | 확인 포인트 |
|---|---|
| 모델 로딩 | model.json이 정상적으로 열리는가 |
| 백엔드 선택 | WebGPU 또는 폴백이 정상적으로 선택되는가 |
| 상태 표시 | 미리보기 카드와 상태바가 결과를 반영하는가 |
| 경고 정책 | suspect와 unsafe가 정책대로 처리되는가 |
| 오류 처리 | 모델 로딩 실패 시 error가 보이는가 |
레거시 구조와 새 구조를 한 문서에 섞어 쓰면 혼란이 커집니다. 가능하면 “현재 기본 경로”와 “레거시 호환 경로”를 별도 절로 나누어 서술하는 편이 좋습니다.
마이그레이션의 핵심은 “파일 교체”보다 “관점 교체”입니다.
suspect 상태를 별도 취급| 이전 | 새 버전 | ||
|---|---|---|---|
| 1 | --- | 1 | --- |
| 2 | title: 마이그레이션: 레거시 NSFW 구조에서 NSFWJS로 | 2 | title: 마이그레이션: 레거시 NSFW 구조에서 NSFWJS로 |
| 3 | document_id: migration-legacy-nsfw-to-nsfwjs | 3 | document_id: migration-legacy-nsfw-to-nsfwjs |
| 4 | slug: migration-legacy-nsfw-to-nsfwjs | 4 | slug: migration-legacy-nsfw-to-nsfwjs |
| 5 | target_editor_version: 9.1.0 | 5 | target_editor_version: 9.1.0 |
| 6 | document_type: migration-guide | 6 | document_type: migration-guide |
| 7 | doc_type: migration-guide | 7 | doc_type: migration-guide |
| 8 | target_readers: [웹마스터, 개발자, AI agent] | 8 | target_readers: [웹마스터, 개발자, AI agent] |
| 9 | importance: High | 9 | importance: High |
| 10 | dependency: Medium | 10 | dependency: Medium |
| 11 | core_type: Guide | 11 | core_type: Guide |
| 12 | stability: [Version-Bound] | 12 | stability: [Version-Bound] |
| 13 | stable_anchor: [] | 13 | stable_anchor: [] |
| 14 | version_bound: | 14 | version_bound: |
| 15 | - 9.1.0의 브라우저 NSFW 구조 | 15 | - 9.1.0의 브라우저 NSFW 구조 |
| 16 | - MobileNetV2Mid 모델 기준 임계값 해석 | 16 | - MobileNetV2Mid 모델 기준 임계값 해석 |
| 17 | related_docs: | 17 | related_docs: |
| 18 | - guide-nsfwjs-overview | 18 | - guide-nsfwjs-overview |
| 19 | - core-nsfw_api_browser-js | 19 | - core-nsfw_api_browser-js |
| 20 | - config-nsfwjs-runtime-settings | 20 | - config-nsfwjs-runtime-settings |
| 21 | related_files: | 21 | related_files: |
| 22 | - 9.1.0/t2editor/config/nsfw_api_browser.js | 22 | - 9.1.0/t2editor/config/nsfw_api_browser.js |
| 23 | - 9.1.0/t2editor/config/nsfw_api_server.php | 23 | - 9.1.0/t2editor/config/nsfw_api_server.php |
| 24 | - 9.1.0/t2editor/plugin/image/image.js | 24 | - 9.1.0/t2editor/plugin/image/image.js |
| 25 | related_functions: | 25 | related_functions: |
| 26 | - checkNSFW | 26 | - checkNSFW |
| 27 | - applyNSFWFilter | 27 | - applyNSFWFilter |
| 28 | related_classes_modules: | 28 | related_classes_modules: |
| 29 | - NSFWFilterAPI | 29 | - NSFWFilterAPI |
| 30 | related_features: | 30 | related_features: |
| 31 | - 브라우저 모드 전환 | 31 | - 브라우저 모드 전환 |
| 32 | - UI 유지형 엔진 교체 | 32 | - UI 유지형 엔진 교체 |
| 33 | related_ui: | 33 | related_ui: |
| 34 | - 이미지 업로드 모달 | 34 | - 이미지 업로드 모달 |
| 35 | - NSFW 경고 모달 | 35 | - NSFW 경고 모달 |
| 36 | change_risk: 엔진만 바뀌는 것이 아니라 결과 해석 방식과 운영 경로까지 함께 바뀌므로, 단순 파일 교체로 끝났다고 보면 안 됩니다. | 36 | change_risk: 엔진만 바뀌는 것이 아니라 결과 해석 방식과 운영 경로까지 함께 바뀌므로, 단순 파일 교체로 끝났다고 보면 안 됩니다. |
| 37 | reading_order: 22 | 37 | reading_order: 22 |
| 38 | summary: 기존 자체 브라우저 추론 또는 서버 추론 중심 구조에서 NSFWJS 기반 브라우저 구조로 옮길 때 체크해야 할 변경점을 정리합니다. | 38 | summary: 기존 자체 브라우저 추론 또는 서버 추론 중심 구조에서 NSFWJS 기반 브라우저 구조로 옮길 때 체크해야 할 변경점을 정리합니다. |
| 39 | description: 레거시 NSFW 구조의 문서, 설정, 운영, UI 연동 포인트를 9.1.0 NSFWJS 구조에 맞춰 재해석하는 마이그레이션 문서입니다. | 39 | description: 레거시 NSFW 구조의 문서, 설정, 운영, UI 연동 포인트를 9.1.0 NSFWJS 구조에 맞춰 재해석하는 마이그레이션 문서입니다. |
| 40 | tags: [migration, NSFWJS, legacy, browser-mode, T2Editor] | 40 | tags: [migration, NSFWJS, legacy, browser-mode, T2Editor] |
| 41 | version_tag: 9.1.0 | 41 | version_tag: 9.1.0 |
| 42 | maintenance_difficulty: Medium | 42 | maintenance_difficulty: Medium |
| 43 | test_requirement: High | 43 | test_requirement: High |
| 44 | ai_agent_risk: Medium | 44 | ai_agent_risk: Medium |
| 45 | source_basis: [현재 코드 분석 기반] | 45 | source_basis: [현재 코드 분석 기반] |
| 46 | beginner_section_included: false | 46 | beginner_section_included: false |
| 47 | webmaster_section_included: true | 47 | webmaster_section_included: true |
| 48 | developer_section_included: true | 48 | developer_section_included: true |
| 49 | --- | 49 | --- |
| 50 | 50 | ||
| 51 | [목차] | 51 | [목차] |
| 52 | 52 | ||
| 53 | [[분류:마이그레이션]] | 53 | [[분류:마이그레이션]] |
| 54 | [[분류:NSFW]] | 54 | [[분류:NSFW]] |
| 55 | 55 | ||
| 56 | [note(요약)] | 56 | [note(요약)] |
| 57 | 이 문서는 “예전 문서 설명이 아직 남아 있거나, server 모드 중심 사고방식이 남아 있는 상태”에서 9.1.0의 NSFWJS 구조로 넘어갈 때 꼭 바꿔야 할 관점을 정리합니다. | 57 | 이 문서는 “예전 문서 설명이 아직 남아 있거나, server 모드 중심 사고방식이 남아 있는 상태”에서 9.1.0의 NSFWJS 구조로 넘어갈 때 꼭 바꿔야 할 관점을 정리합니다. |
| 58 | [/note] | 58 | [/note] |
| 59 | 59 | ||
| 60 | # 무엇이 바뀌었는가 | 60 | # 무엇이 바뀌었는가 |
| 61 | 61 | ||
| 62 | ## 예전 관점 | 62 | ## 9.0.0 |
| 63 | - 브라우저 NSFW 파일을 자체 추론 엔진 또는 워커 메시지 중심으로 이해 | 63 | - 브라우저 NSFW 파일을 자체 추론 엔진 또는 워커 메시지 중심으로 이해 |
| 64 | - 서버 API 문서를 현행 기본 경로처럼 설명 | 64 | - 서버 API 문서를 현행 기본 경로처럼 설명 |
| 65 | - UI와 분류 엔진의 경계를 명확히 나누지 않음 | 65 | - UI와 분류 엔진의 경계를 명확히 나누지 않음 |
| 66 | 66 | ||
| 67 | ## 9.1.0 관점 | 67 | ## 9.1.0 |
| 68 | - 브라우저 NSFW 파일은 **NSFWJS 래퍼** | 68 | - 브라우저 NSFW 파일은 **NSFWJS 래퍼** |
| 69 | - 현행 기본 경로는 **browser 모드** | 69 | - 현행 기본 경로는 **browser 모드** |
| 70 | - 기존 UI는 유지하고, 엔진만 교체 | 70 | - 기존 UI는 유지하고, 엔진만 교체 |
| 71 | - self-hosted vendor 경로를 운영 기준으로 문서화 | 71 | - self-hosted vendor 경로를 운영 기준으로 문서화 |
| 72 | - 결과를 `safe / suspect / unsafe / error`로 해석 | 72 | - 결과를 `safe / suspect / unsafe / error`로 해석 |
| 73 | 73 | ||
| 74 | ## 문서에서 반드시 바꿔야 하는 표현 | 74 | ## 문서에서 반드시 바꿔야 하는 표현 |
| 75 | 75 | ||
| 76 | ||= 바꾸기 전 ||= 바꾼 뒤 || | 76 | ||= 바꾸기 전 ||= 바꾼 뒤 || |
| 77 | || “핵심 엔트리 포인트는 nsfw_api_server.php” || “기본 권장 경로는 nsfw_api_browser.js이며, server 경로는 레거시 또는 대체 경로로 본다” || | 77 | || “핵심 엔트리 포인트는 nsfw_api_server.php” || “기본 권장 경로는 nsfw_api_browser.js이며, server 경로는 레거시 또는 대체 경로로 본다” || |
| 78 | || “워커 메시지를 처리한다” || “NSFWJS 모델 로드와 결과 정규화를 담당한다” || | 78 | || “워커 메시지를 처리한다” || “NSFWJS 모델 로드와 결과 정규화를 담당한다” || |
| 79 | || “단순 nsfw 여부를 반환한다” || “safe / suspect / unsafe / error 라벨을 반환한다” || | 79 | || “단순 nsfw 여부를 반환한다” || “safe / suspect / unsafe / error 라벨을 반환한다” || |
| 80 | || “CDN 또는 외부 경로 사용” || “self-hosted vendor 구조를 우선 고려한다” || | 80 | || “CDN 또는 외부 경로 사용” || “self-hosted vendor 구조를 우선 고려한다” || |
| 81 | 81 | ||
| 82 | ## 코드 관점의 변경 체크리스트 | 82 | ## 코드 관점의 변경 체크리스트 |
| 83 | 83 | ||
| 84 | ### 1. 설정값 추가 | 84 | ### 1. 설정값 추가 |
| 85 | - `T2_NSFW_RUNTIME_ASSET_BASE` | 85 | - `T2_NSFW_RUNTIME_ASSET_BASE` |
| 86 | - `T2_NSFW_BROWSER_MODEL` | 86 | - `T2_NSFW_BROWSER_MODEL` |
| 87 | - `T2_NSFW_BROWSER_MODEL_TYPE` | 87 | - `T2_NSFW_BROWSER_MODEL_TYPE` |
| 88 | - `T2_NSFW_BROWSER_MODEL_URL` | 88 | - `T2_NSFW_BROWSER_MODEL_URL` |
| 89 | - `T2_NSFW_BROWSER_BACKEND_PRIORITY` | 89 | - `T2_NSFW_BROWSER_BACKEND_PRIORITY` |
| 90 | 90 | ||
| 91 | ### 2. 브라우저 API 책임 변경 | 91 | ### 2. 브라우저 API 책임 변경 |
| 92 | - 워커 중심 설명 제거 | 92 | - 워커 중심 설명 제거 |
| 93 | - `NSFWFilterAPI` 중심 설명 추가 | 93 | - `NSFWFilterAPI` 중심 설명 추가 |
| 94 | - `load`, `_selectBackend`, `classify`, `dispose` 문서화 | 94 | - `load`, `_selectBackend`, `classify`, `dispose` 문서화 |
| 95 | 95 | ||
| 96 | ### 3. 이미지 플러그인 정책 변경 | 96 | ### 3. 이미지 플러그인 정책 변경 |
| 97 | - `checkNSFW(file)` 결과 구조 업데이트 | 97 | - `checkNSFW(file)` 결과 구조 업데이트 |
| 98 | - `applyNSFWFilter()`에서 `suspect` 처리 추가 | 98 | - `applyNSFWFilter()`에서 `suspect` 처리 추가 |
| 99 | - 업로드 모달 상태 배지와 하단 상태바를 새 라벨 체계에 맞춤 | 99 | - 업로드 모달 상태 배지와 하단 상태바를 새 라벨 체계에 맞춤 |
| 100 | 100 | ||
| 101 | ### 4. 운영 문서 변경 | 101 | ### 4. 운영 문서 변경 |
| 102 | - `/vendor` 구조 문서화 | 102 | - `/vendor` 구조 문서화 |
| 103 | - `T2EDITOR_URL`과 실제 설치 URL 일치 여부 강조 | 103 | - `T2EDITOR_URL`과 실제 설치 URL 일치 여부 강조 |
| 104 | - WebGPU 실패 시 폴백 전략 문서화 | 104 | - WebGPU 실패 시 폴백 전략 문서화 |
| 105 | 105 | ||
| 106 | ## 테스트 관점의 변경 체크리스트 | 106 | ## 테스트 관점의 변경 체크리스트 |
| 107 | 107 | ||
| 108 | ||= 테스트 항목 ||= 확인 포인트 || | 108 | ||= 테스트 항목 ||= 확인 포인트 || |
| 109 | || 모델 로딩 || `model.json`이 정상적으로 열리는가 || | 109 | || 모델 로딩 || `model.json`이 정상적으로 열리는가 || |
| 110 | || 백엔드 선택 || WebGPU 또는 폴백이 정상적으로 선택되는가 || | 110 | || 백엔드 선택 || WebGPU 또는 폴백이 정상적으로 선택되는가 || |
| 111 | || 상태 표시 || 미리보기 카드와 상태바가 결과를 반영하는가 || | 111 | || 상태 표시 || 미리보기 카드와 상태바가 결과를 반영하는가 || |
| 112 | || 경고 정책 || `suspect`와 `unsafe`가 정책대로 처리되는가 || | 112 | || 경고 정책 || `suspect`와 `unsafe`가 정책대로 처리되는가 || |
| 113 | || 오류 처리 || 모델 로딩 실패 시 `error`가 보이는가 || | 113 | || 오류 처리 || 모델 로딩 실패 시 `error`가 보이는가 || |
| 114 | 114 | ||
| 115 | [tip(문서 유지보수 팁)] | 115 | [tip(문서 유지보수 팁)] |
| 116 | 레거시 구조와 새 구조를 한 문서에 섞어 쓰면 혼란이 커집니다. | 116 | 레거시 구조와 새 구조를 한 문서에 섞어 쓰면 혼란이 커집니다. |
| 117 | 가능하면 “현재 기본 경로”와 “레거시 호환 경로”를 별도 절로 나누어 서술하는 편이 좋습니다. | 117 | 가능하면 “현재 기본 경로”와 “레거시 호환 경로”를 별도 절로 나누어 서술하는 편이 좋습니다. |
| 118 | [/tip] | 118 | [/tip] |
| 119 | 119 | ||
| 120 | ## 수정 요약 | 120 | ## 수정 요약 |
| 121 | 121 | ||
| 122 | 마이그레이션의 핵심은 “파일 교체”보다 “관점 교체”입니다. | 122 | 마이그레이션의 핵심은 “파일 교체”보다 “관점 교체”입니다. |
| 123 | 123 | ||
| 124 | - 브라우저 모드를 기본 경로로 재정의 | 124 | - 브라우저 모드를 기본 경로로 재정의 |
| 125 | - NSFWJS 기반 엔진으로 문서 갱신 | 125 | - NSFWJS 기반 엔진으로 문서 갱신 |
| 126 | - self-hosted 운영 문서 추가 | 126 | - self-hosted 운영 문서 추가 |
| 127 | - 이미지 UI 문서에서 `suspect` 상태를 별도 취급 | 127 | - 이미지 UI 문서에서 `suspect` 상태를 별도 취급 |