이승하

Portfolio

Web3 게임 플랫폼(메이플스토리 유니버스)에서 2023년 11월부터 담당한 프로젝트를 문제 → 접근 → 결과 순으로 정리했습니다. 공개용으로 정제한 요약이며, 각 항목 끝의 “관련 설계 결정” 링크에서 선택의 이유와 되돌린 결정까지 볼 수 있습니다.

한눈에 보기

영역 주 작업 시기 핵심
온체인-오프체인 동기화(DE) 2023-11 ~ 2024-04 유효성 검사 추가·보완, 닉네임 중복 생성 수정(Redis 락 선점), Helm 배포
트랜잭션 이력 · 북마크 · 거래소 BFF 2024-06 ~ 2025-09 트랜잭션 이력 서비스 구조 개선·확장, 북마크 서비스 개발(서버와 BFF 양쪽), Swap & Warp 도메인 추가
계정 · 결제 · 통합 알림 2025-07 ~ 2026-08 Worldpay 신용카드 인증, USDT 출금 한도 선차감·롤백, SSE 알림, KYC 벤더 변경 데이터 이관
정책 서비스 · 데이터 파이프라인 · 운영 AI 2026-01 ~ 정책 서비스(rate limit·ACL 등) 신설, PostgreSQL CDC → Snowflake, LLM 에러 분석 봇
인프라 · CI/CD · 게이트웨이 전 기간 CI 파이프라인·K8s 매니페스트·Envoy route·DDL 운영, 신설 서비스의 배포 설정
백오피스 · 운영 도구 · 기타 2025-03 ~ 2026-10 아이템/토큰 제재, 운영 콘솔, 확률 고지 서비스, 디스코드·KYC 배치

작업 철학은 네 가지입니다. 실패 경로부터 설계한다(롤백·재시도·멱등이 본체), 확인 대신 선점한다(존재 확인 후 생성은 경합 창이 있다), 서비스는 데이터 파이프라인에 직접 쓰지 않는다(CDC), 정책은 코드 분기가 아니라 설정/enum 으로 받는다.


1. 온체인-오프체인 동기화 — 유효성 검사와 닉네임 선점

2023-11 ~ 2024-04 Go · gRPC · Redis · Saga

맥락. 게임 자산(아이템·캐릭터·재화·닉네임)의 오프체인 상태와 온체인 트랜잭션을 Saga 로 동기화하는 조직에서 첫 업무를 시작했습니다. 게임 서버가 호출하는 gRPC 파사드(business-provider)와 Saga 실행기(saga-provider), 이벤트 저장소(event-service)를 다뤘습니다. 입사 첫 5개월의 작업이라 규모는 작지만, 이후 작업 방식의 출발점이 된 것들입니다.

유효성 검사 추가·보완. 신규 코어 서비스 연동 코드를 BP(파사드)에 만들면서 입력 유효성 검사, proto ↔ 도메인 변환기(단위 테스트 포함), gRPC 에러 래핑을 추가했습니다. 이어 Saga v2 전환 브랜치에서 재화(neso/currency)·캐릭터 유효성 검사기를 추가하고, NFT 아이템 검사가 건마다 상태 서비스를 호출하던 것을 목록 조회 1회로 바꿨습니다.

닉네임 중복 생성 수정. 캐릭터 민트 시 “닉네임이 존재하는지 확인한 뒤 생성”하던 방식은 확인과 생성 사이에 틈이 있어 같은 닉네임이 두 번 만들어졌습니다. 존재 확인을 없애고 Redis 락으로 닉네임을 먼저 선점, 해제는 민트 성공 시에만 하도록 고쳤고 캐릭터 생성에도 같은 방식을 적용했습니다. 작은 수정이지만 “확인 대신 선점” 은 이후 작업에서 계속 쓴 방식입니다.

운영. Helm 으로 신규 서비스를 배포하면서, 장애 재현을 위한 임시 배포/롤백을 커밋으로 남기고 test/qa 승격 전에 dev 에 먼저 배포했습니다.

