juno.log

Project Portfolio

Portfolio

실전 프로젝트로 검증한 백엔드 개발 역량

2020.06 ~ 현재 · 문제-해법-결과(PSR) 중심

주요 성과 요약

19h→30m
부가세 배치 97% 단축
2억 건
알림톡 이력 무중단 이관
4h→1m
알림톡 발송 오차 단축
5d→수 분
장애 감지(MTTD) 단축

한국신용데이터 (KCD)

2025.01 ~ 재직 중 (1년 3개월) · 백엔드 엔지니어 (장부팀) / 데이터실 AI TF (2025.04~09 겸직)

200만 소상공인이 사용하는 금융 장부 서비스 '캐시노트'의 세금·알림 도메인과 대용량 데이터 파이프라인을 담당합니다. 서비스를 멈추지 않으면서 구조를 바꾸는 일을 반복하며, 세금 알림 정시 도착과 발송 장애 조기 감지 체계를 구축했습니다.

부가세 예상세액 계산 경로 재설계

한국신용데이터 (캐시노트) · 2025.06 ~ 2025.09

Kotlin Spring Batch Databricks Delta Tables
Problem

부가세 신고 시기마다 약 100만 사업장의 예상세액을 계산해 알림을 보내는데, 계산 배치가 19시간 41분이 걸려 알림이 하루 이상 지연되었습니다. 100만 사업장을 개별 조회하는 구조에서 DB I/O 병목이 원인이었습니다.

Solution

코루틴 병렬화만으로는 DB I/O 병목을 해소하기 어려워, 데이터실과 함께 접근 방식을 바꿨습니다. 데이터실은 PySpark 집계 파이프라인과 Delta Tables를, 장부팀 서비스는 계산 규칙과 조회를 각각 담당하도록 책임을 나누고, Databricks 기반 부가세 전용 집계 데이터셋을 새로 만들었습니다. 서비스는 사전 집계 결과만 조회하도록 경로를 전환하고, 매출세액·매입세액·경감공제는 Delta Tables 증분 처리로 분리했습니다.

Result

배치 시간을 19시간 41분 → 30분 내외로 단축해 부가세 알림톡이 마감일 내에 안정적으로 발송되도록 했습니다. 같은 Databricks 파이프라인 구조를 비용 자동분류(902만건 이관), 매출 예측, 연말결산 데이터 적재까지 확장했습니다.

  • 애플리케이션 병렬화 대신 데이터 경로를 바꾼 이유는 코루틴 동시성을 높여도 DB I/O 병목이 해소되지 않아 100만 사업장 마감을 보장하기 어려웠기 때문.
  • 데이터실과 집계 파이프라인 스키마 설계와 증분 처리 범위를 함께 정의하고, 주 단위로 결과를 크로스 체크.
  • 증분 처리는 시간을 크게 줄였지만, 집계 스키마 변경 시 데이터 파이프라인과 서비스 로직을 함께 조정해야 하는 트레이드오프가 있음.

알림톡 발송 경로 무중단 이관 (Dual Write)

한국신용데이터 (캐시노트) · 2025

Kotlin Spring Boot Dual Write PostgreSQL CDC
Problem

67만 사업장에 발송하는 43개 종류의 알림톡 이력이 레거시 시스템에 묶여 있어, 장부팀이 발송 현황 파악이나 장애 대응을 독립적으로 할 수 없었습니다. 서비스를 멈추지 않으면서 자체 DB로 옮겨야 했습니다.

Solution

v1/v2 API 공존 구조에서 Dual Write(양쪽 DB 동시 기록)로 이관을 시작했습니다. 모니터링 봇의 3개월 집계 대시보드로 정합성을 비교하고, 전수조사 불일치 0건을 확인한 뒤 Read Switch를 수행했습니다. 이후 데이터팀과 CDC 파이프라인의 스키마와 전환 일정을 조율하며 레거시 제거까지 정리했습니다.

Result

