허동민

안녕하세요, 백엔드 개발자

허동민입니다.

검색 최적화실시간 파이프라인AI · RAG

성능을 극한까지 끌어냅니다.

Java · Spring Boot를 주력으로 성능 최적화에 집착하는 백엔드 개발자입니다. 다양한 팀 프로젝트 경험을 통해 협업과 커뮤니케이션을 다듬어 왔고, 그 과정에서 병목을 직접 찾고 수치로 증명하는 습관이 생겼습니다. Elasticsearch 검색 응답을 3,200ms → 42ms (98.7%)로 단축하고, Kafka 실시간 파이프라인과 LangChain4j 기반 RAG 시스템까지 직접 구현했습니다.

Java 17/21Spring BootKafkaElasticsearchLangChain4jRedis
02.

프로젝트

03.

프로젝트 상세

01 / 03

Fastats — 통계 검색 플랫폼

KOSIS 통계표 26만 건을 Elasticsearch에 색인하고 Nori를 적용해, 검색 응답 시간을 3,200ms에서 42ms로 줄였습니다.

2024.10 ~ 2024.11 (3주)6인 팀
Java 17Spring BootElasticsearchMySQLMongoDBRedisDocker
SPOTLIGHT
검색 응답시간 — MySQL LIKE → Elasticsearch

BEFORE

3,200

ms

→

-98.7%

AFTER

42

ms

역색인 구조Nori 형태소 분석260K 문서 색인Spring Batch 자동 동기화
기술 성과

데이터 동기화

수동/단건→Spring Batch
자동화

색인 문서 수

0건→260,000+
신규 구축

한국어 검색

LIKE 전문 스캔→Nori 형태소 분석
조사 검색 지원

AI 추천

없음→Spring AI + Ollama
신규
성능 비교

검색 응답시간 (ms)

BEFORE
3200ms
AFTER
42ms

색인 문서 수 (K)

BEFORE
0K
AFTER
260K

검색 정확도 (%)

BEFORE
31%
AFTER
94%
아키텍처 개선
BEFORE— MySQL LIKE 검색
ClientSpring APIMySQLHTTP GETLIKE %kw%
Client
→
Spring API
→
MySQL
AFTER— Elasticsearch + Nori
ClientSpring APISpring BatchElasticsearchMySQLNativeQuery+NoribulkIndex()
Client
→
Spring API
→
Spring Batch
→
Elasticsearch
→
MySQL
아키텍처 전환 요약
문제 상황통계 검색

26만 건을 LIKE 쿼리로 조회하자 전체 테이블 스캔이 발생해 응답에 최대 3,200ms가 걸렸습니다. 단순 문자열 비교 방식이라 '통계청의'처럼 조사가 붙은 검색어도 처리하지 못했습니다.

AS-ISMySQL LIKE 검색
  • ▸풀 테이블 스캔 (260K rows)
  • ▸한국어 형태소 미지원
→
TO-BEElasticsearch + Nori
  • ▸역색인 기반 검색
  • ▸한국어 형태소 분석
backend/src/search/StatisticsSearchService.java
02 / 03

HanaZoom — 지역별 주식 투자 플랫폼

KIS 실시간 시세를 Kafka로 처리해 WebSocket으로 전달하고, 시·구·동별 종목 순위를 카카오맵에 표시했습니다.

2025.06 ~ 2025.10 (4개월)1인 (개인 프로젝트)
JavaSpring BootMySQLRedisKafkaWebSocketDockerAWS EC2
SPOTLIGHT
실시간 주식 데이터 파이프라인
01KIS Open APIWebSocket 실시간 주식 수신Source
02KafkaTemplate.send()CompletableFuture (async)Async
03stock-realtime-dataKafka TopicTopic
04@KafkaListenerwts-consumer-group · ConcurrentHashMap 캐시Consumer
05session.sendMessage()WebSocket 세션 직접 브로드캐스트Push
기술 성과

지역 시각화

미지원→시·구·동 3단계
신규

주식 데이터

REST 폴링→KIS WebSocket
실시간화

랭킹 갱신

수동 조회→10분 자동 갱신
자동화

배포 환경

