손호영

손호영

백엔드 · 인프라 개발자

산업기능요원(보충역) · 전직 가능

월간 사용자
7,693
RailNetwork · 2026.10.01~27 총 사용자 · 1년 전 같은 달 3,420명 (GA4)
부하 테스트 p95
143→42ms
k6 부하 테스트 · v1 REST → v2 gRPC 전환 전후 · 기존 앱 v1 응답은 그대로 유지
앱 사용 규모 (광고 노출)
145만 회
RailNetwork · 2026.09 한 달 · 앱 화면에서 광고 요청 414만 회 (AdMob)
배포 시간
5분
슈퍼플래닛 EKS GitOps · 테스트 포함 약 5분 · 이상 시 이전 버전으로 자동 롤백

게임 회사 슈퍼플래닛에서 여러 게임이 함께 쓰는 공통 플랫폼(인증·결제·리워드·지표) 백엔드와 AWS 배포 환경을 맡고 있습니다.

2023년부터 서울 지하철 실시간 열차 위치 서비스 RailNetwork의 서버를 운영하고 있습니다. 2026.10 사용자는 27일까지 7,693명(GA4)입니다. 2026년에는 스토어 앱이 부르는 v1 응답을 그대로 둔 채 서버를 JavaScript·Express에서 TypeScript·Fastify·gRPC로 옮겼습니다.

장애나 데이터 불일치가 생기면 실행계획, 영수증 디코딩, 메트릭으로 원인을 찾고 재발 방지 절차를 문서로 남깁니다. 개인 프로젝트로 Kotlin·Spring 위치 기반 서비스 oshi@log와 Go 일본 철도 API를 만들고 OCI OKE에 직접 구성한 GitOps 플랫폼에서 운영합니다.

경력

재직 중

슈퍼플래닛

백엔드 · 인프라산업기능요원 (보충역 · 전직 가능)

여러 게임이 같이 쓰는 공통 플랫폼(인증·결제·리워드·지표) 서버와 사내 운영툴을 개발하고 AWS 인프라와 장애 대응을 맡고 있습니다. 콘솔에서 23단계를 손으로 하던 EC2 배포를 EKS GitOps로 옮기고, 모듈마다 복사돼 갈라진 서버 프레임워크를 공용 모듈 하나로 다시 만들고 있습니다. 서버 팀은 3명이고 이 전환은 혼자 맡아 진행하고 있습니다.

문제 해결 사례 12건 자세히 보기

