J juno.log

Resume

최준호

Backend / Server Engineer

대용량 데이터의 성능과 정합성 문제를 무중단으로 풀어 온 백엔드 엔지니어

19h 41m→30m

부가세 배치 97.5% 단축

32억 건

대규모 매출 데이터 처리

2억 건

발송 이력 무중단 이관

p95 80~84%

판매관리 API 단축

Resume

이력서

대용량 데이터 처리와 무중단 전환 경험을 중심으로 정리한 백엔드 이력서

200만 소상공인이 사용하는 금융 장부 서비스에서 대용량 배치, 데이터 이관, API 성능 개선을 맡아 왔습니다. 단일 writer DB나 신규 인덱스 제한처럼 운영 조건이 까다로운 상황에서도 병목을 측정하고 서비스 영향을 통제하며 데이터 경로와 구조를 개선했습니다.

백엔드 개발에만 머무르지 않고 Databricks 파이프라인부터 운영 화면까지 직접 구현합니다. AI 비서 백엔드와 사내 코드리뷰봇·검수봇도 설계부터 운영까지 맡아 제품과 팀의 개발 효율을 함께 높였습니다.

Experience

한국신용데이터

백엔드 엔지니어 (장부팀)

2025.01 ~ 현재 (1년 6개월)

200만 소상공인이 사용하는 금융 장부 서비스에서 대용량 배치, 데이터 이관, 핵심 API와 운영 화면을 개발했습니다. 맡은 기능은 설계부터 배포와 운영까지 책임졌습니다.

  • 부가세 배치 19시간 41분 → 약 30분 단축 (100만+ 사업장, Databricks 집계 기반 재설계).
  • 발송 이력 2억 건을 Dual Write로 기존 쓰기 경로를 유지하며 이관 (서비스 중단 없음).
  • 판매관리 핵심 API p95 80~84% 단축 (6.39억 행 DB, 쿼리 재작성·무중단 인덱스).
  • 연말결산 파이프라인 10일 이내 출시 (200만 사업장, 카드매출 32억 건, Spark 최적화).

한국신용데이터

데이터실 AI TF (겸직)

2025.04 ~ 2025.09 (6개월)

소상공인용 AI 비서 백엔드를 단독으로 설계하고 구현했습니다. 채팅과 실시간 스트리밍뿐 아니라 정책 엔진과 유료 멤버십까지 맡았습니다.

  • AI 비서의 채팅, 정책 엔진, 유료 멤버십 백엔드를 단독으로 설계하고 구현.
  • 3개 마이크로서비스의 AI 응답 스트리밍 형식을 통일 (청크·도구 상태·완료 신호).

Skills

Languages
Java · Kotlin · TypeScript
Frameworks
Spring Boot · Spring Batch · JPA
Databases
PostgreSQL · Redis
Messaging
Kafka · SQS
Infrastructure
AWS · Docker · Datadog

AI Experience

사내 AI 생산성 도구를 직접 설계·구축해 운영하고 있습니다. AI 앰버서더 2기로 활동하며 실무에서 검증한 활용법을 사내에 공유합니다.

  • Claude Agent SDK 기반 코드리뷰 봇을 직접 구축해 운영했습니다. 830건을 기준으로 리뷰 실행 p50 2.6분, 성공률 93.9%를 기록했습니다.
  • 멀티모달 이미지와 텍스트를 확인하는 알림톡 검수 봇 MVP를 1시간 40분 만에 만들어 수작업 검수를 없앴습니다.
  • AI 앰버서더 2기로 테크톡 3회와 Office Hour 11회+를 운영하며 실무 활용 사례를 공유했습니다.

Growth

기술 공유
사내 테크톡 3회 · AI Office Hour 11회+ 운영
오픈소스
REST-assured Kotlin Extension · Spring Boot 3.3 호환성 개선

Community

  • Nexters 25기 백엔드 개발자, 26기 회장
  • 우아한테크코스 5기 백엔드 수료 (2023.02 ~ 2023.11)

