박정수

Backend Engineer

소개

주도적으로 문제를 해결하는 4년차 백엔드 개발자 박정수입니다.

초기 모빌리티 스타트업에 합류해 32명 규모로 회원 150만, 매출 200억 원 서비스를 만들었습니다. 신규 서비스의 설계부터 런칭, 운영 안정화까지 전 과정에 주도적으로 참여했습니다.

단순 구현보다 문제의 근본 원인을 찾고 구조로 해결하는 것을 선호합니다. 조회 최적화, 배치 전환 등 트래픽이 몰리는 도메인에서 성능 개선과 안정화 경험을 쌓아왔습니다.

실무 경력

씨앤에프시스템

백엔드 개발자

2025.12 - 재직 중

고객사 198곳, 매출 112억 원의 ERP 솔루션

  • ERP 솔루션 백엔드 개발 (회계, 예산 모듈)
  • 11년 이상 운영된 레거시 코드 개선 및 신규 이관
  • 쿼리 플랜 분석을 통한 튜닝, 인덱스 관리 등 RDB 성능 개선 작업

디어코퍼레이션

백엔드 개발자

2020.09 - 2024.01

회원 150만, 매출 200억 원의 모빌리티 서비스

  • 결제 시스템 신규 설계 및 모놀리식 분리
  • 멤버십, 지역 조회, 권역 이탈 반납 감지 등 코어 도메인 신규 설계 및 개발
  • 캐싱, 비동기 이벤트 기반 응답 최적화
  • AWS 운영 및 CI/CD 파이프라인 구축

기술 역량

언어 & 프레임워크

  • Java, Spring Boot, JPA, MyBatis

데이터베이스

  • MySQL, Oracle, Redis

클라우드 & 인프라

  • AWS: EC2(Linux), ALB, ASG, S3, RDS, Lambda, SNS/SQS
  • CI/CD: Jenkins, Docker, GitHub Actions

테스트 & 품질

  • JUnit 5, TestContainer, Locust, K6

주요 프로젝트

결제 서버 마이그레이션

Node.js 모놀리식의 결제 도메인을
Java 결제 서비스로 마이그레이션

[디어코퍼레이션] Java 17, Spring Boot, JUnit 5, TestContainer, Aurora MySQL 8.0, Redis, SQS

flowchart TD U[유저] -->|반납| M2[모놀리식] M2 -->|결제 요청| P[결제 서버] CS[CS 관리자] -->|환불 처리| BO[백오피스] BO -->|환불 요청| P P -. ChainedTx 순차 커밋 .-> DBS[("결제 DB → 레거시 DB")] DBS -. 커밋 실패 .-> SL[Slack 알림 / 복구 Query] P ==결제/환불 이벤트 발행==> N[SNS 토픽] N --> Q[SQS 구독] Q --> S[정산 서버] Q --> S[정산 서버] Q -. 실패 .-> DLQ[DLQ] style P fill:#e3f2fd style Q fill:#fff3a3 style SL fill:#ffebee style DLQ fill:#ffebee

프로젝트 개요

모놀리식과 백오피스에 흩어져 변경마다 중복 수정하던 결제/환불/정산 로직을 Node.js에서 Spring Boot 기반 결제 서비스로 마이그레이션

팀 구성 및 역할

  • 3명 백엔드 팀으로 진행
  • 주로 환불 도메인 전반과 PG 연동, 백오피스 연동 작업을 수행

주요 업무

  • Node.js 모놀리식에 흩어져 있던 결제 도메인 로직을 Java 엔티티와 값 객체로 재설계
  • 모놀리식, 백오피스에 존재하는 결제와 환불 로직을 정리해 REST API로 재설계, 결제 시스템에 이관 및 운영
  • 나이스페이먼츠, 카카오페이먼츠, 토스페이먼츠 PG 연동(결제, 환불) 작업
  • 정산과 로깅을 SQS 기반 비동기로 분리

