Fastats
통계 검색 플랫폼
KOSIS 통계표 26만 건을 Elasticsearch에 색인하고, Nori를 적용해 검색 응답 시간을 줄였습니다.
허동민
Java와 Spring Boot를 중심으로
성능 최적화, 실시간 데이터 파이프라인, 검색, AI · RAG를 다루는
백엔드 개발자입니다.
// StatisticsSearchService.java
return es.search(NativeQuery.builder()
.withQuery(q -> q.match(m -> m
.field("title").query(keyword)
.analyzer("nori_analyzer")))
.build(), StatisticsDoc.class);병목부터 확인합니다
프로파일링과 지표로 느린 구간 추적
운영까지 고려합니다
트래픽과 장애 상황을 고려한 구조 설계
변경 전후를 측정합니다
응답 시간과 API 요청 수를 같은 조건에서 비교
02 — Projects
각 프로젝트에서 어떤 병목이 있었고, 왜 구조를 바꿨으며, 결과가 얼마나 달라졌는지 정리했습니다.
통계 검색 플랫폼
KOSIS 통계표 26만 건을 Elasticsearch에 색인하고, Nori를 적용해 검색 응답 시간을 줄였습니다.
지역별 주식 투자 플랫폼
KIS 실시간 시세를 Kafka로 처리해 WebSocket으로 전달하고, 지역별 종목 순위를 지도에 표시했습니다.
AI 자기소개서 어시스턴트
사용자가 저장한 경험을 RAG로 찾아 초안에 반영하고, 생성 단계는 SSE로 전달했습니다.
KOSIS 통계표 26만 건을 Elasticsearch에 색인하고 Nori를 적용해, 검색 응답 시간을 3,200ms에서 42ms로 줄였습니다.
검색 데이터를 Elasticsearch에 색인해 풀 스캔을 없애고, Nori 분석기로 조사가 붙은 검색어도 처리했습니다.
검색 응답시간 (ms)
색인 문서 수 (K)
검색 정확도 (%)
선택한 기술과 함께 검토했던 대안
별도 인프라는 필요 없지만 한국어 형태소 분석을 지원하지 않아 조사 검색 문제를 해결할 수 없었습니다.
도입은 비교적 쉽지만, 3주 안에 팀원 모두가 참고할 만한 한국어 자료와 사례가 부족했습니다.
Nori로 한국어 형태소를 처리할 수 있고, Spring 연동 자료도 충분했습니다.
별도 검색 서버를 운영해야 하지만, 한국어 검색과 팀의 개발 기간을 고려해 Elasticsearch를 선택했습니다.
문제 해결 전후의 시스템 구성
문제 · 26만 건을 LIKE 쿼리로 조회하자 전체 테이블 스캔이 발생해 응답에 최대 3,200ms가 걸렸습니다. 단순 문자열 비교 방식이라 '통계청의'처럼 조사가 붙은 검색어도 처리하지 못했습니다.
KIS 실시간 시세를 Kafka로 처리해 WebSocket으로 전달하고, 시·구·동별 종목 순위를 카카오맵에 표시했습니다.
KIS WebSocket으로 시세를 한 번만 수신해 Kafka로 넘기고, 처리된 데이터는 연결된 클라이언트에 WebSocket으로 전달했습니다.
서버 API 요청/분
업데이트 지연 (ms)
지역 커버 (읍면동)
선택한 기술과 함께 검토했던 대안
기존 Redis를 그대로 쓸 수 있지만, 구독자가 없을 때 발행된 메시지는 사라져 장애 후 재처리할 수 없습니다.
메시지 전달은 안정적이지만, 소비가 끝난 과거 데이터를 다시 처리하는 용도에는 맞지 않았습니다.
운영할 구성 요소는 늘지만, 토픽에 남은 메시지를 장애 복구 후 다시 처리할 수 있습니다.
1인 프로젝트에는 다소 무겁지만, 장애 후 재처리가 필요해 Kafka를 선택했습니다.
문제 해결 전후의 시스템 구성
문제 · 지역별 종목 순위를 갱신하려고 각 클라이언트가 5초마다 API를 호출했습니다. 접속자가 늘자 같은 데이터를 확인하는 요청이 분당 600건 넘게 발생했습니다.
저장된 경험을 RAG로 검색해 자기소개서 초안에 반영하고, 생성 단계별 진행 상태를 SSE로 전달합니다.
질문과 관련된 사용자 경험을 RAG로 찾아 프롬프트에 넣고, 생성 과정은 5단계로 나눠 SSE로 전달했습니다.
초안 생성 시간 (초)
경험 매칭 정확도 (%)
자연스러움 점수 (%)
선택한 기술과 함께 검토했던 대안
사용자별로 모델을 다시 학습해야 하고, 경험 데이터가 바뀔 때마다 학습을 반복해야 합니다.
구현은 단순하지만, 저장된 경험이 많아질수록 입력 토큰과 응답 시간이 함께 늘어납니다.
재학습 없이 경험을 추가할 수 있고, 질문과 관련된 항목만 프롬프트에 넣을 수 있습니다.
경험을 바로 추가·수정할 수 있고 입력 토큰을 제한할 수 있어 RAG를 선택했습니다.
문제 해결 전후의 시스템 구성
문제 · 질문만 모델에 전달하면 사용자의 경험이 빠진 비슷한 문장이 반복됐습니다. 응답 생성이 30초를 넘길 때는 서버 타임아웃으로 결과를 받지 못했습니다.
03 — Skills
주력으로 쓰는 다섯 가지와, 프로젝트에서 함께 다룬 기술들입니다.
옆 카드를 누르거나 좌우로 밀어보세요
04 — Experience & Education
교육 과정에서 배운 내용을 팀 프로젝트와 개인 프로젝트에 적용해 왔습니다.
~/hurdong (main) $
AI·데이터 분석 교육 · 하나금융그룹 연계 프로젝트
알고리즘 교육 · 백엔드 중심 팀 프로젝트 3회
금융 도메인 상식과 Java · JSP 웹 개발 기초, 첫 팀 프로젝트
컴퓨터공학 학사 졸업
Contact
Available새로운 도전을 함께할 팀과 의미 있는 서비스를 만들고 싶습니다.
© 2026 허동민 · All rights reserved.
Designed & Built with Next.js + Tailwind CSS