로컬→AWS EC2 + CI/CD
프로덕션
성능 비교

서버 API 요청/분

BEFORE
600
AFTER
12

업데이트 지연 (ms)

BEFORE
8000
AFTER
120

지역 커버 (읍면동)

BEFORE
0
AFTER
3500
아키텍처 개선
BEFORE— REST 폴링 방식
ClientSpring APIMySQLHTTP poll/5sfindAllByVolume()
Client
→
Spring API
→
MySQL
AFTER— KIS WebSocket + Kafka 파이프라인
KIS APIKafkaWebSocketClientsendRealTimeData()@KafkaListenersession.sendMessage()
KIS API
→
Kafka
→
WebSocket
→
Client
아키텍처 전환 요약
문제 상황실시간 주식 데이터 처리

지역별 종목 순위를 갱신하려고 각 클라이언트가 5초마다 API를 호출했습니다. 접속자가 늘자 같은 데이터를 확인하는 요청이 분당 600건 넘게 발생했습니다.

AS-ISREST 폴링 방식
  • ▸HTTP 주기적 폴링 (서버 부하↑)
  • ▸KIS 실시간 데이터 미연동
→
TO-BEKIS WebSocket + Kafka 파이프라인
  • ▸KIS Open API WebSocket 실시간 수신
  • ▸Kafka 비동기 처리 (CompletableFuture)
  • ▸@Scheduled 10분 지역 랭킹 갱신
BE/src/main/java/com/hanazoom/domain/stock/service/KafkaStockService.java
03 / 03

Resumade — AI 자기소개서 어시스턴트

저장된 경험을 RAG로 검색해 자기소개서 초안에 반영하고, 생성 단계별 진행 상태를 SSE로 전달합니다.

2026.03 ~ 진행중1인 (개인 프로젝트)
Java 21Spring Boot 3.4ElasticsearchRedisLangChain4jMySQL
SPOTLIGHT
작업별 LLM 모델 최적 선택
문항 분류gpt-5-miniOpenAI결정론적
초안 생성gpt-5-miniOpenAI창의적 생성
맞춤법 교정gpt-5-nanoOpenAI최경량·토큰 절감
최종 편집gpt-4o-miniOpenAI품질·비용 균형
기업 리서치Gemini 2.5 FlashGoogleGoogle Search 연동
JD 이미지Gemini 2.5 Flash-LiteGoogleVision·경량 파싱

7유형 PromptStrategy (+ DEFAULT) · Few-Shot 주입

지원동기직무경험문제해결협업성장과정조직문화기술인사이트
기술 성과

초안 생성 시간

20~30분→~60초
-97%

경험 검색 방식

키워드→벡터 유사도
관련도 기반

파이프라인 단계

없음→5단계 자동화
신규

OCR 이력서 파싱

수동 입력→Tess4J 자동화
신규
성능 비교

초안 생성 시간 (초)

BEFORE
1800s
AFTER
60s

경험 매칭 정확도 (%)

BEFORE
38%
AFTER
87%

자연스러움 점수 (%)

BEFORE
44%
AFTER
91%
아키텍처 개선
BEFORE— 단순 AI 프롬프트
UserAI APIRaw DraftZero-shot promptraw output
User
→
AI API
→
Raw Draft
AFTER— RAG + 단계별 문장 검토
UserExp.Vault(ES)LangChain4jAI Model5단계 정제search(k=5)cosineSimRAG injectSseEmitter
User
→
Exp.Vault(ES)
→
LangChain4j
→
AI Model
→
5단계 정제
아키텍처 전환 요약
문제 상황자기소개서 생성

질문만 모델에 전달하면 사용자의 경험이 빠진 비슷한 문장이 반복됐습니다. 응답 생성이 30초를 넘길 때는 서버 타임아웃으로 결과를 받지 못했습니다.

AS-IS단순 AI 프롬프트
  • ▸경험 정보 없이 초안 생성
  • ▸30초 이상 응답 지연
→
TO-BERAG + 단계별 문장 검토
  • ▸경험 벡터 유사도 검색
  • ▸SSE 기반 5단계 생성·검토
backend/src/essay/EssayGenerationService.java
04.

기술 스택 (Skills & Technologies)

