프로젝트를 진행하다 보면 가장 당황스러운 순간은 핵심 로직이 예상대로 구현되지 않을 때입니다. 특히, 계획이 이미 완료된 상태에서 이런 상황을 맞닥뜨리면 이전 작업이 아까워 잘못된 방향을 고수하거나, 기능을 타협해 완성도가 떨어진 서비스를 제공할 위험이 생깁니다.
이러한 문제를 방지하기 위해, 저는 POC(Proof of Concept)를 통해 로직의 검증을 먼저 진행합니다. 간단한 테스트 사이트를 개발해 로직의 가능성을 먼저 확인하는 것이지요. 이번 글에서는 타수 측정 로직을 중심으로 POC 개발 과정을 공유합니다.
먼저, 분당 타수를 계산하는 방법에 대해 알아보겠습니다.
타수를 측정하는 방식은 다양하며, 대표적으로 다음 두 가지가 있습니다.
보통 CPM 방식이 익숙하지만, 문제는 영어와 한글의 구조적 차이입니다.
hello
→ 5 글자)강
→ 1 글자 ㄱ + ㅏ + ㅇ
→ 3 글자국내에서 많이 사용하는 한컴 타자 연습의 타수 계산 방식을 살펴보면, 공식 패치노트를 통해 다음과 같은 사실을 알 수 있습니다:
자소 단위를 기준으로 타수를 계산합니다.
즉, '강'이라는 글자를 입력할 경우, 자소로 분리하여 ㄱ
, ㅏ
, ㅇ
각각을 하나의 글자로 취급하는 방식입니다.
그렇다면 자소 단위로 타수를 계산하는 로직을 어떻게 구현할 수 있을까요?
우선, 한글의 조합 규칙을 이해하고 자소를 분리하는 로직을 작성해야 합니다.
JavaScript에서 한글 자소 분리를 구현하기 위해 charCodeAt
과 같은 유니코드 연산을 사용할 수 있습니다. 간단한 예시는 다음과 같습니다:
function splitHangul(char) {
const HANGUL_START = 0xac00;
const HANGUL_END = 0xd7a3;
const INITIALS = [
'ㄱ', 'ㄲ', 'ㄴ', 'ㄷ', 'ㄸ', 'ㄹ', 'ㅁ', 'ㅂ', 'ㅃ',
'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅉ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ',
];
const MEDIALS = [
'ㅏ', 'ㅐ', 'ㅑ', 'ㅒ', 'ㅓ', 'ㅔ', 'ㅕ', 'ㅖ', 'ㅗ', 'ㅘ', 'ㅙ', 'ㅚ',
'ㅛ', 'ㅜ', 'ㅝ', 'ㅞ', 'ㅟ', 'ㅠ', 'ㅡ', 'ㅢ', 'ㅣ',
];
const FINALS = [
'', 'ㄱ', 'ㄲ', 'ㄳ', 'ㄴ', 'ㄵ', 'ㄶ', 'ㄷ', 'ㄹ', 'ㄺ', 'ㄻ', 'ㄼ', 'ㄽ',
'ㄾ', 'ㄿ', 'ㅀ', 'ㅁ', 'ㅂ', 'ㅄ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅊ', 'ㅋ',
'ㅌ', 'ㅍ', 'ㅎ',
];
const charCode = char.charCodeAt(0);
if (charCode < HANGUL_START || charCode > HANGUL_END) {
return [char]; // 한글이 아닐 경우 그대로 반환
}
const offset = charCode - HANGUL_START;
const initialIndex = Math.floor(offset / 588);
const medialIndex = Math.floor((offset % 588) / 28);
const finalIndex = offset % 28;
return [INITIALS[initialIndex], MEDIALS[medialIndex], FINALS[finalIndex]];
}
console.log(splitHangulSyllable('강'));
// 출력: ['ㄱ', 'ㅏ', 'ㅇ']
또는 라이브러리를 사용하는 방법도 있습니다.
es-hangul
라이브러리는 이러한 자소 분리 기능을 포함하고 있습니다.
이처럼 핵심 로직을 사전에 검증하면, 예상치 못한 문제를 미리 발견하고 해결할 수 있습니다. 이번 글에서는 한글 타수 측정을 위한 한글 자소 분리를 구현해 보았습니다.
다음 단계에서는 이 로직을 이용해 한글 타수 측정이 가능한 테스트 사이트 개발 과정에 대해 다뤄보겠습니다.