관련 설계 결정: 확인 대신 선점 · 검증은 목록 조회로


2. 트랜잭션 이력 플랫폼 — 구조 개선부터 CDC 전환까지

2024-06 ~ 2026-11 Go · Kafka · PostgreSQL · Redis · Snowflake

맥락. 플랫폼의 블록체인 트랜잭션(거래·민팅·전송·크로스체인 전송·스테이블 코인)을 수집·조회·알림 발행하는 서비스. 2024년 6월부터 2년 반, 가장 오래 담당했습니다.

단계별 진화.

시기 변화
2024-06 레이어 재정비, 거래 결과 전용이던 컨슈머를 범용 이벤트 컨슈머로 일반화, 불필요 기능 제거, 메시지 포맷 v2 — 이후 모든 확장의 토대
2024-11 트랜잭션 해시를 유니크 키로 승격해 중복 저장 차단, 비정상 이벤트는 DB 대신 DLQ 로
2025 Q1 크로스체인(Swap & Warp) 도메인 추가, OR 조회 → UNION ALL, 커서 기반 무한 스크롤
2025 Q2~Q3 Redis NX(거래·자산·Swap) + PostgreSQL advisory lock(Warp) 으로 동시 적재 정합성, 결과 적재 시 알림 이벤트 발행, 브릿지-인 확장
2026 Q1 Snowflake 적재를 Kafka 발행에서 CDC 로 전환 — 발행 실패 유실 경로 제거
2026 Q3 출금 지연 피처 구현 중 기존 결함(DB 에러 삼킴·커밋 전 알림 발행·갱신 조건) 발견·수정 → 피처 전체 롤백에 함께 되돌아감

Deep dive — Kafka 순서 비보장과 동시 적재.

Deep dive — 롤백된 피처에서 배운 것.

관련 설계 결정: 유니크 키 승격 · 동시 적재 정합성 · publish 대신 CDC · 롤백에서 배운 것


3. 북마크 · 조회수 서비스 신설과 거래소 BFF

2024-06 ~ 2025-09 Go · gRPC · Kafka · Redis

북마크 서비스(서버). 초기부터 참여해 proto 설계부터 라이브까지 담당했습니다.

거래소 BFF(소비자). 같은 서비스를 소비하는 거래소 웹 BFF 도 직접 마이그레이션해, 서버 proto 변경이 BFF 에 어떻게 닿는지 양쪽에서 확인했습니다.

장애 — 간헐적 pod 재시작. 원인 불명으로 BFF pod 가 재시작되던 문제를 로그 추적으로 비동기 반복문 안의 gRPC 호출이 자원을 점유하는 것으로 좁히고, timeout 과 chunk 호출로 해결했습니다.

캐시의 교훈. BFF 북마크 캐시를 “변경 시 무효화” 로 설계했다가 비동기 무효화 실패·context 취소 문제로 timeout 을 늘려가던 끝에 3초 TTL, 무효화 없음 으로 단순화했습니다. 무효화보다 짧은 TTL 이 낫다는 걸 체감한 사례입니다.

그 밖에. Java/Spring Kafka 컨슈머에 북마크 이벤트 적재를 추가했고(이후 요구 변경으로 제거), 런칭 전 거래소 BFF·게임데이터의 버그를 고쳤습니다.

관련 설계 결정: 북마크 멱등성 · 무효화 대신 TTL · proto 모듈화


4. 신용카드 인증 · 재인증 — Worldpay 3DS

2025-08 ~ 2026-07 Go · Redis Lua · 결제 보안

맥락. 사용자가 등록한 신용카드를 0원 결제(3DS)로 검증하고 토큰화해, 이후 OTP 리셋·보안 설정 변경의 재인증 수단으로 쓰는 기능. 결제 보안의 가장 민감한 영역이라 리뷰를 2회차까지 돌리며 완성했습니다.