문제 해결 과정

  • 레거시 정합성 관리
    • 결제 도메인은 분리했지만 레거시가 아직 결제 데이터를 읽어, 결제 시 신규 결제 DB와 레거시 DB에 함께 기록해야 했음
    • 두 DB를 원자적으로 묶는 2PC까지는 규모상 과하다 판단, 순서대로 커밋하는 ChainedTransactionManager 도입
    • 순차 커밋은 실패 시 부분 반영 문제가 발생할 수 있어, 그 경우 Slack 알림과 복구 쿼리로 보정
  • 정산 비동기 분리
    • 결제/환불 커밋 이후, SNS 토픽에 이벤트 발행 → 정산 서버가 구독. SQS로 컨슘
    • 청구서 ID 기반 멱등성 처리로 중복 정산을 방지, 처리 실패 시 DLQ를 통한 관리
  • 마이그레이션 검증 및 테스트 관리
    • 목표 SLO인 99.9% 유지를 위해 배포 전, 카나리를 통한 트래픽 모니터링 검증
    • 결제 서비스 내 단위와 통합 테스트 300개 이상 작성, 커버리지 95% 유지

기여 성과

  • 정산 및 로깅 처리 비동기화로 응답 속도 2.4s → 1.1s
  • 모놀리식, 백오피스 서버에 흩어진 결제/환불/정산 로직을 통합해 유지보수성 개선
  • 레거시와 신규 서비스가 공존하는 상태에서 무중단 분리 이관

킥보드 지역 조회 최적화

RDS 장애 해소, 조회 속도 6s → 0.4s

[디어코퍼레이션] Java 17, Spring Boot, Redis, MySQL 5.7

