plugin/your_plugin/your_plugin.js와 필요한 경우 your_plugin.css, PHP 업로드 스크립트를 생성합니다.editor.lib.php의 $plugin_priority 배열에 플러그인 이름을 추가하여 로딩 순서를 지정합니다.handleCommand 메서드를 구현하여 사용자 명령에 반응합니다.data-command 속성을 플러그인 명령에 맞춰 설정합니다.플러그인은 에디터 초기화 시점에 등록되고 init 함수가 호출됩니다. 이후 사용자의 입력이나 명령에 따라 handleCommand가 호출되며, 필요 시 onContentSet, onSelectionChange 등의 이벤트 핸들러를 구현합니다.
개발한 플러그인은 다양한 브라우저와 화면 크기에서 테스트해야 합니다. 오류가 없고 성능이 만족스럽다면, 문서 작성 규칙에 따라 설명서를 작성하고 내부 배포 또는 오픈 소스로 공개할 수 있습니다.
좋은 플러그인은 기능이 작더라도 책임이 선명해야 합니다. 툴바 버튼 표시, 사용자 입력 수집, 콘텐츠 삽입, 서버 통신, 스타일 처리가 한 파일 안에 뒤섞여 있으면 유지보수가 급격히 어려워집니다. 가능하면 버튼 트리거와 콘텐츠 처리 로직을 분리하고, 서버 의존 기능은 별도 엔드포인트 문서와 함께 관리하세요.
플러그인을 배포할 때는 최소 지원 버전을 문서 상단에 분명히 적고, editor.lib.php의 플러그인 등록 규칙과 충돌하지 않는 파일명 규칙을 지켜야 합니다. 특히 기존 사이트가 낮은 버전의 T2Editor를 쓰고 있다면, 새 플러그인이 요구하는 코어 이벤트나 CSS 클래스가 실제로 존재하는지 먼저 확인해야 합니다.
plugin/your_plugin/your_plugin.js와 필요한 경우 your_plugin.css, PHP 업로드 스크립트를 생성합니다.editor.lib.php의 $plugin_priority 배열에 플러그인 이름을 추가하여 로딩 순서를 지정합니다.handleCommand 메서드를 구현하여 사용자 명령에 반응합니다.data-command 속성을 플러그인 명령에 맞춰 설정합니다.플러그인은 에디터 초기화 시점에 등록되고 init 함수가 호출됩니다. 이후 사용자의 입력이나 명령에 따라 handleCommand가 호출되며, 필요 시 onContentSet, onSelectionChange 등의 이벤트 핸들러를 구현합니다.
개발한 플러그인은 다양한 브라우저와 화면 크기에서 테스트해야 합니다. 오류가 없고 성능이 만족스럽다면, 문서 작성 규칙에 따라 설명서를 작성하고 내부 배포 또는 오픈 소스로 공개할 수 있습니다.
좋은 플러그인은 기능이 작더라도 책임이 선명해야 합니다. 툴바 버튼 표시, 사용자 입력 수집, 콘텐츠 삽입, 서버 통신, 스타일 처리가 한 파일 안에 뒤섞여 있으면 유지보수가 급격히 어려워집니다. 가능하면 버튼 트리거와 콘텐츠 처리 로직을 분리하고, 서버 의존 기능은 별도 엔드포인트 문서와 함께 관리하세요.
플러그인을 배포할 때는 최소 지원 버전을 문서 상단에 분명히 적고, editor.lib.php의 플러그인 등록 규칙과 충돌하지 않는 파일명 규칙을 지켜야 합니다. 특히 기존 사이트가 낮은 버전의 T2Editor를 쓰고 있다면, 새 플러그인이 요구하는 코어 이벤트나 CSS 클래스가 실제로 존재하는지 먼저 확인해야 합니다.
| 이전 | 새 버전 | ||
|---|---|---|---|
| 1 | --- | 1 | --- |
| 2 | title: 플러그인 개발 가이드 | 2 | title: 플러그인 개발 가이드 |
| 3 | document_id: 60-plugin-development-guide | 3 | document_id: 60-plugin-development-guide |
| 4 | slug: 60-plugin-development-guide | 4 | slug: 60-plugin-development-guide |
| 5 | target_editor_version: 9.0.0 | 5 | target_editor_version: 9.0.0 |
| 6 | document_type: plugin | 6 | document_type: plugin |
| 7 | doc_type: plugin | 7 | doc_type: plugin |
| 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: Plugin | 11 | core_type: Plugin |
| 12 | stability: [Version-Bound] | 12 | stability: [Version-Bound] |
| 13 | stable_anchor: [] | 13 | stable_anchor: [] |
| 14 | version_bound: [] | 14 | version_bound: [] |
| 15 | related_docs: [] | 15 | related_docs: [] |
| 16 | related_files: [] | 16 | related_files: [] |
| 17 | related_functions: [] | 17 | related_functions: [] |
| 18 | related_classes_modules: [] | 18 | related_classes_modules: [] |
| 19 | related_features: [] | 19 | related_features: [] |
| 20 | related_ui: [] | 20 | related_ui: [] |
| 21 | change_risk: 수정 범위를 넓게 잡으면 관련 기능과 문서 흐름에 영향이 생길 수 있습니다. | 21 | change_risk: 수정 범위를 넓게 잡으면 관련 기능과 문서 흐름에 영향이 생길 수 있습니다. |
| 22 | reading_order: 20 | 22 | reading_order: 20 |
| 23 | summary: 플러그인을 개발하는 방법과 수명주기, 이벤트 연결을 설명 문서 | 23 | summary: 플러그인을 개발하는 방법과 수명주기, 이벤트 연결을 설명 문서 |
| 24 | description: 플러그인을 개발하는 방법과 수명주기, 이벤트 연결을 설명 | 24 | description: 플러그인을 개발하는 방법과 수명주기, 이벤트 연결을 설명 |
| 25 | tags: [plugin, development, guide] | 25 | tags: [plugin, development, guide] |
| 26 | version_tag: 9.0.0 | 26 | version_tag: 9.0.0 |
| 27 | maintenance_difficulty: Medium | 27 | maintenance_difficulty: Medium |
| 28 | test_requirement: Medium | 28 | test_requirement: Medium |
| 29 | ai_agent_risk: Medium | 29 | ai_agent_risk: Medium |
| 30 | source_basis: [현재 코드 분석 기반, 웹 참고 자료 기반] | 30 | source_basis: [현재 코드 분석 기반, 웹 참고 자료 기반] |
| 31 | beginner_section_included: true | 31 | beginner_section_included: true |
| 32 | webmaster_section_included: true | 32 | webmaster_section_included: true |
| 33 | developer_section_included: true | 33 | developer_section_included: true |
| 34 | --- | 34 | --- |
| 35 | ## 플러그인 개발 단계 | 35 | ## 플러그인 개발 단계 |
| 36 | 36 | ||
| 37 | 1. **설계**: 새 플러그인을 개발하기 전에 어떤 기능을 제공할지 명확히 정의하고, 기존 플러그인과 중복되지 않는지 검토합니다. | 37 | 1. **설계**: 새 플러그인을 개발하기 전에 어떤 기능을 제공할지 명확히 정의하고, 기존 플러그인과 중복되지 않는지 검토합니다. |
| 38 | 2. **파일 생성**: `plugin/your_plugin/your_plugin.js`와 필요한 경우 `your_plugin.css`, PHP 업로드 스크립트를 생성합니다. | 38 | 2. **파일 생성**: `plugin/your_plugin/your_plugin.js`와 필요한 경우 `your_plugin.css`, PHP 업로드 스크립트를 생성합니다. |
| 39 | 3. **등록**: `editor.lib.php`의 `$plugin_priority` 배열에 플러그인 이름을 추가하여 로딩 순서를 지정합니다. | 39 | 3. **등록**: `editor.lib.php`의 `$plugin_priority` 배열에 플러그인 이름을 추가하여 로딩 순서를 지정합니다. |
| 40 | 4. **커맨드 정의**: 플러그인 클래스 안에서 `handleCommand` 메서드를 구현하여 사용자 명령에 반응합니다. | 40 | 4. **커맨드 정의**: 플러그인 클래스 안에서 `handleCommand` 메서드를 구현하여 사용자 명령에 반응합니다. |
| 41 | 5. **UI 통합**: toolbar.js 또는 스킨 파일에 버튼을 추가하고, `data-command` 속성을 플러그인 명령에 맞춰 설정합니다. | 41 | 5. **UI 통합**: toolbar.js 또는 스킨 파일에 버튼을 추가하고, `data-command` 속성을 플러그인 명령에 맞춰 설정합니다. |
| 42 | 42 | ||
| 43 | ### 수명주기와 이벤트 | 43 | ### 수명주기와 이벤트 |
| 44 | 44 | ||
| 45 | 플러그인은 에디터 초기화 시점에 등록되고 `init` 함수가 호출됩니다. 이후 사용자의 입력이나 명령에 따라 `handleCommand`가 호출되며, 필요 시 `onContentSet`, `onSelectionChange` 등의 이벤트 핸들러를 구현합니다. | 45 | 플러그인은 에디터 초기화 시점에 등록되고 `init` 함수가 호출됩니다. 이후 사용자의 입력이나 명령에 따라 `handleCommand`가 호출되며, 필요 시 `onContentSet`, `onSelectionChange` 등의 이벤트 핸들러를 구현합니다. |
| 46 | 46 | ||
| 47 | ### 테스트와 배포 | 47 | ### 테스트와 배포 |
| 48 | 48 | ||
| 49 | 개발한 플러그인은 다양한 브라우저와 화면 크기에서 테스트해야 합니다. 오류가 없고 성능이 만족스럽다면, 문서 작성 규칙에 따라 설명서를 작성하고 내부 배포 또는 오픈 소스로 공개할 수 있습니다. | 49 | 개발한 플러그인은 다양한 브라우저와 화면 크기에서 테스트해야 합니다. 오류가 없고 성능이 만족스럽다면, 문서 작성 규칙에 따라 설명서를 작성하고 내부 배포 또는 오픈 소스로 공개할 수 있습니다. |
| 50 | 50 | ||
| 51 | ## 플러그인 설계 원칙 | 51 | ## 플러그인 설계 원칙 |
| 52 | 52 | ||
| 53 | 좋은 플러그인은 기능이 작더라도 책임이 선명해야 합니다. 툴바 버튼 표시, 사용자 입력 수집, 콘텐츠 삽입, 서버 통신, 스타일 처리가 한 파일 안에 뒤섞여 있으면 유지보수가 급격히 어려워집니다. 가능하면 버튼 트리거와 콘텐츠 처리 로직을 분리하고, 서버 의존 기능은 별도 엔드포인트 문서와 함께 관리하세요. | 53 | 좋은 플러그인은 기능이 작더라도 책임이 선명해야 합니다. 툴바 버튼 표시, 사용자 입력 수집, 콘텐츠 삽입, 서버 통신, 스타일 처리가 한 파일 안에 뒤섞여 있으면 유지보수가 급격히 어려워집니다. 가능하면 버튼 트리거와 콘텐츠 처리 로직을 분리하고, 서버 의존 기능은 별도 엔드포인트 문서와 함께 관리하세요. |
| 54 | 54 | ||
| 55 | ## 역호환성 전략 | 55 | ## 역호환성 전략 |
| 56 | 56 | ||
| 57 | 플러그인을 배포할 때는 최소 지원 버전을 문서 상단에 분명히 적고, `editor.lib.php`의 플러그인 등록 규칙과 충돌하지 않는 파일명 규칙을 지켜야 합니다. 특히 기존 사이트가 낮은 버전의 T2Editor를 쓰고 있다면, 새 플러그인이 요구하는 코어 이벤트나 CSS 클래스가 실제로 존재하는지 먼저 확인해야 합니다. | 57 | 플러그인을 배포할 때는 최소 지원 버전을 문서 상단에 분명히 적고, `editor.lib.php`의 플러그인 등록 규칙과 충돌하지 않는 파일명 규칙을 지켜야 합니다. 특히 기존 사이트가 낮은 버전의 T2Editor를 쓰고 있다면, 새 플러그인이 요구하는 코어 이벤트나 CSS 클래스가 실제로 존재하는지 먼저 확인해야 합니다. |
| 58 | 58 | ||
| 59 | ## 참고 자료 | 59 | ## 참고 자료 |
| 60 | 60 | ||
| 61 | - DSclub T2Editor 서비스 페이지: https://dsclub.kr/service/editor | 61 | - DSclub T2Editor 서비스 페이지: https://dsclub.kr/service/editor |
| 62 | - SIR T2Editor 8.1.2 소개 글: https://sir.kr/boards/g5_plugin/15016 | 62 | - SIR T2Editor 8.1.2 소개 글: https://sir.kr/boards/g5_plugin/15016 |
| 63 | 63 | ||