"익숙함에 머무르기보다, 더 나은 방향을 만드는 개발자"가 되고자 합니다.
현재에 안주하는 순간 성장은 멈춘다고 믿기에, 늘 새로운 도전과 변화를 즐기는 개발자입니다. 문제가 보이면 먼저 움직이고, 더 나은 답을 찾기 위해 동료들과 치열하게 토론하는 과정을 좋아합니다.
빠르게 변하는 기술 흐름 속에서도 책과 강의로 꾸준히 배우며, ADR과 실제 구축 사례를 근거로 새로운 기술을 팀에 자연스럽게 스며들게 해왔습니다.
| 2023.07 | 팀장 승진 / 인터널서비스팀 승격 |
| 2022.03 | 파트장 승진 |
| 2020.10 | 대리 승진 |
담당: 배송 관리, WMS 창고 시스템, 발주서비스, 판매자서비스, 정산 서비스, 광고 플랫폼, 인프라 관리
팀이 담당하는 배송, 물류, 발주, 판매자, 정산, 광고, 인프라 도메인을 상시 운영하고 관리하는 업무
외부 광고 플랫폼(CitrusAD) 의존도를 제거하고 자체 광고 시스템 구축
팀프레시(TWMS) WMS 코드를 구매해 펫프렌즈 인프라로 이관하여 은봉리(여주) 창고에서 직접 운영하는 메인 창고 시스템. 레거시 현대화와 CJ 택배 직접 연동 교체를 병행 (직접 만든 mini-WMS는 물류 창고 연동용 자체 WMS로 역할 분리)
ISMS 인증 요구사항 충족을 위해 Public 서브넷에 배포된 MSK 클러스터를 Private 서브넷으로 무중단 이관
Self-managed Kafka(MSK) → Confluent Cloud 전환 검토를 위한 PoC 진행
기존 물류 시스템에서 JD 물류 대행사로 전환하는 대규모 프로젝트
판매자(거래처)를 위한 실시간 대시보드 설계 및 개발
개발 환경 전용 Kafka 클러스터 및 스트림 처리 인프라 구축
EC2 기반 배치 처리를 AWS Batch로 전환하여 비용 최적화 및 리소스 동적 활용 구현
셀러가 위탁 판매하는 품목을 펫프렌즈 창고에서 풀필먼트 대행하여 추가 수익을 창출한 프로젝트
펫프렌즈 Node 레거시 배치 → Python or Java 배치로 이관 (관리되지 않는 레거시 배치 정리)
메인 CJ 물류 창고를 팀프레시 창고로 이관하여 두 개의 물류 창고 사용
펫프렌즈의 데이터를 외부로 판매하기 위해 특정 개인정보를 제외한 신규 DB에 데이터 이관 및 실시간 동기화 제공
발주어드민: 각 거래처에 입고 요청을 하여 입고 확정, 정산까지 진행하는 발주 원스톱 솔루션
판매자어드민: 펫프렌즈에서 거래처 물건을 대신 판매하는 서비스를 위한 시스템 솔루션
펫프렌즈 자체 WMS 시스템 구축 / 3PL 연동 및 MSA 아키텍처 전환 / 창고별 자재 및 입/출고 관리
레거시 서버 인프라 VPC 이관 작업
기존에는 물류팀과 MD팀이 카카오톡, 메일 등으로 시스템 없이 수기로 발주를 진행하고 있었습니다. 이를 개선해 파트너 상품을 제외한 자체 관리 상품의 발주 등록부터 정산까지 시스템에서 자동으로 처리하도록 구축한 프로젝트입니다.
기존에는 mobile, admin, rider, partner, worker 5개 서비스가 하나의 파이프라인으로 묶여 있어, 코드 한 줄만 수정해도 5개 서비스를 모두 배포해야 했고 상용 배포에 20분 이상이 소요됐습니다. 각 서비스를 별도 repository로 분리해 변경된 서비스만 배포하는 방식으로 전환했습니다.
자체 라이더 → 심쿵배송(당일 배송) 전체적인 프로세스 변경 / CJ I/F 물류 연동
삼성전자 B2B 프로젝트 전문 SI 기업에서 MES/ERP 시스템 개발
공통, 화학물질, 안전방재, 국내보건, 해외보건 4개 모듈 클라우드 서비스
새로운 Login Process 개발
공통, BQMS, FLMS (ERP 시스템) 패키지화
삼성 바이오로직스 ERP 시스템 개발
IT투자 / 운영비용 관리체계 개선
운영 환경에서 마주친 장애와 병목을 어떻게 분석하고 해결했는지, 그 과정에서 만든 아키텍처를 장애 대응, 성능 최적화, 아키텍처로 나누어 정리했습니다.
노출 트래픽이 2배로 튀자 노출 API에 OOM이 발생해 광고 엔진 태스크가 50~62분 주기로 반복 재시작됐습니다. 노출 이벤트는 지연되고 일부 누락됐지만, 광고 선정은 OpenSearch와 Redis만으로 돌도록 DB 의존을 끊어 둔 덕분에 선정과 응답은 정상이었습니다.
장애 RCA를 주도해 OOM의 원인을 규명했습니다. 직접 원인은 노출 수집 경로의 R2DBC 커넥션 풀이었습니다.
flowchart TD
A["노출 중복검증"] --> B{"Redis(SETNX)
존재?"}
B -->|미존재| C["R2DBC로 DB 조회"]
C --> D["다수 광고 ID
무제한 병렬 조회"]
D --> E["동시성 제한 세마포어 비활성
+ 풀 획득 타임아웃 없음"]
E --> F["커넥션 무한 대기
→ 힙 누적 → OOM"]
F --> G["엔진 태스크
50~62분 주기 재시작"]
S["광고 선정"] --> T["OpenSearch + Redis
(DB 비의존)"]
T --> U["선정/응답 정상"]
style F fill:#fee2e2,stroke:#ef4444
style G fill:#fee2e2,stroke:#ef4444
style U fill:#dcfce7,stroke:#22c55e
복구와 재발 방지, 그리고 역할 구분.
수백만 건 데이터 인입 배치가 디스크 입출력에서 병목이 걸려 처리 시간 편차가 컸습니다. 스토리지 등급을 한 단계 상향하고, 적용 전후를 일별 로그로 직접 비교 측정했습니다.
| 지표 | 변경 전 | 변경 후 |
|---|---|---|
| 평균 소요시간 | 17.6분 | 2분 (-88.7%) |
| 건당 처리시간 | 24.9ms | 2.6ms (-89.7%) |
| 최대 소요시간 | 1,306초 | 152초 (-88.4%) |
지갑 차감 내역 조회가 단일 인덱스로 느렸고, 정렬에서 파일 정렬(filesort)이 발생했습니다. 조회 조건과 정렬 컬럼을 모두 포함한 복합 인덱스로 교체해 정렬까지 인덱스로 처리하도록 했습니다.
실행 계획(EXPLAIN)으로 병목을 먼저 확인한 뒤, 조건과 정렬 컬럼 순서를 맞춰 복합 인덱스를 설계했습니다. 인덱스 추가는 운영 트래픽에 영향이 가지 않도록 락 없이 온라인으로 적용했고, 스테이징에서 실행 계획을 다시 확인해 파일 정렬이 사라진 것을 검증한 뒤 상용에 반영했습니다.
보안 요건을 맞추려고 메시지 브로커(Kafka)를 외부 노출 구간에서 내부 구간으로 옮겨야 했습니다. 30개 이상의 서비스가 물려 있어 중단이 곧 매출 손실이었고, 같이 걸린 Kafka 메이저 업그레이드(본인 확인 기준 3.8)도 순단 없이 끝내야 했습니다.
flowchart LR
P["프로듀서
30+ 서비스"] --> OLD["기존 브로커
(외부 구간)"]
OLD ==>|실시간 복제| NEW["신규 브로커
(내부 구간)"]
C["컨슈머
30+ 서비스"] -.1단계 전환.-> NEW
P -.2단계 전환.-> NEW
OLD -.3단계 복제 종료.-> NEW
style NEW fill:#dbeafe,stroke:#2563eb
style OLD fill:#f1f5f9,stroke:#94a3b8
사전 검증에서 일반 토픽은 복제로 무중단 전환이 되지만, 변경 데이터 캡처(CDC) 커넥터는 재시작 시 오프셋을 이어받지 못해 데이터 누락이 구조적으로 발생한다는 점을 확인했습니다. 그래서 CDC만 분리해 위험을 격리했습니다.
flowchart TD
A["전체 이관"] --> B{"대상 종류?"}
B -->|일반 토픽| C["실시간 복제로
무중단 전환"]
B -->|CDC 커넥터| D["트래픽 적은 새벽에
중단 후 재생성"]
D --> E["전체 스냅샷 회피
(변경분만 캡처)"]
E --> F["누락분은
수동 반영 스크립트로 보정"]
style C fill:#dcfce7,stroke:#22c55e
style D fill:#fef3c7,stroke:#f59e0b
Jenkins 단일 서버에서 배치를 돌렸는데, 서비스가 커지며 하루 약 6,400건(Peak Time 병렬 약 40건)까지 늘었고 언어도 Node에서 Python, Java로 확장됐습니다. 특정 시간대에 CPU와 메모리가 100%까지 치솟아 리소스 알림이 빈번했고, 리팩터링이나 서버 증설로는 한 서버에서 수십에서 수백 개 Job을 동시 실행하는 한계를 넘지 못했습니다.
그래서 배치 실행을 AWS Batch로 분산했습니다. 공식 Jenkins 플러그인이 6년간 미업데이트 상태라, AWS Batch 제출과 로그 polling, 재시도, 취소, 알람을 직접 구현한 자체 Jenkins 플러그인(Java 11)을 개발했습니다.
flowchart LR
J["Jenkins 스케줄링"] --> P["자체 Jenkins 플러그인
(Java 11)"]
P --> B["AWS Batch
Job 제출"]
B --> F["Fargate Spot
(쓴 만큼 과금, 병렬)"]
P -.CloudWatch 로그 polling.-> P
P -.실패 3회 재시도 / 양방향 취소.-> P
P -.실패 알람.-> S["Slack"]
style F fill:#dbeafe,stroke:#2563eb
style P fill:#e0e7ff,stroke:#6366f1
소프트웨어학과, 컴퓨터시스템학과 (복수전공)
2013.03 - 2018.02