Education

  • 한국기술교육대학교 컴퓨터공학부 (2019.03 ~ 2026.03, 졸업)

Portfolio

프로젝트 상세

문제–해법–결과를 중심으로 정리한 7개 프로젝트

부가세 예상세액 배치 성능 재설계

한국신용데이터 · 2025.06 ~ 2025.08

Kotlin Spring Batch Databricks Delta Tables PySpark

100만+ 사업장 · 19시간 41분 → 약 30분 (97.5% 단축)

Problem
약 100만 사업장의 예상세액 계산에 19시간 41분이 걸렸습니다. 원본 카드매출을 직접 조회하는 구조라 단일 writer DB에 배치, API, 통계 쿼리가 몰렸습니다. 커넥션 풀 분리와 배치 튜닝만으로는 마감 시간을 맞출 수 없었습니다.
Solution
계산 작업을 OLTP 밖으로 옮기고 데이터실과 함께 부가세 전용 Delta Tables 증분 집계를 만들었습니다. 카드매출은 사전 집계값을 조회하도록 바꾸고, 매입세액 약 7천만 건은 월별로 나눠 처리해 GC 실패를 없앴습니다.
Result
전체 계산 시간을 약 30분으로 줄여 마감 전에 부가세 알림을 안정적으로 발송했습니다.
병목을 애플리케이션 밖으로 옮긴 구조 전환

Before · OLTP 집중

  1. 원본 카드매출
  2. 단일 Writer DB
  3. 전 사업장 재계산

After · 계산 경로 분리

  1. Delta 증분 집계
  2. 월별 분할 처리
  3. 사전 집계값 조회

19시간 41분 → 약 30분 · 97.5% 단축

  • 동시성을 높여도 단일 writer DB의 I/O 병목이 해소되지 않아 애플리케이션 병렬화 대신 데이터 경로를 바꿨습니다.
  • 매출세액, 매입세액, 경감공제를 각각 증분 처리해 전체 재계산 비용을 줄였습니다.

발송 이력 2억 건 무중단 이관

한국신용데이터 · 2025.11 ~ 2025.12

Kotlin PostgreSQL JDBC Dual Write Databricks

2억 건 · Dual Write · 기존 쓰기 경로 유지

Problem
두 DB에 흩어진 알림 발송 내역을 통합해야 했습니다. 초기 upsert 방식은 대량 적재 성능이 낮았고, JPA 기반 이관은 OOM을 일으켰습니다.
Solution
범위별로 DELETE한 뒤 batch INSERT하도록 바꾸고, 배치 크기를 30,000건, 조회 범위를 1주로 제한했습니다. 별도 v2 테이블과 Dual Write로 신규 데이터의 정합성을 유지했습니다. 이관 과정에서 연도 필터와 enum 매핑 버그도 발견해 수정했습니다.
Result
운영 중인 테이블에 영향을 주지 않고 2억 건을 이관했습니다. 사장님별 발송 이력은 한 곳에서 조회하도록 통합했습니다.
실시간 트래픽과 과거 데이터의 병렬 이관
Lane / Phase 01Dual Write02Backfill03Reconcile04Read Switch 실시간 트래픽 v1·v2 동시 기록신규 쓰기 계속동시 기록 유지v2 조회 전환 과거 2억 건 범위 확정30,000건씩 적재자동 정합성 대사이관 종료

01Dual Write

실시간 트래픽
v1·v2 동시 기록
과거 2억 건
범위 확정

02Backfill

실시간 트래픽
신규 쓰기 계속
과거 2억 건
30,000건씩 적재

03Reconcile

실시간 트래픽
동시 기록 유지
과거 2억 건
자동 정합성 대사

04Read Switch

실시간 트래픽
v2 조회 전환
과거 2억 건
이관 종료

