본문으로 건너뛰기

WritingPractice

쓰기 연습장 — 숫자/한글/영어/한자 + 프린트/온라인 모드 + 학습 흐름

상태

항목
Layerdomain
TierL1
Statusdeprecated
Version0.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 가 학습 콘�

�츠를 실제 운영한다면

  1. app/Sites/{Site}/Practice/ 폴더 생성 (또는 Modules 등 도메인 폴더)
  2. 본 plugin 의 Pure 컴포넌트 (AttemptScorer / PrintLayoutCalculator / WritingItem DTO / Enums) 를 참고로 복사
  3. 도메인 모델 (WritingProgram → SchoolLevel/Subject 등 SaaS 자체 모델) 과 통합
  4. 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 wipdeprecated. 원본 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�

)

EnumCases메서드
WritingProgramNUMBER / HANGUL / ENGLISH / HANJAdefaultLanguage(), supportsStrokeOrder()
WritingTemplateMODEL_THEN_TRACE / BLANK_ONLY / STROKE_ORDER / QUIZshowsModel(), 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/Template Model + Migration (선택 활성)
  • Filament Resource (운영자 콘� �츠 관리)
  • Livewire 캔버스 컴포넌트 (학습자 viewer)
  • DTW (Dynamic Time Warping) 기반 고급 채점
  • 한자 획순 애니메이� �
  • writing_attempts 저장 로그 (학습 이력)

출처

신규 plugin — 본 � �의 (260430-1310_writing_practice_plugin-쓰기연습장플러그인화) 의 Phase 2 MVP 결과물.

라이선스

MIT

의존성

데모


🛒 Plugin Store에서 보기: store.codebase.how/plugins/writing-practice