소개

3,000+ 기업이 사용하는 채용 관리 시스템(ATS)의 핵심 기능을 설계하고 개발한 5년차 백엔드 개발자입니다.

도메인의 목표와 문제를 고민하고, 확장성 있는 구조와 코드로 제품을 만들어나갑니다. 이 과정에서 얻은 인사이트가 있으면, 팀에 공유하고 함께 더 나은 방법을 찾아가는 것을 좋아합니다.

경력 (4년 5개월)

주식회사 두들린

2022.04 - 재직중 · 정규직


알림 자동화

2026.06 - 2026.08 · 상세 포트폴리오

알림 설정 정규화와 무중단 전환
  • 도메인마다 파편화된 알림 테이블을 단일 스키마로 정규화하여 관리 포인트 단일화
  • dual write로 병행 적재 후 FE 릴리즈 시점에 feature toggle로 전환, 데이터 손실 0건에 발송 중단 없이 배포
이벤트 기반 알림 발송 처리
  • 도메인 코드에 종속돼 있던 알림 호출을 Kafka 이벤트 발행으로 분리, 워커 서버가 consumer group으로 구독 후 알림 발송
  • 알림 자동화 워크플로우로 추상화해 신규 채널과 트리거를 워크플로우 수정 없이 추가

백엔드 모노레포 전환

2026.05 · 상세 포트폴리오

분산 코드베이스 통합
  • 개발이 멈추는 빅뱅 이관 대신 의존성 적은 레포부터 순차 이관하고 이관을 마친 레포는 읽기 전용으로 전환, 단계별 롤백 지점 확보
  • LLM이 코드베이스를 한 번에 파악하고, 여러 레포에 걸친 작업을 하나의 Pull Request로 처리하는 모노레포로 전환

레거시 워커 서버 포팅

2026.04 · 상세 포트폴리오

트랜잭션 경계 재설계
  • 트랜잭션 경계 없이 순차 실행되던 워커를 도메인별 서비스로 분리해 서비스마다 트랜잭션 경계 부여, 부분 성공을 허용하고 실패 격리
  • 실패한 스텝만 Admin API로 재처리해 데이터 불일치 제거
테스트 안전망과 무중단 전환
  • 테스트 0건 상태라 기대 동작을 테스트로 먼저 고정한 뒤 포팅, 커버리지 80% 이상(31개 파일)
  • Raw SQL을 JPA와 QueryDSL로 이전해 SQL Injection 지점 52건 → 0건, feature toggle로 무중단 전환
  • 쿼리 실행기 Executor 21개를 도메인 Service 11개로 재구성(48% 감소), claude로 티켓 dag를 구성하여 티켓별 병렬 작업으로 일정 20md 10md로 감소

지원서 데이터 정규화, 시스템 개편

2025.11 - 2026.03 · 상세 포트폴리오

수험번호 채번 동시성 제어
  • 커넥션을 장기 점유하는 비관적 락 대신 Redis 분산락으로 채번 구간만 직렬화
  • 테스트 과정에서 락 만료보다 처리가 길어져 중복이 재현되자 watchdog 갱신과 DB 유니크 제약으로 2중 방어
  • k6 부하 테스트에서 100건/초 100% 유니크 배정, 락 획득과 해제 1~2ms로 DB 락 대비 10배
엑셀 다운로드 신규 시스템 포팅
  • 이중 관리가 남는 단순 포팅 대신 기존 도메인 모듈을 재사용하는 멀티 모듈로 포팅
  • SXSSFWorkbook 스트리밍으로 메모리 상한 고정, 배포 후 1개월 평균 36% 힙 사용

AI 서류 평가

2025.09 - 2025.10 · 상세 포트폴리오

분산된 평가 트리거
  • 트리거 지점마다 평가 요청 직접 발행 시 누락 위험이 커져 기존 내부 이벤트 구독으로 트리거 처리
  • 엔드포인트에서 로직 수정 없이 모든 트리거 지점 검증, 요청 누락 0건
결과 유실 대비
  • 콜백만으로는 유실을 감지할 수 없어 콜백 엔드포인트와 재처리 배치를 2중으로 구성, 결과 완료율 100%
벌크 요청 처리
  • api 동기 호출 시 건당 2분 이상 blocking되는 결과 응답을 kafka와 콜백으로 해소, 소비 속도를 무시하는 API push 대신 kafka pull로 부하 분산
  • No Offset 슬라이스와 JdbcTemplate 배치 INSERT로 200건 기준 kafka 발행까지 80ms
배포 후 처리량 개선
  • 배포 후 나타난 지연의 원인을 구간별로 탐색하고, 평가 처리 서비스의 LLM 동기 호출로 진단, AI/DATA 팀이 비동기 컨슈머와 비동기 API 호출로 전환해 평가 처리량 시간당 360건 2,400건

지원자별 평가

2025.02 - 2025.08 · 상세 포트폴리오

무중단 데이터 구조 전환
  • 3,000+ 기업 실시간 사용으로 중단이 불가해 dual write → 배치 백필 → 정규 배포로 약 340만 개의 데이터를 2천만 건으로 마이그레이션
  • 매일 검증 쿼리로 양쪽 일치 확인, 서비스 중단 0분에 데이터 손실 0건
도메인 엔티티 중심 코드 재설계
  • Application Service, Domain Service, Entity에 비즈니스 로직이 흩어져 수정할 코드를 찾기 어렵고 유지보수가 어려운 문제
  • Aggregate 경계 기준으로 로직을 도메인 엔티티에 응집하고 상태 변경을 명시적 메서드로만 허용
  • 커버리지 0% → 70%, QA 대응 4시간~1일 → 평균 1시간