서비스 중단 0 · 단계별 롤백 가능

  • 반복 실행해도 결과가 달라지지 않도록 적재 구조를 설계해 부분 실패 시 복구 비용을 줄였습니다.
  • 이관 중에는 모니터링 봇이 데이터 정합성을 자동으로 대사하도록 했습니다.

대규모 알림 발송 표준화

한국신용데이터 · 2025.09 ~ 2025.12

Kotlin Spring Boot Coroutines Gradle Plugin Spring Batch

39종 표준화 · 17개 발신 프로필 통합 · 발송 오차 4시간 → 1분

Problem
프로젝트마다 알림톡 발송 기능을 중복으로 구현하고 있었습니다. 발송 로직은 레거시 정규식과 17개 발신 프로필에 강하게 결합돼 있었습니다.
Solution
SMS, LMS, 알림톡을 하나의 라이브러리로 묶고 배포용 Gradle 플러그인을 만들었습니다. 발송 대상과 메시지를 만드는 작업을 실제 발송 Job과 분리하고, Databricks → Kotlin 코루틴 → 카카오로 이어지는 3단계 구조를 구성했습니다.
Result
알림 39종을 표준화하고 발송 시간 오차를 4시간에서 1분으로 줄였습니다. 약 67.8만 사업장에 부가세 알림을 안정적으로 발송했습니다.
공통 발송 모듈에서 채널별로 분기
Prepare Databricks + Spring Batch 대상·메시지 생성 / 스케줄 분리
Send Core 공통 발송 모듈 코루틴 병렬 발송 · 재시도 · 39종 표준화
알림톡 주 발송 채널
앱푸시 알림톡 실패 시 자동 전환
SMS / LMS 공통 인터페이스

발송 실패를 감지하면 앱푸시로 자동 전환

  • 카카오톡 발송이 실패하면 앱푸시로 자동 전환해 누락을 줄였습니다.
  • 버전 관리와 사내 아티팩트 배포를 Gradle 플러그인으로 자동화했습니다.

대규모 매출 분석 파이프라인

한국신용데이터 · 2025.12.01 ~ 2025.12.10

PySpark Databricks Kotlin Spring Boot Broadcast Join

카드매출 약 32억 건 · 200만 사업장 · 10일 이내 출시

Problem
여러 매출 데이터를 통합해 200만 사업장의 지역별 순위와 7종 지표, 멤버십별 API를 10일 이내에 출시해야 했습니다.
Solution
Spark Window 연산과 collect 사용을 줄이고 작은 기준 데이터는 Broadcast Join으로 처리했습니다. 매출 데이터마다 달랐던 날짜와 금액 기준을 통일하고, 통계 테이블을 조회하는 Kotlin API와 멤버십별 혜택 분기를 구현했습니다.
Result
약 32억 건을 처리하는 파이프라인과 7종 지표, 멤버십별 혜택·예측 API를 10일 이내에 출시했습니다.
32억 건을 사용자 지표로 압축하는 데이터 퍼널
01
약 32억 건카드·세금계산서·현금영수증 원천 데이터
02
200만 사업장날짜·금액 기준 통일 · Broadcast Join으로 사업장 단위 집계
03
7종 지표 + API순위·혜택·예측 결과 제공
  • 데이터 파이프라인부터 계산 결과를 제공하는 API까지 함께 구현했습니다.

판매관리 API 성능 개선

한국신용데이터 · 2026.05 ~ 2026.06

Kotlin Spring Boot MySQL EXPLAIN ANALYZE Online DDL

6.39억 행 · 핵심 API p95 80~84% 단축