%%{init: {'flowchart': {'curve': 'natural', 'rankSpacing': 95, 'nodeSpacing': 55}}}%% flowchart TB subgraph APP["애플리케이션"] direction TB GW2["가맹센터
지역 갱신"] LB2{"모놀리식 LB"} end subgraph STORE["공유 저장소"] direction TB RD[("공유 Redis
TTL")] DB2[("공유 DB")] end GW2 -->|DB 저장| DB2 GW2 -->|Write Through| RD LB2 -->|캐시 조회| RD RD -.->|미스 시 DB 조회| DB2 DB2 -->|캐시 채움| RD style APP fill:none,stroke:#cccccc style STORE fill:none,stroke:#cccccc style RD fill:#fff3a3

프로젝트 개요

킥보드 앱의 지도 조회 API가 RDS CPU를 포화시켜 Timeout이 발생하고, 공유 DB를 쓰는 전체 서비스 장애로 확산. 캐싱으로 당장의 부하를 걷어낸 뒤, 최종적으로 조회 범위 자체를 줄여 원인을 제거

팀 구성 및 역할

  • 단독으로 원인 분석, 캐싱 전략 수립, 점진적 마이그레이션

주요 업무

  • 운영 구역 폴리곤, 가맹점, 킥보드 위치를 매 화면 진입마다 응답하던 지도 조회 API의 캐싱 설계와 적용
  • 로컬 캐시 → Redis 글로벌 캐시 → 공간 쿼리로 캐싱 전략 점진적 마이그레이션
  • Write Through, TTL 기반 캐시 일관성 관리와 응답 크기 축소로 장애와 렌더링 지연 해소

문제 원인

  • 지도 화면에 진입할 때마다 운영 구역 폴리곤을 사용자 위치와 무관하게 모두 반환해 매 요청이 Full Scan으로 실행됨
  • 서비스 지역과 가맹점이 늘수록 조회량과 응답 크기가 함께 커졌고, 피크 시간대 RDS CPU가 포화되며 같은 DB를 쓰는 전체 서비스로 장애가 확산됨

문제 해결 과정

  • 1단계: 로컬 캐싱
    • 변경 빈도 낮은 지역 데이터에 WAS 로컬 캐싱 적용으로 6s → 0.4s
    • 하지만 PM 규제 법안이 추가된 이후 지역 데이터 변경이 잦아지며, WAS 증설 시 인스턴스별 캐시 불일치 발생
  • 2단계: Redis 글로벌 캐싱
    • Write Through + TTL 설정으로 지역 데이터 관리
    • WAS 간 일관성 확보로 캐시 불일치 해소
    • 다만 지속적인 가맹점 증가로 응답 크기가 커지며 프론트 렌더링 지연 발생
  • 3단계: 공간 쿼리로 조회 범위 축소
    • MySQL Geometry 함수로 전 지역 대신 사용자 인접 지역만 조회하도록 변경, Full Scan의 원인이던 조회 범위 축소
    • 응답 크기도 함께 줄어 프론트 렌더링 지연 해소

기여 성과

  • 처리 속도 6s → 0.4s (15배 개선)
  • 조회 범위 축소로 Full Scan 원인을 제거, RDS 사용량 36% 절감으로 장애 재발 차단
  • 지도 로딩 과정에서의 유저 이탈율 28% 감소

회계 전표 승인 최적화

레거시 로직을 배치 처리로 전환하며 결산 시즌 운영 효율화

[씨앤에프시스템] Java 8, Spring, MyBatis, Oracle / Maria

flowchart TB U([결산 담당자]) -->|1만+ 건 승인| LOAD subgraph APP["애플리케이션"] direction TB LOAD["대상 전표 조회
검증, 승인번호 채번"] --> CHUNK["1,000건 청크 분할"] CHUNK --> BATCH["고정 SQL
BATCH 누적"] BATCH --> FLUSH["청크마다 flush
메모리 제어"] end subgraph DBLAYER["DB"] direction TB CACHE["실행계획 캐시 히트
하드파싱 제거"] DBS[("Oracle / MariaDB")] CACHE --> DBS end FLUSH ==>|고정 SQL 반복| CACHE BATCH -. 실패 시 .-> SP["전체 롤백
실패 전표 특정"] style APP fill:#f5f9ff,stroke:#3b82f6 style DBLAYER fill:#f1f8f4,stroke:#27ae60 style BATCH fill:#e3f2fd style FLUSH fill:#fff3a3 style CACHE fill:#fff3a3 style SP fill:#ffebee

프로젝트 개요

결산 시즌, 회계 전표 1만 건 이상 일괄 처리 시 최대 90초가 소요되고, 저사양 On-premises 환경의 경우 OOM 문제가 발생하며 이를 개선

팀 구성 및 역할

  • 단독으로 병목 진단, 배치 구조 설계, 성능 최적화

주요 업무

  • 건별로 동작하던 전표 승인/취소 로직을 청크 단위 배치로 재설계

문제 해결 과정

  • 병목 진단
    • 전표마다 전자문서 연계정보를 단건 조회해 조회 쿼리가 건수만큼 반복하는 N+1 구조
    • UPDATE 문을 이어붙이는 MyBatis 동적 쿼리라, SQL 형태가 바뀌어 옵티마이저가 반복적 하드 파싱하는 문제 발생
  • 실행계획이 재사용되도록 SQL 실행 구조 변경
    • 건수마다 변하던 동적 UPDATE를 단일 UPDATE 문장으로 변경해, 매 실행 같은 PreparedStatement를 재사용
    • SQL 텍스트가 고정되어 DB가 소프트 파싱하므로, 건수만큼 반복되던 하드 파싱 문제 개선
  • 반복 조회를 묶음 조회로 전환
    • 전표별 단건 조회를 전표번호 IN절 다중조회로 묶어, 조회를 청크당 1회로 축소
  • MyBatis Executor 충돌 → 트랜잭션 경계 분리
    • 상위 서비스의 조회가 SIMPLE executor로 먼저 실행돼 같은 트랜잭션에서 BATCH 전환이 막히는 문제를, 트랜잭션 전파 옵션 REQUIRES_NEW로 분리해 해결
    • 실패 시 배치 전체를 롤백해 문서 정합성을 지키고, 실패한 전표번호를 특정해 안내

기여 성과

  • 1만 건 이상 승인 처리 90초 → 2초 개선 (약 45배)
  • 매년 발생하는 결산 피크 기간의 운영 안정성 확보
  • 저사양 On-premises 환경(4GB RAM 이하) 기관의 OOM 발생 문제 해소

오픈소스 기여

clawd-on-desk

Claude CLI 모니터링

PowerShell, Node.js, WMI/CIM

GitHub stars

PR #268 (Merged)

  • 윈도우 환경에서 주기적으로 세션 이동 기능이 작동하지 않아, 직접 fork 후 문제 원인 파악
  • Windows 11 24H2 빌드에서 제거된 wmic 명령을 PowerShell Get-CimInstance로 교체해 프로세스 감지 기능 복구
  • 미검증 상태였던 프로세스 감지 분기에 단위 테스트 16건을 추가해 회귀 방지

자격

정보처리기사

2025.09

  • 국가기술자격

SQLD

2024.06

  • 국가기술자격

학력

가톨릭대학교

IT파이낸스 (학사)

2025.03 - 2027.02 (졸업예정)

  • 학점 3.39 / 4.5
  • 자율 온라인 수업으로 업무에 지장 없음을 알립니다.

동양미래대학교

컴퓨터정보공학 (전문학사)

2022.03 - 2024.02

  • 학점 3.89 / 4.5