# 한국어 형태소 분석기를 브라우저에서 직접 돌리는 WASM 툴을 만들었습니다 (keyword.kim)

안녕하세요, 오랜만입니다.

예전에 Naver 검색 자동완성 크롤링과 형태소 분석을 하나로 묶은 툴을 만들어서 써왔는데, 이번에 완전히 새로 골로부터 다시 썼습니다. 이번에** 서버가 전혀 필요 없습니다**. 모든 게 브라우저 안에서 돌아갑니다.

서비스 링크: https://keyword.kim

## 왜 다시 만들었나

기존에 쓰던 방식은 이랬습니다.

1. 네이버/구글 자동완성 쿼리를 Python 서버에서 수집
2. 결과를 외부 API(Khaiii)에 날려서 형태소 분석
3. 결과를 DB에 저장하고 관리 화면에서 조회

문제가 몇 개 있었습니다.

- **서버 유지 비용**: Python 서버 돌리고 DB 유지하고, SSL 인증서 갱신하고... 작은 툴 하나에 서버 아키텍처가 너무 무거웠습니다.
- **API 호출 지연**: 로컬에서 분석하려면 외부 API를 타야 해서 지연이 발생했고, API 제약에도 묶였습니다.
- **한국어 분석의 한계**: 영문용 툴(Wordstat, SEMrush 형태소 분석 부분)은 한국어 조사(은/는, 이/가, 을/를)를 제대로 구분하지 못했습니다. "데이터 분석"과 "데이터에 분석"의 검색 의도가 완전히 다른데도 같은 결과로 나오는 게 일상적이었습니다.

## 이번엔 브라우저에서 다 돌립니다

keyword.kim의 핵심 분석 엔진은 **Khaiii(Kakao 형태소 분석기)의 WebAssembly 빌드**입니다.

구현 개요:

```
사용자 브라우저
  ├── Khaiii WASM 모듈 로드 (CDN/NPM)
  ├── 입력 텍스트 → 형태소 분석 (온디바이스)
  └── 자동완성 결과 시각화 (Client-side)
```

### 왜 WASM인가

Khaiii는 카카오에서 공개한 한국어 형태소 분석기입니다. C++로 작성되어 있고, **Emscripten으로 WASM 컴파일하면 브라우저에서 거의 네이티브 속도로 돌아갑니다**.

장점:

- **서버 0대**: 분석 로직全部 클라이언트에서 실행
- **프라이버시**: 텍스트가 서버로 전송되지 않음
- **비용 0원**: Cloudflare Pages Serverless와 조합하면 월 $0로 운영 가능
- **오프라인 지원**: 한번 로드되면 네트워크 없이도 분석 가능

### 기술 스택

| 레이어 | 기술 |
|--------|------|
| 배포 | Cloudflare Pages (Serverless Functions) |
| 분석 엔진 | Khaiii WASM (Emscripten 빌드) |
| 프론트엔드 | vanilla JS + CSS |
| 자동완성 | 네이버/구글 크롤링 (Serverless Functions) |

### 자동완성 크롤링도 서버리스로

자동완성 쿼리 수집 부분은 Cloudflare Pages Functions에서 돌립니다. 서버리스 함수가 네이버/구글 검색 API에 요청하고, 결과를 WASM 분석 엔진으로 보냅니다.

핵심 로직은 간단합니다:

```javascript
// Cloudflare Pages Functions 예시
export async function onRequest() {
  const query = getRequest().url.searchParams.get('q');
  const naverResults = await fetchNaverAutocomplete(query);
  const googleResults = await fetchGoogleAutocomplete(query);
  
  return {
    naver: naverResults,
    google: googleResults
  };
}
```

자동완성 결과와 형태소 분석을 **한 번의 요청으로** 받아볼 수 있습니다.

## 실제로 어떤 결과가 나오나

예를 들어 "머신러닝"이라는 키워드로 분석해보겠습니다.

**일반 영문 툴**:
- 머신러닝 → 머신러닝 (하나의 토큰)
- 조사 구분 X

**keyword.kim (Khaiii WASM)**:
- 머신 → NNP (고유명사)
- 러닝 → NNG (일반명사)
- 조사 분리: "머신러닝에" → 머신(NNP) + 러닝(NNG) + 에(JKB)

이제 "머신러닝 데이터"와 "머신러닝에 데이터"가 다른 결과로 나옵니다. 검색 의도가 다른데 같은 토큰으로 취급하던 문제가 해결됩니다.

## Open KYP도 넣었습니다

한국어 특성상 약어/약자가 매우 많습니다. "AI", "ML", "KTX", "KBS"... 이런 약어의 **정식 명칭**을 알아내려는 기능이 Open KYP API와 연동되어 있습니다.

예:
- "KTX" → "Korean Train eXpress"
- "KBO" → "Korea Baseball Organization"

이건 서버에서 처리하고 있습니다.

## 배포도 서버리스로

전체 프로젝트는 **Cloudflare Pages**에 올려놨습니다.

- 정적 파일: CF Pages Static Hosting
- 자동완성 API: CF Pages Functions (Serverless)
- 비용: 월 $0 (Free tier 내)

CF Pages가 좋은 건, 서버 관리 없이도 전 세계 CDN을 통해 콘텐츠를 배포할 수 있다는 점입니다. 한국어 검색 자동완성 크롤링도 CF의 전 세계 edge 네트워크에서 돌아갑니다.

## 마무리하며

이 프로젝트를 통해 얻은 교훈:

1. **WASM는 실용적이다**: Khaiii를 브라우저에서 돌려보니 응답 속도가 생각보다 훨씬 빠름
2. **서버리스는 소형 프로젝트에 딱이다**: 작은 툴에 서버 돌리는 건 과잉입니다
3. **한국어 NLP는 여전히 기회**: 영문 중심 도구들이 한국어는 대충 넘어가는 틈새가 큼

이 툴이 한국어 키워드 분석에 관심 있는 분들께 도움이 되길 바랍니다.

피드백이나 질문은 댓글로 남겨주세요!

---

*keyword.kim — 한국어 키워드 분석 도구*
*https://keyword.kim*