서비스 다운타임 없이 43개 알림톡 발송 이력을 전량 이관 완료했고, 장부팀이 발송 현황을 독립적으로 관리할 수 있게 되어 CS 대응과 장애 분석 속도가 개선되었습니다.

  • Dual Write 단계에서는 쓰기 실패 시 레거시 DB를 primary로 유지하도록 설계해, 어느 시점에서든 롤백 가능한 상태 보장.
  • 정합성 검증은 모니터링 봇의 일 단위 집계 비교 + Read Switch 직전 전수조사로 불일치 0건 확인.
  • 데이터팀과 CDC 파이프라인 대상 테이블·스키마를 함께 정의하고, 레거시 제거 시점을 데이터팀 파이프라인 전환 완료에 맞춰 조율.

발송 장애 이상 탐지 체계 구축

한국신용데이터 (캐시노트) · 2025

Python FastAPI Slack Bot 통계 모델
Problem

소상공인에게 보내는 44종 알림톡의 발송 장애를 수동으로 확인하다 보니, 장애 발생 후 최대 5일이 지나서야 인지하는 경우가 있었습니다. Dual Write 마이그레이션 중 데이터 불일치를 감지할 수단도 없었습니다.

Solution

팀에 필요한 도구가 없어 Python + FastAPI 기반 모니터링 봇을 단독 설계·구현했습니다. YAML 설정 기반 4종 이상치 탐지기(발송량 급감/실패율 급증/미발송/지연)를 설계하고, 44개 ReportType 발송 현황 대시보드와 Slack 알림을 연동했습니다. 같은 봇에 Dual Write 정합성 대시보드(3개월 집계)와 스크랩 온디맨드 모니터링(2시간 주기 + 야간 요약)도 통합해 운영 시그널을 한 진입점으로 모았습니다.

Result

발송 장애 감지를 5일 → 수 분으로 단축하고, 44개 ReportType의 발송 현황을 상시 확인할 수 있는 운영 체계를 만들었습니다. 실제로 알림 구독 시스템의 Critical 이슈를 이 체계로 감지해 즉시 대응한 사례가 있습니다.

  • 4종 탐지기는 독립적으로 감시하도록 분리하고, YAML 설정으로 ReportType 추가 시 코드 변경 없이 모니터링 확장 가능하게 구성.
  • 저장소를 SQLite → PostgreSQL로 이전하고 KMS Vault로 시크릿을 관리해 로컬 도구에서 운영 서비스 수준으로 끌어올림.

알림톡 과거 발송 내역 2억건 마이그레이션

한국신용데이터 (캐시노트) · 2025

PostgreSQL Batch Insert 모니터링 봇
Problem

알림톡 발송 이력이 두 DB에 나뉘어 있어, '이 사장님에게 언제 무슨 알림을 보냈는지' 한 번에 조회할 수 없었습니다. CS 문의 대응 시 두 시스템을 각각 확인해야 했고, 발송 분석에도 지장이 있었습니다.

Solution

통합 스키마를 설계하고, 서비스 부하를 최소화하기 위해 배치 단위를 조정하며 단계적으로 데이터를 옮겼습니다. 모니터링 봇으로 이관 중 정합성을 자동 대사(reconciliation)하여 불일치 발생 시 Slack 알림으로 즉시 인지하도록 구성했습니다.

Result

이원화된 알림톡 발송 내역 2억건을 다운타임 없이 단일 스키마로 이관 완료했고, 사장님별 발송 이력을 한 곳에서 조회할 수 있게 되어 CS 대응 효율이 개선되었습니다.

  • 기존 두 테이블의 컬럼 차이를 정리하고 조회 패턴에 맞는 인덱스를 함께 설계.
  • 이관 중 문제 발생 시 마지막 성공 지점부터 재개할 수 있도록 checkpoint 기반으로 설계해, 전체 롤백 없이 부분 재시도 가능.

AI 비서(캐시니) 서비스 백엔드

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

Kotlin Spring WebFlux SSE Spring AI Langfuse
Problem

소상공인 대상 AI 비서 서비스에서, AI 응답이 완료될 때까지 사용자가 빈 화면에서 수 초를 기다려야 해 이탈률이 높았습니다. 백엔드 담당이 한 명뿐인 상황에서 채팅 API·응답 스트리밍·정책 엔진·멤버십 연동을 동시에 설계해야 했습니다.

Solution

