경력 6년 2개월 · 모든지 배워서 하는 개발자

안도경

“코딩으로 안 되는 건 없다. 일단 해보자.” — 필요하면 뭐든 배워서 만드는 6년 차 개발자입니다.

전국 1,000여 주차현장을 본사 한 곳에서 통합 운영하는 시스템(일 30만~50만 건 데이터 처리, 상시 WebSocket 1,000여 연결)의 백엔드 개발을 주도했습니다. 현장 프로그램(Java 8)부터 본사 백엔드(Java 17/Spring Boot 3), 관리자 웹(Vue 2), 무인정산기까지 4개 시스템 전 계층에 약 2,580커밋을 남기며 다중 파드로 인한 분산 데이터 정합성, PG 결제, 레거시 하위호환 문제를 해결했습니다.

안도경
2023.10 — 재직 중 · 2년 11개월 · 정규직

케이엠파크

카카오모빌리티 주차 사업 자회사 · 풀스택 개발자
카카오모빌리티 주차 사업 자회사 · 풀스택
30~50만
일 데이터 처리
1,000
통합 운영 주차현장
477
운영 중 REST API
2,580
기여 커밋

카카오모빌리티 주차 사업 자회사 케이엠파크에서 정말 많은걸 배웠습니다! 전국에 주차현장이 3,000곳이 넘는데, 그중 1,000여 곳을 본사 한 곳에서 통합 운영하는 시스템을 만듭니다. 인터넷이 끊겨도 차단기는 열려야 하는 도메인이라 현장마다 독립 프로그램과 독립 DB가 있고, 본사가 이걸 상시 WebSocket으로 미러링합니다. 저는 아래 4개 시스템을 오가며 개발했습니다.

4개 시스템 · 전 계층
시스템하는 일스택커밋
본사 백엔드전 현장 통합 관리, 정산, 리포트Java 17 · Spring Boot 3 · jOOQ · MySQL · k8s 4파드1,180
현장 프로그램주차장마다 1대. 장비 제어와 요금계산, 오프라인 자립 동작Java 8 · Spring MVC · MariaDB797
관리자 웹운영자가 정기권, 할인권, 매출을 보는 화면Vue 2 · Nuxt 2429
무인정산기무인주차장 키오스크 대면결제Java 8 · JNA 네이티브 연동175
본사 백엔드Java 17 · Boot 3 · jOOQ
커밋 1,180
현장 프로그램Java 8 · MVC · MariaDB
커밋 797
시스템 규모 · 일 30만~50만 건 데이터 처리 / 상시 WebSocket 연결 1,000여 개 / REST API 477개 / DB 테이블 93개 / 배치 스케줄러 21개 / 현장→본사 동기화 도메인 40종
01

멀티 인스턴스(4파드) 분산 시스템 안정화

4개 파드에서 스케줄러가 동시에 깨어나 배치가 4중 실행되고 있었습니다. 상품 데이터가 4배로 복제되고 알림톡이 같은 사람에게 중복 발송되던 것을 MySQL 네임드 락 기반 공통 실행기로 해결했습니다. 락을 건 커넥션과 푸는 커넥션이 달라져 락이 새던 함정은 원시 커넥션을 고정해서 잡았고, 날짜 기반 락 키를 써서 락이 새더라도 다음 날 자동 회복되게 했습니다.

세션이 파드 로컬 메모리에만 있어서 현장 제어 명령이 1/4 확률로만 전달되던 문제를 RabbitMQ fanout 릴레이로 해결했습니다.

연결 상태 모니터링이 자기 파드가 아는 것만 보여줘서 “현장이 끊겼다”는 오탐이 잦았습니다. 전 IP, 전 파드를 순회해 합산하는 점검 도구를 만들어 보니 단일 조회로 370건이던 연결이 실제로는 727건이었습니다. 운영자가 직접 쓰는 웹 대시보드로 배포해서 이 반복 문의 자체를 없앴습니다.

02

통합ID 인증 체계 개편 — 설계·구현·QC 리드

로그인 주체를 “계정”에서 “사람(통합ID)”으로 올리는 개편을 리드했습니다. 구 로그인과 신 로그인이 무기한 병행되는 조건이라, 권한을 판정하는 지점 188곳이 양쪽 세션을 모두 견디도록 단계적으로 마이그레이션했습니다. (154커밋, 352파일, +15,000줄)

다중 소속 권한 모델과 휴대폰 번호 점유 상태머신(뺏기/되찾기)을 설계했습니다. 되찾기 토큰은 비밀번호 검증을 통과한 뒤에만 발급되게 해서, 번호만 알면 계정을 뺏을 수 있는 경로를 막았습니다.

검증은 세 겹으로 했습니다. 실환경 풀스택을 관통하는 자동 QC 러너 42케이스, 상태머신 회귀용 JVM 단위테스트 2,085줄, 그리고 AI로 도출한 통합 테스트 47건을 테스터 2인이 각자 전 건 실행(총 94회)해서 전건 Pass로 릴리스를 판정했습니다.

03

1,000여 개 현장 데이터 정합성

동기화 ACK가 양쪽으로 거짓말하던 문제를 규명했습니다. 한쪽은 예외를 삼켜서 실패를 성공으로 보고했고, 다른 쪽은 특정 조건에서 ACK를 아예 안 보내 건당 7초 타임아웃이 쌓였습니다. 1,000건 배치가 2시간 걸리던 원인이 이것이었고, 일괄 처리 도구에 반영했습니다.

삭제 신호가 프로토콜에 없어서 본사에 계속 쌓이던 고아 데이터를 정리하는 종료 API와, 여러 사업장을 한 번에 재동기화하는 도구를 만들었습니다.

04