설계가 복잡했던 지점.

결과. 2025 Q4 라이브 승격 후 재인증·OTP 리셋 재인증으로 확장되며 운영 중. 기획 변경(소유자명 검사 제거 등)에 따라 네이밍과 정책을 세 차례 조정하며 “컬럼 이름에 용도를 넣지 말 것” 이라는 교훈을 얻었습니다.

관련 설계 결정: 벤더 응답 분기 · Lua 카운터 · 네이밍 교훈


5. 스테이블 코인 도입과 선차감·롤백

2025-10 ~ 2025-12 Go · Kafka · 블록체인

온체인에 기록되기 전 발생할 수 있는 리스크(한도 초과, 중복 출금)를 막기 위해 오프체인에서 먼저 차감하고 결과에 따라 롤백하는 서비스를 스테이블 코인(USDT) 도입에 맞춰 확장·수정했습니다.

관련 설계 결정: 롤백 토픽 → 결과 토픽


6. 통합 알림 서비스 — SSE 와 streaming RPC

2025-07 ~ 2026-11 Go · SSE · gRPC streaming · MongoDB

관련 설계 결정: 통합 알림 3가지 결정 · 수신자 스트리밍


7. 정책 서비스 신설 — rate limit · ACL · feature flag · lockout

2026-01 ~ 2026-11 Go · Redis · PostgreSQL

문제. 서킷 브레이커는 공통 라이브러리에, rate limit 은 계정 서비스에, 화이트리스트는 블록체인 서비스에 — 제어 로직이 흩어져 중복과 운영 혼란의 원인이었습니다.

접근.

결과. 인증메일·카드·가입 rate limit, OTP lockout, 출금 예외(화이트리스트), 접근 제어, 기능 플래그의 단일 진입점.

관련 설계 결정: 정책 전용 서비스 분리 · jitter 와 timer · 정책은 enum 으로


8. PostgreSQL CDC → Snowflake 파이프라인

2026-06 ~ 2026-11 Debezium · Kafka Connect · Snowflake

문제. 데이터 팀이 운영 DB 변경을 더 빠르게 조회하길 원했고, 기존 배치 동기화 잡은 지연과 잡별 코드 유지 비용이 있었습니다.

접근. Debezium 으로 변경 이벤트를 Kafka 로 흘리고 Snowflake Stream/Task 로 적재하는 파이프라인을 dev 에서 qa/live 로 확장하고, 계정 DB CDC 와 운영 설정을 맡았습니다.

관련 설계 결정: publish 대신 CDC


9. LLM 에러 분석 봇과 모델 폐기 장애 대응

2026-07 ~ 2026-11 Go · Vertex AI · Slack API · OpenSearch · GitLab API

문제. 운영 에러가 Slack 에 들어오면 담당자가 매번 “어느 코드인지”, “전에도 봤는지”를 수동 검색. 밤·주말 대응이 느렸습니다.

솔루션.

장애 대응.


10. 인프라 · CI/CD — 배포 파이프라인과 운영 저장소

전 기간GitLab CI · Docker · Helm · ArgoCD · Rundeck · EKS · Envoy · Kafka Connect

맥락. 담당 서비스의 CI/CD 설정(GitLab CI → Rundeck → EKS, Helm, Envoy)은 백엔드 개발자가 직접 관리하는 구조였습니다. 파이프라인으로 배포하면서 깨진 빌드를 고치고 신설 서비스를 연결했습니다.

대역별 배포 흐름.

한 일.

결과. 서비스 신설·확장 시 애플리케이션 코드와 배포 설정을 같은 MR 흐름에서 함께 끝낼 수 있었습니다.

관련 설계 결정: 서비스 신설은 배포 세트까지 · test/qa 승격 전 dev 선행 배포 · publish 대신 CDC


11. 백오피스 · 운영 도구 · 기타

관련 설계 결정: 잠금은 Redis 가 아니라 컬럼