핵심 기술 (Core Stack)

▹

Java

Spring 기반 백엔드 로직, 비동기 처리, 데이터 파이프라인 구현

90%
▹

Spring Boot

REST API 설계, 계층형 아키텍처, 인증/인가 및 스케줄링 적용

90%
▹

MySQL

정형 데이터 모델링, 인덱스 최적화, 랭킹/조회 성능 개선

88%
▹

Kafka

실시간 스트림 분산 처리, 비동기 메시징, 병목 완화 구조 설계

75%
▹

Redis

캐시, TTL 관리, JWT 리프레시 토큰 저장 및 응답 속도 개선

75%
▹

MongoDB

채팅 메시지 저장, 동적 스키마 처리, 최신 메시지 조회 최적화

72%

활용 기술 (Extended Stack)

▹

Docker

개발 환경 구성 및 데이터 스토어/메시지 브로커 컨테이너 운영

70%
▹

WebSocket/STOMP

실시간 채팅 및 스트리밍 통신 구현

70%
▹

AWS

EC2/RDS 기반 웹 서비스 배포 경험

70%
▹

GitHub Actions

EC2 대상 CI/CD 자동화 파이프라인 구성

70%
▹

Elasticsearch

한글 검색 성능 개선, Nori 기반 색인/검색 정확도 조정

60%
▹

RabbitMQ

실시간 상호작용 기능을 위한 메시지 브로커로 활용

55%
▹

HTML/CSS

기본적인 마크업 및 스타일링, JSP 뷰 연동

48%
▹

JSP

Java 기반 서버사이드 템플릿 렌더링

40%

도구 & 라이브러리

AI 도구
Claude CodeCodexAntigravity
테스트
JMeterGatlingk6
빌드 & IDE
GradleIntelliJ IDEA
보안 & 데이터
Spring SecuritySpring Data JPAJWT
인프라 & 배포
Docker ComposeVercelAWS EC2AWS RDS
05.

교육 및 경험 (Education & Experience)

개인 프로젝트현재 진행중
2026.01 ~ 현재
CodeGenie코딩테스트 문제를 AI가 분석해 최적 풀이 전략과 코드를 제안하는 에이전트
Glance보유 주식 포트폴리오를 시각화하고 타 투자자와 전략을 공유하는 플랫폼
Resumade직무·공고를 분석해 맞춤형 자기소개서를 자동 작성해주는 AI 에이전트
한국폴리텍대학 — 데이터분석과
2025.03 ~ 2025.121,200H

하나금융그룹 연계 과정으로 AI·데이터 분석 심화 교육 및 실전 프로젝트 수행

HanaZoom지역별 주식 거래 데이터를 분석해 종목을 추천하고 직접 거래까지 지원하는 WTS 플랫폼
삼성 청년 SW 아카데미 (SSAFY) 11기
2024.01 ~ 2024.121,600H

알고리즘 집중 훈련 및 실무형 팀 프로젝트 3회 — Kafka · Redis · MongoDB · Elasticsearch 등 미들웨어를 직접 도입하며 백엔드 전문성 강화

Fastats통계청 26만 건 데이터의 검색 성능을 Elasticsearch로 대폭 개선한 통계 시각화 서비스
Tikkle내 시간을 써서 동료를 도우면 "티끌" 재화를 획득하고 랭킹·커뮤니티를 형성하는 사내 시간 경제 시스템
CodeArena실시간 라이브 코딩테스트를 진행하고 결과를 즉시 채점하는 온라인 코딩 플랫폼
KB IT'S YOUR LIFE 4기
2023.07 ~ 2023.09480H

금융 도메인 상식과 Java · JSP 기반 웹 개발 기초를 쌓으며 첫 팀 프로젝트에 도전

GiftHub소상공인이 자체 기프티콘을 직접 발행·판매하고 소비자가 거래할 수 있는 기프티콘 마켓플레이스
홍익대학교 — 컴퓨터공학과
2017.03 ~ 2024.02

학사 졸업

Contact me

happycodingmin@gmail.com

github.com/hurdong이메일 보내기

© 2026 허동민. All rights reserved.

Designed & Built with Next.js & Three.js