WritingPractice
쓰기 연습장 — 숫자/한글/영어/한자 + 프린트/온라인 모드 + 학습 흐름
상태
| 항목 | 값 |
|---|---|
| Layer | domain |
| Tier | L1 |
| Status | deprecated |
| Version | 0.9.0 |
| 가격 | Free (free) |
| **카� | |
| �고리** | Learning |
개요
⛔ Deprecated (ADR-039 사례 6)
ADR-039: Plugin Scope 원칙 적용 — 단일 도메인 (한자/한글/숫자/영어 학습) 전용 plugin 부적격 판정.
부적격 근거
- AttemptScorer: stroke 비교 점수는 학습용 정확도 평가 한정 (signature 검증 등 다른 용도와 의미 다름)
- PrintLayoutCalculator: A4 프린트 � � 레이아웃은 "따라쓰기" UX 한정
- WritingProgram / WritingTemplate enum: 학습 단계 � � — exam.how / academy.how 외 시나리오 부재
현재 상태 (중요)
⚠️ 본 plugin 은 신규 plugin 이었으므로 다른 deprecated plugin 과 달리 SaaS 측 원본 코드가 없습니다.
- plugin 폴더:
platform/web/laravel/plugins/WritingPractice/(� �의 README 260430-1310 의 MVP 구현) - 원본 SaaS: 없음 (본 plugin 작� 이 신규 콘� �츠 시스� � 만들기였음)
- 활용 중인 SaaS: 없음 (Phase 4 어댑터 작� 미진행으로 누구도 활용 안 함)
Deprecated 의 의미
- ❌ plugin 으로 store 에 release 하지 않음
- ❌ Phase 3 / Phase 4 진행 안 함
- � plugin 폴더는 reference 로 보존 (향후 academy.how / exam.how 가 직접 학습 콘� �츠 만들 때 참고)
만약 academy.how / exam.how 가 학습 콘�
�츠를 실제 운영한다면
app/Sites/{Site}/Practice/폴더 생성 (또는 Modules 등 도메인 폴더)- 본 plugin 의 Pure 컴포넌트 (AttemptScorer / PrintLayoutCalculator / WritingItem DTO / Enums) 를 참고로 복사
- 도메인 모델 (WritingProgram → SchoolLevel/Subject 등 SaaS 자체 모델) 과 통합
- SaaS 측 Service / Controller / Filament Resource 작성
DigitalInk / RecognitionBridge / BrushConfiguration / HandwritingInput 4개는 plugin 으로 유지 (범용 어댑터 — 서� 패드 / drawing app 등에서도 활용).
이력
- 2026-04-30: WritingPractice plugin Phase 1+2 RC 0.9.0 — 본 � �의 (260430-1310) 의 신규 plugin MVP 작성
- 2026-05-02: ADR-039 적용 — 신규 plugin 이지만 단일 도메인 (학습용 stroke 채점 + 학습용 프린트 레이아웃) 전용 → plugin 부적격. status
wip→deprecated. 원본 SaaS 코드 없으므로 "이전" 개� � 없음.
(이전) 개요
개요
WritingPractice 는 multi-saas-kit 의 Layer 3 Domain Plugin � 니다. 본 plugin 작� 의 최� 목표 — 숫자/한글/영어/한자 쓰기 연습을 위한 콘� �츠 모델, 프린트 레이아웃, 학습 흐름, 채점 로직을 제공합니다.
HandwritingInput Composite (DigitalInk + BrushConfiguration + RecognitionBridge) 와 DocumentProcessor 위에 학습 도메인 레이어를 얹는 완성형 학습 시스� �.
콘�
�츠 모델
쓰기 연습장 (Program)
├── 숫자 쓰기 (1~9, 0, 두 자릿수)
├── 한글 쓰기 (자음, 모음, 받침)
├── 영어 쓰기 (대문자, 소문자, 단어)
└── 한자 쓰기 (기본 획, 숫자 한자, 기초 한자)
초기 MVP: 숫자 1~9 쓰기
핵심 컴포넌트
Enums (2�
)
| Enum | Cases | 메서드 |
|---|---|---|
WritingProgram | NUMBER / HANGUL / ENGLISH / HANJA | defaultLanguage(), supportsStrokeOrder() |
WritingTemplate | MODEL_THEN_TRACE / BLANK_ONLY / STROKE_ORDER / QUIZ | showsModel(), showsHint() |
WritingItem (DTO)
쓰기 연습 대상 — 1글자 단위. character, program, romanization, strokeCount, audioUrl. fromArray() / toArray() 변환.
PrintLayoutCalculator (Pure)
A4 프린트 레이아웃 결정. mm 단위 좌표 + cells_per_row/rows_per_page/total_pages.
$calc = PrintLayoutCalculator::fromConfig(config('writing-practice'));
$layout = $calc->calculate(50); // 50개 글자 → 페이지 분할
// ['cells_per_row' => 6, 'rows_per_page' => 8, 'total_pages' => 2, ...]
$positions = $calc->rowPositions(rowIndex: 0, cellsInRow: 5);
// [['x_mm' => 15.0, 'y_mm' => 45.0, 'size_mm' => 24.0], ...]
AttemptScorer (Pure)
학생 stroke vs 모범 stroke 비교 점수 (naive). DigitalInk normalize 후 각 stroke 의 시작/중점/끝 3 sample 평균 거리 → 100점 환산. stroke 수 차이는 -10점/stroke 페널티.
$scorer = AttemptScorer::fromConfig(config('writing-practice'));
$result = $scorer->score($modelStrokes, $attemptStrokes);
// ['score' => 75, 'passed' => true, 'avg_distance' => 0.125, 'stroke_count_diff' => 0]
주의: 본 채점기는 "유사도 hint" 수준. 정식 평가는 외부 LLM/전용 라이브러리 사용 권장.
설정 (config/writing-practice.php)
return [
'enabled' => env('PLG_WRITING_PRACTICE_ENABLED', true),
'print' => [
'page_width_mm' => 210.0, 'page_height_mm' => 297.0,
'margin_mm' => 15.0,
'cell_size_mm' => 24.0, 'cell_spacing_mm' => 4.0,
'header_reserve_mm' => 30.0,
],
'scoring' => [
'min_score' => 60,
'distance_scale' => 200,
'max_strokes' => 30,
],
];
학습 흐름 예시
use App\Plugins\WritingPractice\Enums\{WritingProgram, WritingTemplate};
use App\Plugins\WritingPractice\Data\WritingItem;
use App\Plugins\WritingPractice\Services\{PrintLayoutCalculator, AttemptScorer};
// 1) 콘�
�츠 정의
$item = WritingItem::fromArray([
'character' => '7',
'program' => 'number',
'stroke_count' => 1,
]);
// 2) 프린트 레이아웃
$layout = PrintLayoutCalculator::fromConfig(config('writing-practice'))->calculate(45);
// PDF 생성 시 layout['cells_per_row'] / rowPositions() 활용
// 3) 온라인 학습 — HandwritingInput 으로 stroke 수집
$result = $handwritingInput->process([
'ink' => $studentInk,
'width' => 200,
'height' => 200,
]);
// 4) 채점
$scorer = AttemptScorer::fromConfig(config('writing-practice'));
$score = $scorer->score($modelStrokes, $studentStrokes);
if ($score['passed']) {
// 다음 글자로
}
의존성
- HandwritingInput — 학생 stroke � 력 (Composite)
- DocumentProcessor — 모범 콘� �츠 HTML 렌더 + anchor (학습지 인쇄)
다른 Plugin 과의 관계
- AssessmentReport — 학습 결과 리포트 생성 (선택)
- Annotation — 학생 메모 anchor (선택)
다음 단계 (Phase 3+)
- 표준
WritingProgram/Unit/Lesson/Item/TemplateModel + Migration (선택 활성) - Filament Resource (운영자 콘� �츠 관리)
- Livewire 캔버스 컴포넌트 (학습자 viewer)
- DTW (Dynamic Time Warping) 기반 고급 채점
- 한자 획순 애니메이� �
- writing_attempts 저장 로그 (학습 이력)
출처
신규 plugin — 본 � �의 (260430-1310_writing_practice_plugin-쓰기연습장플러그인화) 의 Phase 2 MVP 결과물.
라이선스
MIT
의존성
데모
- Platform 관리자 패널에서 메타 확인 🔒 로그인 필요
- 사용 예시 (PHP)
🛒 Plugin Store에서 보기: store.codebase.how/plugins/writing-practice