Problem
약 6.39억 행(1.3TB)의 원본 POS 테이블을 조회해 인기 메뉴 응답에 최대 30초가 걸렸고, 90일 조회는 타임아웃됐습니다. 다른 조직이 관리하는 테이블이라 신규 인덱스 추가도 원칙적으로 불가능했습니다.
Solution
실행 계획을 확인해 불필요한 조인을 제거하고, 임시 테이블로 중복을 제거하던 쿼리를 EXISTS로 바꿨습니다. 조회하는 파티션을 84개에서 약 7개로 줄였고, 꼭 필요한 인덱스 1건만 Online DDL로 추가했습니다.
Result
인기 메뉴 p95 944.7ms → 185.7ms, 메뉴 이상 감지 174.9ms → 37.4ms, 판매 알림 246.1ms → 40.2ms로 단축하고 90일 타임아웃을 해소했습니다.
프로덕션 일별 p95 응답 시간 비교
인기 메뉴80% 단축
944.7ms
185.7ms
메뉴 이상 감지79% 단축
174.9ms
37.4ms
판매 알림84% 단축
246.1ms
40.2ms
  • 함수 조인 키 때문에 발생한 성능 회귀는 당일 롤백한 뒤 다시 구현했습니다. 재발을 막기 위해 인덱스를 활용하기 쉬운 쿼리 작성 지침도 정리했습니다.

AI 비서 실시간 스트리밍 백엔드

한국신용데이터 · 데이터실 AI TF · 2025.04 ~ 2025.09

Kotlin Spring MVC SSE Coroutines Spring AI

백엔드 1인 · 3개 마이크로서비스 · 실시간 응답 스트리밍

Problem
AI 답변이 완성될 때까지 사용자는 빈 화면에서 기다려야 했습니다. 백엔드 개발자 한 명이 채팅, 스트리밍, 정책, 멤버십을 모두 설계해야 했습니다.
Solution
단방향 응답에 맞춰 SSE를 선택하고 3개 서비스의 청크, 도구 상태, 완료 신호 형식을 통일했습니다. 사용 한도 정책은 일별, 월별, 이벤트 규칙으로 나누고 Spring AI로 호출 방식을 추상화했습니다.
Result
채팅 API, 실시간 스트리밍, 정책 엔진, 유료 멤버십까지 4개 영역을 단독으로 설계하고 구현했습니다.
응답 생성과 저장 시점을 분리한 SSE 시퀀스
ClientChat APIAI ServiceStorage
질문 + SSE 연결
정책·멤버십 검증 후 요청
chunk / tool_state 반복
완료 신호를 받은 뒤 메시지 저장
  1. Client Chat API 질문 + SSE 연결
  2. Chat API AI Service 정책·멤버십 검증 후 요청
  3. AI Service Client chunk / tool_state 반복
  4. Chat API Storage 완료 신호를 받은 뒤 메시지 저장
  • 응답이 완료된 뒤에만 메시지를 저장해 스트리밍 중간 상태가 영속 데이터에 섞이지 않도록 했습니다.

AI 코드리뷰봇 자체 구축·운영

한국신용데이터 · 2025.12 ~ 현재

Claude Agent SDK Python FastAPI LSP

운영 830건 · p50 2.6분 · 성공률 93.9%

Problem
코드 리뷰 등록까지 수십 분이 걸렸습니다. AI SDK 4개에 의존했고 대규모 변경을 분석할 때 타임아웃이 발생해 운영 구조도 복잡했습니다.
Solution
저장소 캐시와 언어별 프롬프트를 적용하고, 리뷰 결과를 핵심과 상세로 나눠 출력하도록 바꿨습니다. AI 연동은 Claude Agent SDK 하나로 통합했습니다. Critical 이슈가 발견되면 변경 요청을 남기는 품질 게이트도 추가했습니다.
Result
리뷰 대기 시간을 2~3분으로 줄였습니다. 운영 데이터 830건에서 p50 2.6분, 성공률 93.9%를 기록했고 여러 저장소에 적용했습니다.
코드 리뷰 실행 구조 개선

Before

  • AI SDK 4개 결합
  • 저장소 매번 재탐색
  • 대용량 변경 타임아웃

After

  • Claude Agent SDK 단일화
  • 저장소·컨벤션 캐시
  • 품질 게이트 자동화
  • AI 호출 경로와 비용·감사 로그를 단일 SDK에서 관리하도록 정리했습니다.