- Email: biuea3866@gmail.com
- GitHub: github.com/biuea3866
- Portfolio: 포트폴리오
- Blog: dpdpdndn.pages.dev
소개
3,000+ 기업이 사용하는 채용 관리 시스템(ATS)의 핵심 기능을 설계하고 개발한 5년차 백엔드 개발자입니다.
도메인의 목표와 문제를 고민하고, 확장성 있는 구조와 코드로 제품을 만들어나갑니다. 이 과정에서 얻은 인사이트가 있으면, 팀에 공유하고 함께 더 나은 방법을 찾아가는 것을 좋아합니다.
경력 (4년 6개월)
주식회사 두들린
2022.04 - 재직중 · 정규직
개인정보 파기 백오피스
2026.09 · 상세 포트폴리오
개인정보 파기 요청을 결재 기반 백오피스화
- 프리뷰 → 요청 → 결재 → 실행 → 증적 흐름을 표준화하고, 개인정보 파기 업무의 사전 승인 절차 정립
- 각 서비스가 API를 통해 자신의 데이터를 파기하도록 책임을 분리하고, 백오피스는 요청서·확인서·권한과 처리 이력을 관리
권한 체계로 개발자 없이 처리 가능한 운영 흐름 구성
- 요청, 실행 권한과 결재 권한을 구분하고 실행 권한을 가진 요청자가 다른 승인자의 결재 후 본인 요청을 실행하도록 구성
LLM을 활용한 개발 워크플로우
- 문제 정의 → 설계 → 티켓 분해 → 구현 → QA로 이어지는 단계별 LLM 활용 절차 구성
- Slack에서 확인한 36개월간 파기 요청 59건을 유형별로 분류해 자동화 범위와 우선순위 결정
- 공통 설계와 티켓 간 의존 관계를 먼저 정의하고 병렬 구현을 진행해, 설계부터 최종 수정까지 9일 소요
- LLM으로 도출한 테스트 매트릭스를 5회 반복 검증하고, 브라우저 동작·API 응답·데이터 상태·감사 로그를 대조해 문제 14건 수정
알림 자동화
2026.06 - 2026.08 · 상세 포트폴리오
알림 설정 정규화와 무중단 전환
- 팀원과 알림 테이블 통합 및 공통 워크플로우를 공동 설계하고, 전환 데이터의 일치 여부를 검증 쿼리로 직접 확인
- dual write로 병행 적재 후 FE 릴리즈 시점에 feature toggle로 읽기 경로를 전환하는 무중단 배포 방식 적용
이벤트 기반 알림 발송 처리
- 도메인 코드에 종속돼 있던 알림 호출을 Kafka 이벤트 발행으로 분리, 워커 서버가 consumer group으로 구독 후 알림 발송
- 공통 워크플로우와 채널별 발송 전략을 분리해, 신규 트리거는 워크플로우 구현체로, 신규 채널은 발송 전략으로 추가
백엔드 모노레포 전환
2026.05 · 상세 포트폴리오
분산 코드베이스 통합
- 이관 대상과 의존 관계를 조사해 점진 이관 전략을 수립하고 DevOps 팀과 합의, 실제 레포 이관은 DevOps 팀이 수행
- 의존성이 적은 레포부터 이관하고 기존 레포를 읽기 전용으로 전환하는 절차를 설계해, 단계별 롤백 지점과 공용 설정 관리 기반 마련
레거시 워커 서버 포팅
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 · 상세 포트폴리오
분산된 평가 트리거
- 트리거 지점마다 평가 요청 직접 발행 시 누락 위험이 커져 기존 내부 이벤트 구독으로 트리거 처리
- 기존 엔드포인트의 이벤트 발행 코드를 유지하고, 이벤트별 구독 경로에서 평가 요청이 생성되는지 검증
결과 유실 대비
- 콜백 수신과 지연 요청 재조회 배치를 함께 구성하고, 재시도 한도 초과 시 Slack 알림을 통해 수동 대응으로 연결
벌크 요청 처리
- 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)