데이터를 불러오는 중입니다...
Word 기반의 교재 데이터(최대 454페이지, 약 77만 자)를 웹 서비스로 이관하고, 단락 단위 검색 기능과 관리자 업로드 시스템을 구축한 프로젝트입니다. 1인 백엔드 개발자로서 데이터 파싱 설계, 검색 엔진 최적화, 인증 구현, GitHub Actions 기반 CI/CD 구축까지 서버사이드 전반을 주도했습니다.
단락 단위의 대용량 텍스트 검색이 핵심 기능이었으나, 세 가지 제약이 동시에 존재했습니다.
LIKE '%검색어%' 쿼리가 Full Table Scan을 수행하여 평균 1500ms 소요ft_min_word_len이 2로 강제| 대안 | 접근 | 기각 사유 |
|---|---|---|
| Elasticsearch 도입 | 전문 검색 엔진으로 전환 | 프로젝트 일정·인프라 예산 제약으로 외부 인프라 추가 불가 |
| LIKE 쿼리 최적화 | 인덱스 힌트, 쿼리 튜닝 | Full Table Scan 구조 자체를 바꾸지 못하므로 근본적 한계 |
| FTS + 동적 LIKE 하이브리드 (채택) | FULLTEXT로 후보군 압축 후 LIKE로 정밀 검증 | — |
외부 인프라 없이 현재 RDBMS 환경을 극한까지 활용하는 것이 현실적인 판단이었습니다. "속도는 FTS가, 정확도는 LIKE가 담당"하는 역할 분리를 핵심 설계 원칙으로 세웠습니다.
FULLTEXT BOOLEAN MODE 쿼리를 실행. 동적 연산자(+단어*)를 붙여 조사 대응력을 높이고, 수십만 건을 수백 건으로 압축LIKE로 최종 필터링이 챌린지의 기술적 상세(역인덱스 원리, 하이브리드 라우팅 코드, 성능 측정 과정)는 인사이트 1500ms에서 400ms로: RDBMS 환경에서 77만 자 대용량 텍스트 검색 최적화 에서 깊이 있게 다루고 있습니다.
최대 454페이지, 약 77만 자에 달하는 Word 교재를 구조화하여 DB에 적재해야 했습니다. 두 가지 제약이 있었습니다.
| 대안 | 접근 | 기각 사유 |
|---|---|---|
| 서버 내 비동기 파이프라인 | 서버에서 업로드 → 파싱 → 적재 자동화 | 연 1~2회 갱신에 상시 파이프라인은 오버엔지니어링 |
| 수동 CSV 변환 | Word → Excel → CSV → DB 임포트 | 77만 자 서식 정보 손실, 반복 작업 시 휴먼 에러 |
| 로컬 스크립트 + 트랜잭션 (채택) | 로컬에서 파싱 후 트랜잭션으로 일괄 적재 | — |
연 1~2회 발생하는 갱신 작업에 서버 내 파이프라인을 구축하는 것은 과도한 투자라고 판단했습니다. 로컬 스크립트로 분리하되, 트랜잭션으로 데이터 무결성을 보장하는 실용적 접근을 선택했습니다.
mammoth 라이브러리로 Word 파일을 HTML로 변환하여 서식 정보 보존httpOnly/secure 쿠키로 XSS는 방어했으나, CSRF 대응이 부족했습니다. 이후 프로젝트에서 SameSite 정책과 Double Submit Cookie 방식을 적용하며 보안 설계의 폭을 넓혔습니다.