티스토리 뷰

반응형

Next.js + Vercel 환경에서 한글 검색 구현기: 삽질기부터 직접 bigram 구현까지

Next.js + Vercel 환경에서 한글 검색 기능 구현이 의외로 골치 아픈 일이었고 이를 정리하기 위해서 공유합니다.

 

1) LIKE 검색? 간단하지만 성능에 불안 요소

처음엔 누구나 WHERE title LIKE '%검색어%'로 시작합니다.
간단하죠. 하지만 다음과 같은 문제가 있습니다:

  • 인덱스를 타지 못해 데이터가 많아지면 검색 속도가 확 느려짐
  • 전체 스캔이 발생해 비용이 비쌈
  • 단순 포함 검색이라 의미 기반 검색 불가

그래서 바로 포기했습니다.

 

2) PostgreSQL tsvector? …한글 형태소 분석은 미지원

PostgreSQL의 tsvector + to_tsvector 조합은 풀텍스트 검색을 위해 매우 강력한 기능입니다.
예시:

SELECT * FROM posts WHERE to_tsvector('english', title) @@ plainto_tsquery('english', 'search');
 

하지만 문제는 한글입니다. PostgreSQL 기본 설정에선 영어, 프랑스어 등은 지원하지만 한국어는 형태소 분석기가 없어서 의미 단위로 쪼갤 수 없습니다.

 

그래서 tsvector를 그대로 쓸 수 없다는 한계가 있었죠.

 

tsvector?

간단히 말해 tsvector는 검색을 빠르게 하기 위한 텍스트 인덱스 포맷입니다.
단어 단위로 쪼개서 인덱싱하고, tsquery로 빠르게 검색할 수 있게 해줍니다.

 

3) 형태소 분석기 라이브러리 사용? → Vercel에서 막힘

여러 형태소 분석기를 활용하려 했지만, Vercel은 서버리스 환경이라:

  • 별도 라이브러리를 설치하거나
  • 자바나 C++ 기반으로 실행되는 것 자체가 불가능합니다.

Vercel은 무조건 빠르고 짧게 끝나는 함수 중심으로 돌아가기 때문에, 별도 형태소 분석기는 애초에 구조적으로 어렵습니다.

 

4) ETRI 형태소 분석기 사용? → IP 차단됨 😭

다음 시도로 ETRI 공개 API를 활용했는데, 여기서도 문제가 발생합니다. (https://aiopen.etri.re.kr/)

  • 서버리스는 호출할 때마다 서버 IP가 바뀌는 구조
  • 일정 횟수 초과되면 "다중 IP 접근으로 인한 차단" 발생
  • 결과적으로 ETRI API도 지속적으로 쓸 수 없음

 

5) pg_bigm 확장 모듈? → Supabase에서 미지원

PostgreSQL에는 pg_bigm이라는 강력한 Bigram 기반 검색 확장이 있습니다.
한글처럼 공백 없이 붙어 있는 언어에서 유용하죠.

하지만 Supabase에서는 아직 pg_bigm 확장을 공식 지원하지 않습니다.
설치하려면 커스텀 서버를 써야 하고, 그건 Supabase를 쓰는 이유 자체를 흐리게 만들죠.

 

Bigram?

Bigram은 문자열을 두 글자씩 끊어서 분석하는 방식

 

최종 해결책: 직접 Bigram + tsvector 조합 구현

결국 선택한 방법은 직접 Bigram으로 쪼개서 tsvector 형태로 저장하고, 이를 활용하는 방식이었습니다.

예시:

// 예: "한국어검색" → ["한국", "국어", "어검", "검색"]
function toBigram(str: string): string[] {
  const grams = [];
  for (let i = 0; i < str.length - 1; i++) {
    grams.push(str.slice(i, i + 2));
  }
  return grams;
}

그리고 이 결과를 미리 tsvector 타입 형태로 변환해서 별도 컬럼에 저장해두고, 검색 키워드도 bigram 형태로 만들어 tsquery를 수행합니다. 

 

+ 컬럼은 tsvector 타입이어야 하고, gin 인덱스를 걸어야 성능상 이점이 있습니다.

 

 

마무리

Next.js + Vercel + Supabase 조합에서 한글 검색을 제대로 구현하기 위한 삽질기를 정리해봤습니다.

  • LIKE는 성능상 한계
  • PostgreSQL 기본 tsvector는 한글 미지원
  • 외부 형태소 분석기/서비스는 서버리스에서 사용이 어려움
  • 그래서 결국 Bigram + tsvector 방식으로 직접 해결

비슷한 환경에서 고민 중이라면, 이 글이 조금이나마 도움이 되었으면 좋겠습니다.

반응형
댓글