주요 작업

  • iOS 결제 누락 원인 규명과 5일치 복구

    로그와 관련 테이블 세 곳 모두에 결제 누락 흔적이 없어서 영수증을 직접 디코딩해 추적했습니다. 클라이언트가 StoreKit 2로 바뀐 뒤 레거시 영수증에서 in_app 필드가 빠지는데 이때 생기는 예외가 삼켜지고 있어서 검증 로직을 고쳤습니다. 영향을 받은 5일치 결제는 전에 실패한 요청을 따로 DB에 쌓도록 모듈들을 고쳐 둔 기록으로 찾아 전부 다시 처리했습니다.

  • 콘솔 수작업 23단계 배포를 EKS GitOps로 (전환 단독 진행)

    전에는 배포할 때마다 AWS 콘솔에서 AMI를 만들고 런치 템플릿 새 버전을 올린 뒤 Auto Scaling 인스턴스를 교체했습니다. 매뉴얼 기준 23단계였습니다. 지금은 push하면 빌드와 이미지 기동 검사, 카나리 배포가 이어지고 테스트를 포함해 약 5분이 걸립니다. 계정 2개와 클러스터 2개를 Terraform으로 만들고 사내 모듈 7개와 게임 서버 1개를 dev 클러스터에 올렸습니다. 운영 트래픽은 아직 EC2가 받고, DNS 교체로 넘어가고 명령 한 번으로 되돌리도록 준비해 두었습니다.

  • 모듈마다 갈라진 서버 프레임워크를 공용 모듈 하나로

    서버 모듈 14개가 같은 프레임워크를 각자 복사해 쓰고 있었고 사본끼리 갈라져 요청 진입 클래스가 6벌이었습니다. 공용 framework와 Maven 멀티모듈로 바꾸고 Java 25·Tomcat 11로 올린 뒤 6개 모듈을 옮겼습니다. 옛 빌드와 새 빌드를 같은 DB에 붙여 core 요청 10,847건(결제 753건 포함)을 비교했고 응답 차이는 0건이었습니다.

  • 부하 시험으로 찾은 커넥션 풀 교착 (210 → 1,208 req/s)

    core 모듈에 동시 300 부하를 넣자 처리량이 210 req/s, p95가 10초였습니다. 결제 실패 로그를 남기는 코드가 요청이 쓰던 연결을 쥔 채 두 번째 연결을 기다리고 있었습니다. 로그용 보조 풀을 DB마다 따로 두자 같은 시험에서 1,208 req/s, p95 0.5초가 나왔습니다.

  • 사내 로그인(OIDC)과 권한 관리 서버 (dev 운영)

    운영툴 로그인을 사내 OIDC 서버 하나로 모으고, 권한은 팀 도구 × 담당 게임에 개인 예외를 더하는 원장 하나로 계산합니다. Keycloak이나 Cognito를 쓰지 않고 직접 만들었습니다. Grafana·VPN 같은 외부 도구를 OAuth로 붙이려면 우리 쪽 OIDC 제공자가 필요했고, Cognito로 가면 AWS 의존이 더 늘어납니다. 기존 도구가 쓰는 v1 API는 응답을 그대로 유지합니다. 운영 DB 사본으로 이관을 리허설해 v1 응답이 옛 서버와 달라지는 756건을 찾아 고쳤습니다.

  • 재화와 외부 쿠폰 발급의 정합성 설계 (운영 반영)

    재화 차감과 쿠폰 발급이 서로 다른 서버에서 일어나서 잠금(Hold) → 확정(Capture) → 해제(Release) 3단계 원장과 7단계 주문 상태로 나눴습니다. 복구 뒤 시퀀스 재사용으로 다른 사용자에게 쿠폰이 나갈 수 있어 CSPRNG 멱등키로 막았습니다. private_key_jwt(RS256)와 JWKS 검증 순서도 고정했습니다.

  • 장애 인지를 분 단위로 (관측 체계)

    경보 규칙 67개와 Grafana 대시보드 42개를 코드로 관리합니다. 경보가 울리면 직접 만든 Slack 봇이 원인 분류와 가린 로그, 런북 링크를 붙여 앱마다 스레드 하나로 보냅니다. 감시 체계 자체가 죽는 경우는 클러스터 밖 데드맨 알람이 잡습니다. 전에는 서버가 내려가도 몇 시간 뒤에야 아는 일이 있었습니다.

사용 기술

Kubernetes (AWS EKS Auto Mode), Argo CD · Argo Rollouts, AWS (CodePipeline · CodeBuild · ECR · ALB · Aurora · S3 · Secrets Manager), Java 17 · 21 · 25 · Jakarta Servlet · Tomcat, Maven · MyBatis · HikariCP · gRPC, MySQL · Aurora · Redis · SQS, Terraform · Helm · Bash · Python, Prometheus · Grafana · Fluent Bit · Headscale

프로젝트

이름을 누르면 설계와 문제 해결 과정을 볼 수 있습니다.

AI 개발 방식

무엇을 만들지와 설계 결정, 통과 기준은 제가 정하고 구현은 대부분 Claude Code에 맡깁니다. 통과 여부는 AI가 쓴 테스트만으로 정하지 않고 기존 서버의 실제 응답과 비교해 판단하고, 기준을 넘지 못한 변경은 반영하지 않습니다. 회사에서도 회사가 제공하는 Claude Code로 EKS 배포 환경을 만드는 일과 서버 모듈 6개를 공용 framework로 옮기는 일을 이렇게 혼자 진행했습니다.

같은 서버 리팩터링
2회 보류 → 반영
RailNetwork · 2024년 두 번은 동작이 같은지 확인할 수단이 없어 라이브에 못 올림 · 2026년은 기존 응답을 테스트로 고정한 뒤 반영
framework로 옮긴 뒤 응답 차이
0건
회사 core 요청 10,847건(결제 753건 포함) · 옛 빌드와 새 빌드를 같은 DB에 붙여 비교
반영 전에 잡은 v1 응답 차이
756건
회사 로그인 서버 이관 · 운영 DB 사본 리허설에서 옛 서버 응답과 비교
  1. 1계획·통과 기준 작성 (직접)
  2. 2기존 응답 녹화·고정
  3. 3단계별 구현 (Claude Code)
  4. 4응답 비교·자체 검사
  5. 5결과 확인 후 반영 (직접)

역할 분담