PG(NicePay) 결제·정산 개발

중복 웹훅은 락 대신 상태 조건부 UPDATE로 멱등하게 처리했습니다. 승인은 성공했는데 후속 처리가 실패하는 경우엔 과금-주문 불일치가 남지 않도록 보상 취소를 구현했고, 그것마저 실패하면 수동 대사로 넘기는 경계를 코드에 명시했습니다.

다중 파드에서 모바일 결제가 간헐적으로 실패하던 원인을 찾았습니다. 결제 준비와 PG 복귀 콜백이 서로 다른 파드로 가면 결제 컨텍스트가 유실되는 구조였고, 컨텍스트를 공유 DB에 중간저장한 뒤 콜백에서 행 잠금으로 1회만 소비하게 바꿔 어느 파드가 받아도 결제가 완결되게 했습니다.

05

지식 베이스 구축 및 운영 자동화

시스템이 4개, 소스가 4,000파일이 넘어가면서 전체를 아는 사람이 없어졌습니다. 크로스 프로젝트 지식 베이스를 직접 설계해 노트 279개를 쌓았고, 문서마다 설명하는 코드 경로와 검증한 커밋을 적어 git 이력과 대조하면 낡은 문서가 자동으로 걸러지게 만들었습니다.

사내 도구 5종(현장 연결 점검 대시보드, 할인 데이터 일괄 재동기화, 접속 세션 집계 등)과, 코드베이스에 질문하면 답해주는 Slack 봇을 만들었습니다. 운영자가 개발자를 거치지 않고 직접 확인할 수 있게 되는 것이 목적이었습니다.

그 전에는

2020.02 — 2023.01 · 3년 · 정규직

에프티랩

라돈 측정 전문가용, 연구기관 앱 제작

전문가가 쓰는 장비와 붙는 앱을 만들었습니다. 라돈 측정기, 코로나 자가격리 장비, 국가 연구기관의 연구실 온도 측정 시스템 같은 것들이요. 회사 서버가 터져서 장비들이 업로드를 못 하게 됐을 때는 백엔드를 공부해서 게이트웨이를 직접 세웠습니다.

2019.11 — 2020.01 · 3개월 · 인턴

토크나우

토크나우 시스템 개발

인턴 생활

HOW I WORK WITH AI

제가 AI로 일하는 방식

AI에게 코드를 시키는 것보다, AI가 저와 같은 전제 위에서 판단하게 만드는 일이 더 중요하다고 생각합니다. 그래서 코드보다 먼저 프로젝트 전용 LLM 위키(brain)부터 만듭니다. (brain이라 부르는 이유는 이 위키가 이 프로젝트의 뇌 같은 역할을 하길 원해서 그렇게 부릅니다)

코드보다 먼저 LLM 위키

무엇을 만드는 서비스인지, 어기면 안 되는 규칙이 뭔지, 지금 어디까지 왔는지를 전부 문서로 둡니다. 새 AI 세션은 이걸 정해진 순서로 읽고 시작합니다. 세션이 몇 번 바뀌어도 판단이 흔들리지 않게 하려는 겁니다.

결정은 ADR로, 작업은 세션 로그로 되돌려 씁니다. 작업할수록 문서가 두꺼워지고 다음 작업이 더 정확해집니다.

문서마다 설명하는 코드 경로와 대조한 커밋을 적어두고, 스크립트가 낡은 문서를 자동으로 골라냅니다.

AI가 만든 코드는 검증부터

타입도 빌드도 통과하는데 실제로는 틀려 있는 경우를 여러 번 겪었습니다. 역할을 나눈 병렬 에이전트로 검수합니다. 탐지 담당이 찾은 결함을 회의론자 에이전트들이 반박하게 하고, 살아남은 것만 고칩니다.

실환경 풀스택을 띄워 API, DB, 브라우저를 관통하는 자동 QC 러너를 돌립니다. 최근 인증 체계 개편은 이 러너 42케이스 전건 통과로 마감했습니다.

마지막 판정은 사람이 합니다. AI는 명세된 기대를 전수 검사하고, 사람은 명세 밖(“이건 보이면 안 되는데?”)을 잡습니다.

루프 엔지니어링, 그래프 엔지니어링까지 눈에 띄는 방식은 대부분 해봤는데, 지금은 이 LLM 위키에 클로드코드만 얹어 씁니다. 클로드코드가 계속 발전하면서 직접 만들어 붙이던 것들이 기본 기능이 됐고, 도구를 늘리는 것보다 무엇을 맡기고 무엇을 검증할지 먼저 정하는 쪽이 결과가 좋았습니다.

이렇게 기획부터 디자인, 구현, 배포까지 만들어본 게 이 포트폴리오 허브입니다. 회사에서는 Vue 2를 쓰기 때문에 일부러 React(Vite)로 만들어 폭을 넓혔습니다.

앞으로

이름만 말해도 아는서비스를 만들고 싶습니다.

전문가 몇 명이 쓰는 시스템을 오래 만들다 보니, 개발자가 되기로 했을 때의 목표가 다시 떠올랐습니다. 특정한 누군가가 아니라 불특정 다수가 쓰는, “이름만 말해도 아는 서비스”를 만드는 팀에서 대규모 트래픽과 품질 자동화 경험을 쓰고 싶습니다.

제 이력과 포트폴리오를 모아둔, 직접 만든 포트폴리오 허브jaeminan.dev ↗
깃허브 블로그 · ‘회사생활’ 카테고리에 회고록이 있습니다rhdqngusanr.github.io ↗

소중한 시간 내어 읽어주셔서 감사합니다.

OPEN TO WORK

같이 재미난 거만들어요.

rhdqngusanr@gmail.com ↗