서버→클라이언트 단방향 스트리밍이므로 WebSocket 대신 SSE를 선택했습니다. Spring WebFlux의 Flux<ServerSentEvent>로 `/ask_stream` API를 구현하고, 한도 정책은 Policy/Rule/Context 패턴으로 분리해 일일·월간·이벤트 규칙을 독립적으로 바꿀 수 있게 했습니다. Spring AI ChatClient로 LLM 호출을 추상화하고, Langfuse 트레이싱과 AWS Bedrock Guardrails로 생성 품질과 운영 가시성을 함께 확보했습니다.

Result

백엔드 전체를 단독으로 설계·구현하여 채팅 API, SSE 스트리밍, 정책 엔진, 멤버십 연동을 완성했습니다. TF 공동 성과로 WAU 6,870, 이탈률 28.48%→26.23%(-2.25%p), 피드백 점수 6.35→6.58 달성.

  • SSE 선택 이유: 서버→클라이언트 단방향이라 WebSocket 양방향 오버헤드가 불필요하고, HTTP/2 위에서 자연스럽게 동작하며 기존 인프라(로드밸런서/프록시) 호환성이 높음.
  • 3개 마이크로서비스에 걸쳐 chunk 전송과 도구 호출 상태값을 같은 스트림 포맷으로 맞추고, `is_final=True` 시점에만 메시지를 저장해 스트리밍 중간 상태와 영속 데이터를 분리.
  • 친구모드는 Redis 캐싱으로 캐릭터 정보 반복 조회를 방지, Langfuse로 스트림 시작 시점 기준 지연 측정 보완.

개인 & 오픈소스 프로젝트

Koin · 한국기술교육대학교 커뮤니티 서비스

2020.06 ~ 2024.12 (4년 7개월) BCSDLab · Backend Lead · 교내 75% 학생 및 교직원 사용

학생 75%가 매일 쓰는 시간표·식단 서비스의 백엔드 5명을 리드하며 레거시 전환·관측성 정비·비용 절감을 추진했습니다.

주요 성과

  • Spring 3 → Spring Boot 100% 전환 (Event Storming으로 캠퍼스·비즈니스·유저 3개 도메인 분리)
  • Datadog APM·로그 수집 체계 구축으로 장애 인지 시간 수 시간 → 수 분
  • AWS Right-sizing + 예약 인스턴스 전환으로 월 서버비 30만원 → 10만원 (66% 절감)
  • Spring Event + TransactionalEventListener 기반 비동기 처리로 트랜잭션 분리
  • Slack Bot(TypeScript), 팀 관리 백오피스(React) 개발

기술 스택

Spring Boot Java MySQL Redis AWS Datadog TypeScript React

Pium · 반려식물 관리 서비스

2023.06 ~ 2023.11 (6개월) 우아한테크코스 · Backend (7인 팀: FE 3, BE 4)

사용자가 체감하는 조회 속도와 배포 안정성을 개선한 반려식물 관리 서비스입니다.

주요 성과

  • Fetch Join으로 식물-히스토리 관계 N+1 쿼리 제거, 조회 7회 → 1회
  • JMeter Pool Size 1~10 부하 테스트 + HikariCP 튜닝으로 TPS 11% 개선
  • Nginx 포트 스위칭(8080/8081) + Spring Actuator Health Check 기반 Blue/Green 배포로 다운타임 30초 → 0초
  • JUnit5 Extension, Jenkins CI/CD, RestDocs 도입

기술 스택

Spring Boot Java JPA MySQL Jenkins RestDocs JUnit5

핵심 역량 3가지

서비스를 멈추지 않는 마이그레이션

Dual Write로 2억건 무중단 이관, Feature Flagging으로 점진 전환. 롤백 가능한 상태를 유지하며 서비스를 멈추지 않고 구조를 바꿉니다.

대용량 성능·배치 최적화

부가세 배치 19시간 41분 → 30분, 알림톡 발송 오차 4시간 → 1분. 애플리케이션 병렬화가 한계일 때 데이터 경로 자체를 재설계합니다.

운영 관측성과 AI 활용

Datadog/Langfuse 기반 장애 감지 체계 구축으로 MTTD 5일 → 수 분. AI 비서 캐시니, code-review-bot, bt-fix-bot까지 팀에 필요한 도구는 직접 만듭니다.