무엇을 만들지와 설계 결정은 제가 합니다. RailNetwork의 gRPC 전용 v2, 메모리를 정본으로 두는 상태 관리, 선로거리 기반 역 통과 판정은 제가 정해 ADR로 남겼습니다(2026.10.28 기준 11편). 회사 레거시 전환에서는 에이전트가 지킬 규칙을 레포에 적어 두었습니다. 게임이 받는 응답은 바꾸지 않고, 운영 DB에는 쓰지 않고, 돈·보안·커서가 걸린 로직에는 실행해 볼 수 있는 검사를 남기는 것입니다. 구현과 단위 테스트는 Claude Code가 맡고, 단계마다 바뀐 파일과 시험 결과를 보고받아 제가 승인한 뒤 합칩니다.

통과 기준

통과 기준은 기존 서버의 실제 응답입니다. RailNetwork는 바꾸기 전에 노선·소스별 특수 규칙 115개를 목록으로 만들고 v1 응답과 헤더를 특성화 테스트로 고정했습니다. 두 서버를 같은 요청으로 비교하는 패리티 도구도 CI에 넣었습니다. 회사 서버 모듈은 옛 빌드와 새 빌드를 같은 DB에 붙여 응답이 같은지 확인한 뒤 공용 framework로 옮겼습니다.

틀렸을 때

RailNetwork 리팩터링에서 계획서가 세 번 틀렸고 그때마다 재생·재측정·로그에서 드러났습니다. 코레일 선로거리 판정은 재생해 보니 기존 방식보다 1~3역 뒤져서 둘을 합집합으로 바꿨습니다. 그 뒤로는 계획서 항목마다 '틀렸다면 무엇으로 알 수 있나'를 같이 적습니다. 회사 로그인 서버 이관은 운영 DB 사본 리허설에서 v1 응답이 옛 서버와 달라지는 756건이 나와 반영 전에 고쳤습니다.

검사로 막는 것

꼭 지켜야 하는 규칙은 주의에 맡기지 않고 검사로 막아 둡니다. 회사에서는 두 레포의 공용 framework가 같고 자체 검사가 모두 통과해야 push가 나가고, 모듈 코드가 HTTP 클라이언트나 스레드를 직접 만들면 빌드 검사가 실패합니다. 인프라 변경은 읽기 전용 역할로 만든 plan을 승인해야 적용됩니다. 그래도 plan에 나온 애드온 버전 변경이 승인 때 다른 변경에 묻혀 지나갔고, 그 뒤로 버전 값이 비었거나 형식이 틀리면 plan 단계에서 실패하게 했습니다.

기술

Languages
Java 17 · 21 · 25 (슈퍼플래닛 공통 플랫폼), TypeScript (RailNetwork 서버), Kotlin (oshi@log), Go (RailNetwork-JP · 플랫폼 CLI), Python (시각표 파싱 · 데이터 파이프라인), C++ (알고리즘 문제 풀이 · 강의)
Backend & Framework
Java · Jakarta Servlet · Tomcat · MyBatis (실무), Fastify · gRPC · SSE (RailNetwork v2), Spring Boot 3 · Spring Modulith (oshi@log), Go net/http · connect-go (RailNetwork-JP), Resilience4j 서킷 브레이커
Platform & CI/CD
Kubernetes (AWS EKS Auto Mode · OCI OKE · Helm), Argo CD · Argo Rollouts (카나리 무중단 배포), AWS CodePipeline V2 · ECR · Terraform IaC, Tailscale · Headscale VPN · Cloudflare Tunnel, OCI Vault · External Secrets Operator · cert-manager, Jenkins · Portainer (기존 VM 경로), Ansible · Docker Buildx(arm64/amd64) · Trivy
Observability
Prometheus · Alertmanager, Grafana Cloud · Loki · Tempo · Alloy · Fluent Bit, Gatus 내부/공개 상태 페이지, Telegram 상태 봇 (읽기 전용)
Data & Database
PostgreSQL · PostGIS · Hibernate Spatial (oshi@log), MySQL · OCI HeatWave · sqlc · golang-migrate (RailNetwork-JP), MongoDB (RailNetwork 운행 이력), Redis (열차 상태 저장소 · Pub/Sub · WATCH · 요청 제한), Flyway · HikariCP
ML & Data Science
TensorFlow · TensorFlow Lite (엣지 추론), PyTorch · scikit-learn · XGBoost, Pandas · NumPy · Matplotlib
Quality & Tooling
Testcontainers · Vitest · Playwright, JUnit · Kotest · pytest, Detekt · Ktlint · Kover, OpenAPI · JSON Schema, Git · GitHub Actions

수상

학력

연구