배포 후 인재풀 조회 지연 대응
  • EXPLAIN으로 병목을 특정해 불필요한 JOIN과 조건문 제거
  • 불필요 JOIN 제거로 13초 → 2.8초(78%), 커버링 인덱스로 PK만 조회 후 IN 조건 재조회하는 2단계 쿼리로 1초(92%), JOIN cost 52,110 → 18,030

데이터베이스 부하 개선

2025.01 · 상세 포트폴리오

단건 쿼리 반복 호출 제거
  • 부하 감소 목적에 반하는 DB 그룹핑, 반복 단건 조회 대신 IN절 벌크 조회 1회로 전환, 벌크 데이터를 Map으로 변환 후 애플리케이션에서 조합
  • 단건 반복호출로 인해 발생되던 201개 쿼리를 3개로 감소 (98% 감소)
polling API COUNT 쿼리 제거
  • 진행률 파악을 위해 호출되던 COUNT 쿼리를 제거하고, 전체를 조회하여 애플리케이션에서 진행률을 계산하도록 변경
  • 두 부하 개선으로 Reader DB CPU 50 ~ 60% 30 ~ 40%로 감소

공고 모집분야

2024.07 - 2024.12 · 상세 포트폴리오

공채 지원자 조회 성능 개선
  • 공채 지원자 예상치인 10,000의 지원자로 부하테스트를 진행하였으나 심각한 DB 부하 문제 발생
  • scale up 하더라도 데이터 증가 시 문제 재발 가능, 캐싱은 실시간 변경으로 무효화가 잦아 둘 다 배제하고 필터 존재 시에만 JOIN하는 동적 쿼리로 재설계
  • nGrinder 검증 결과 응답 27,885ms → 148ms(99.5%), TPS 1.1 → 1,339(1,217배), DB CPU 100% → 10% 초반, 동시 처리 50 → 200명
데이터 마이그레이션
  • 기존 스크립트 형태의 데이터 마이그레이션이 아닌 Spring Batch를 이용하여 청크 기반 처리와 체크포인트 실패 지점 재시작 확보, JobRepository로 실행 이력 자동 기록
  • 서비스 무중단 상태에서 8만 건 기반으로 56만 건의 데이터 마이그레이션 수행
배포 후 인덱스 장애 대응
  • 엔티티 간 Id 타입을 맞추기 위해 QueryDSL의 .intValue, .longValue 메소드 사용 결과 CAST 함수를 사용하여 인덱스 풀 스캔 문제 발생
  • Kotlin 타입 변경 시 많은 양의 코드 변경 문제가 존재하여 AttributeConverter로 타입 통일
  • CAST 제거로 스캔 타입 ALL → ref 복구, 포스트 모텀 문서로 팀 공유

행동과학 연구소 연동

2024.04 - 2024.06 · 상세 포트폴리오

파일 처리 방식 개선
  • 이전 연동 사례와 동일 처리 시 서버가 파일을 메모리에 로드하여 S3에 업로드하는 방식, OOM 위험이 있고 동시 요청 시 서비스 전체 가용성 문제로 번지는 구조
  • Presigned URL로 외부에서 S3에 직접 업로드하도록 전환
  • 파일이 서버를 경유하지 않아 크기와 무관하게 메모리 일정 유지

잡플래닛 연동

2023.04 - 2023.08 · 상세 포트폴리오

이벤트 드리븐 아웃바운드 전환
  • 플랫폼 추가마다 수정 비용이 누적되는 동기 연동 방식에서 kafka 기반의 이벤트 드리븐 방식으로 전환
  • 플랫폼별 consumer group 분리와 재시도 API로 외부 장애 전파 차단, 신규 플랫폼은 토픽 구독만으로 확장
역방향 상태 정합성
  • 외부에 변경 통지를 요구할 수 없어 주기 배치로 양측 상태 대조, 자사 상태 자동 갱신으로 불일치 해소

ORP 인적성 검사 연동

2023.04 - 2023.05 · 상세 포트폴리오

다건 검사 요청 비동기화
  • 보상이 불가한 메일 발송 특성상 전체 원자성을 배제하고 건별 트랜잭션으로 1건씩 순차 소비
  • 작업 ID 즉시 반환과 진행률 조회로 100명 요청의 2~3분 대기를 즉시 응답으로 전환
검사 결과 사전 적재
  • 조회 시점 실시간 처리를 자정 사전 적재로 전환, 결과 조회 6초 → 1초 이하(83%)감소, 롱 트랜잭션 제거

프로그래머스 연동

2022.09 - 2023.01 · 상세 포트폴리오

외부 스펙의 도메인 격리
  • 핵심 테이블에 외부 식별자를 넣으면 플랫폼마다 오염되어 전용 매핑 테이블로 분리, 이후 플랫폼 추가 시 매핑 테이블만 확장
외부 호출 트랜잭션 분리
  • DB 저장만 트랜잭션 경계에 두고 외부 호출은 커밋 이후에 수행, 트랜잭션 점유 수 초 → 수 ms

학력

가천대학교 · 컴퓨터공학과 학사

2018.03 - 2022.02 졸업

스킬

  • Language/Framework: Kotlin, Spring Boot, Spring Batch, JPA, QueryDSL, Apache POI
  • Infra/Data: MySQL, Redis, Apache Kafka, AWS S3
  • 테스트/관측: nGrinder, k6, Datadog, AWS CloudWatch, Grafana
  • AI: Claude Code, Codex

수상/자격증/기타

  • 정보처리기사 (2021.11)