Career Description

유채원

게임 서버 프로그래머 · C++ 실시간 Stateful Server / C# 라이브 API Server

C++ 실시간 Stateful 서버(액터 모델·존 기반 멀티스레드)와 C# 라이브 API 서버 양쪽에서 게임 서버를 개발했습니다. 실시간 시뮬레이션에서는 상태 소유권과 서버-클라이언트 경계면 설계를, 라이브 서비스에서는 장애 전파 메커니즘 분석과 회복성 설계를 수행했습니다.

Highlights

넷마블네오 NETMARBLE NEO


나 혼자만 레벨업:ARISE 서버팀

2026.02 — 현재
  • 라이브 2년차 액션 RPG · 글로벌 서비스
  • C# / .NET 10 / ASP.NET Core
  • MySQL(샤딩·복제) / Redis(Cluster·Sentinel)
  • 라이브 API 서버 + 레이드 매칭 TCP 서버(C++/Boost.Asio)
01

DB 장애 회복성 설계 — 포스트모템부터 검증까지

라이브 MySQL이 1분간 응답 불능이 되자 게임 서버 전체가 다운된 장애를 계기로, 장애 전파 메커니즘을 분석하고 서킷브레이커 도입을 제안·설계·구현·검증한 전 과정을 담당했습니다. 본사 아키텍처최적화팀과의 검증을 거쳐 라이브 반영 예정입니다.

장애 메커니즘 분석 (포스트모템 작성)

  • 커넥션풀 고갈 → ThreadPool starvation → Kestrel accept queue 포화로, DB를 체크하지 않는 헬스체크 엔드포인트까지 실패하는 전파 경로를 코드 레벨에서 원인 파악.
  • 실패 처리량 = MaxPoolSize / ConnectionTimeout ≈ 4.3 fails/sec 계산으로, 유입 트래픽이 이를 초과하는 한 자연 회복이 구조적으로 불가능함을 증명 — 1분 만에 회복된 건은 운이었음을 정량화해 도입 필요성 설득.
  • 장애 중 CPU/메모리 지표가 평온한 stealth 장애임을 파악, 동일 전파 메커니즘 위험이 있는 Redis retry-only 정책도 보완 대상으로 식별.

서킷브레이커 설계·구현 (Polly 기반)

  • DB별 회로 분리, 연속 실패 임계 기반 차단, 복구 시 다수 서버 동시 재연결(thundering herd)이 DB를 다시 다운시키지 않도록 재연결 지터 적용.
  • 라이브 코드 변경의 리스크를 고려해 shadow 모드(관측만)로 시작해 실제 반영까지 단계적으로 적용, config 기반 즉시 비활성화 경로 구현.

장애 재현 기반 검증

  • Toxiproxy로 SYN 무응답 블랙홀 장애를 재현해 도입 전후 효과 비교 — 프로세스 kill과는 다른 장애 모드임을 구분해 실제 사고와 동일 조건으로 검증.
  • 본사 아키텍처최적화 팀과 협업해 페일오버 테스트, Half-Open 단일 탐색이 동시 재연결을 막는지 확인하는 썬더링 허드 테스트 수행.
  • 동반 개선으로 장애 검출 속도를 높이기 위한 ConnectionTimeout 단축 제안
02

멀티리전(KR/US) 전환 성능테스트 : 환경 구축 및 결함 진단

KR 단일 리전에서 KR(마스터)과 US(AWS) 멀티리전으로 전환하는 성능 검증 단계에서, 실장비 테스트 환경을 세팅하고 기능·인프라·측정 품질의 결함을 진단·수정하는 역할을 담당했습니다. 배포 전 리스크 사전 도출부터 결함 전달·조치 유도, 테스트 절차 인계까지 본사 아키텍처최적화팀·인프라팀·DBA와 협업하는 게임서버 측 창구를 전담했습니다.

인프라 실측 검증 및 장애 격리

  • US 리전 게임서버에서 네트워크 도달성 매트릭스(로컬 DB/Redis, KR VIP TLS 핸드셰이크)를 직접 검증하고, DB 복제 상태 실측(read_only/server_id)으로 'HA 쌍이 아닌 독립 샤드 구성'임을 확정해 Config 구성.
  • 게임서버 접속 불가의 원인을 보안그룹 인바운드 누락으로 LB 헬스체크가 실패해 대상이 트래픽에서 제외된 것으로 파악하고, KR→AWS 통신 불가를 사설망 라우팅 부재로 확정 : 각 이슈를 출발지-목적지-포트 단위로 특정해 인프라팀 조치를 이끌어냄.

서킷브레이커 회로 격리 결함 발견·수정

  • 회로 키가 dbid 단독이어서, 같은 dbid를 공유하는 GameDB/LogDB/EventDB 간에 한 DB의 장애가 무관한 DB까지 차단하는 격리 실패를 발견.
  • 회로 키를 (DB 종류, dbid) 쌍으로 수정해 특정 DB 장애 시 다른 DB 연결에는 영향 없이 해당하는 회로만 차단.

테스트 실행 기반 구축

  • 리전별 로그인/길드 생성/크로스리전 조회/글로벌 DB 하드차단 등 기능 테스트를 수행하고, 봇 프레임워크의 미해결 버그가 서버가 아닌 도구의 프로토콜 정의 누락임을 브랜치 대조로 파악.
  • 측정 품질 개선: DB 장애 시 봇의 즉시 재로그인이 실제 클라이언트와 다른 부하 패턴을 만드는 문제를 양쪽 재시도 로직 코드 대조로 확인해 재로그인 페이싱 추가, 외부 플랫폼 API mock에 리전별 응답 지연을 세팅해 실제 환경 지연 모사, 비정상 응답률 노이즈를 비게임 트래픽으로 확인해 Grafana 수집 쿼리 정리.
  • 서킷브레이커 검증 항목과 최적 테스트 대상을 정의하고, 아키텍처팀이 그대로 실행 가능한 failover 테스트 절차서로 인계.
03

레이드 매칭 TCP 서버(C++/Boost.Asio) 동시접근 크래시 분석

  • 룸 상태가 세션 strand와 룸 strand 두 실행 컨텍스트에서 동시 접근되어 발생한 라이브 크래시 원인 분석 — 기존 mutex가 일부 경로만 보호하는 불충분 동기화였음을 파악.
  • 상태 소유권을 룸 strand로 단일화하는 수정안 작성: 상태 변경 API를 private으로 내려 직접 호출을 컴파일 타임에 차단하고 Post 래퍼만 노출, strand 위반을 런타임에 감지하는 assert 매크로, strand 밖 직접 호출이 남아있던 disconnect 경로 post화.
  • 채택된 핫픽스 이후에도 남아있는 잠재 크래시 경로와 재발 감지 장치 부재를 식별해 문서화 — 근본 차단과 최소 수정 두 방향의 trade-off 비교 분석.
04

레거시 우편 인터페이스 캡슐화

  • 열 개 이상으로 흩어져 있던 우편 전송 인터페이스를 단일 전송/리스트 전송 2개로 통합.
  • 호출부마다 중복 구현하던 '만료일 0 = 무기한' 도메인 규칙을 우편 인터페이스 내부로 캡슐화 — 호출자는 데이터 id만 넘기면 되는, 도메인 규칙을 몰라도 실수하지 않는 구조의 API로 재설계.
05

AX 겸직 — 사내 LLM 도구 개발

  • 사내 기획서 RAG 챗봇을 설계부터 구축까지 단독 수행 — 하이브리드 검색(벡터+BM25) 기반, MCP 서버 연동.
  • 회의록 RAG 확장 설계: STT 회의 녹취를 그대로 임베딩하지 않고 '의사결정 레코드'(결정·사유·출처)로 구조화 추출 후 인덱싱하는 파이프라인 설계. GraphRAG는 필요성을 입증할 때까지 보류 : 비용-효과 기준으로 기법 선택.
  • 컨텐츠 코드 자동생성의 멀티에이전트(AutoGen) vs 단일 세션 벤치마크 설계·실행: 실제 성능 변수는 에이전트 아키텍처가 아니라 컨텍스트·지침 품질이라는 가설 하에, 동일 기획서·동일 지침·채점셋의 실험 설계. 멀티에이전트가 품질 동등 이하에 토큰 비용·시간 약 2배, LLM 리뷰어의 승인 오탐 반복을 확인해 도입 보류 권고. 유행 기법을 도입 전에 실효성으로 검증.
  • 기획자용 웹툴 허브 구축·운영, 기획 데이터 서밋 검증·테이블 리캐시 자동화 체인(Perforce trigger → CI → 사내 메신저 알림) 구성.

엔씨소프트 NCSOFT


Actor 기반과 존 기반 멀티스레드 모델 각각에서 상태 일관성과 충돌 최소화를 설계 기준으로 게임 서버를 개발했습니다.

TACTAN Server — Actor 기반 Stateful / 멀티스레드

  • 서버 병목 지점 분석 및 성능/안정성 개선을 위한 구조 변경 수행.
  • Stateful Server 기반 게임 콘텐츠 시스템 요구 분석 및 구현.
  • 운영 변경 대응 & 스키마/데이터 확장성을 고려한 코드 설계.

Project LLL Gameplay Server — 존 기반 멀티스레드 / 심리스 오픈월드

  • 존 매니저/월드 매니저 기반 스레드 동기화 구조에서 상태 일관성 확보.
  • 심리스 오픈월드의 존 경계 판정·권위 전이 인터페이스 구현.
  • 더미 부하 테스트/지표 수집/시각화 기반 성능 분석.

TACTAN 서버 1팀

2024.04 — 2025.09
  • 대규모 전략 시뮬레이션(4X/SRPG)
  • PC/Mobile 크로스 플랫폼
  • Unreal Engine 4 / C++ / MSSQL
  • 실시간 Stateful Server · 액터 기반 멀티스레드
01

서버 성능/안정성 개선

전투/이벤트 시 액터 간 스레드 충돌 및 메시지 지연

  • 담당 파트 내 액터 실행 순서를 재배치해 잘못된 스레드 접근과 메시지 지연을 해소.
  • 이후 동일 원인의 스레드 경합 로그가 재발하지 않도록 처리 경로 정리.

패킷 트래픽 과다로 인한 처리량 병목

  • 내부 프로파일러의 호출 빈도/전송량 지표로 병목 항목 식별.
  • 고빈도 항목을 분리하고 로직을 최적화해 내부 전투 테스트 기준 초당 트래픽 약 20% 감소.

SharedPtr 참조 잔존 / 메모리 오염 해결

  • 특정 오브젝트 파괴 시 SharedPtr 참조 잔존으로 해제가 누락되는 문제를 관련 경로 전수 조사로 확인, WeakPtr 전환이 필요한 구간을 식별해 반영.
  • 재현이 어려워 잡히지 않던 메모리 오염을 탐지하기 위해 내부 Stomp 기반 allocator 랩핑 클래스를 도입 — 오염 발생 지점을 BehaviorTree 경로로 특정해 수정으로 연결.
02

상태 기반 서버에서의 시스템 설계

단일 요청 처리보다 상태의 흐름과 동시성/정합성 기준을 우선해, Stateful 서버 환경에서 충돌 없는 상태 전이를 설계한 사례입니다.

실시간 기반 우편 시스템

  • 전투 종료, 길드 활동 등 실시간 인게임 이벤트 기반 우편 생성 및 상태 관리.
  • 동일 유저에 대한 우편 요청을 유저 액터의 메시지 큐에서 순차 처리 — 동시 로그인/다중 클라이언트 요청 상황에서도 상태 일관성 유지.

가챠 상태 동기화 시점 개선

  • 픽업 가챠 종료 시점에 전 유저의 가챠 정보를 일괄 갱신하면서 서버 부하가 자정에 집중되는 문제.
  • 자정 일괄 갱신 대신, 유저 가챠 실행 시점에 서버 상태와 비교해 필요할 때만 동기화하는 지연 동기화 방식을 선택 — 자정에는 서버 전역 가챠 정보만 갱신.
  • 부하를 유저 행동 시점으로 분산하면서 전역/유저 가챠 정보 간 정합성 유지.

서버 시즌 특수 아이템 설계

  • 시즌별로 서버에 단 한 개만 존재하는 특수 아이템의 생성 → 쟁탈 → 소유권 변경 → 소멸 전체 생명주기를 월드 단위로 관리하는 시스템 구현.
  • 생성/소멸 조건을 시즌 상태와 연동해 생성 가능 시점, 제거 조건, 중복 스폰 방지 관리.
  • 시즌 종료 시 전역 상태 전환, 월드 액터 메시지, 유저 액터 정리 순으로 단일 방향 생명주기 보장.

튜토리얼 서버와 본 서버 간 상태 동기화

  • 튜토리얼 시스템 구현 및 튜토리얼 종료 시 서버 간 유저 데이터 이전 처리.
  • 이전 시 동기화되어야 하는 데이터 리스트 관리 및 일관성 유지.
  • 이전 진행 중 여부 검증 로직으로 이관 중 중복 요청에 의한 상태 덮어쓰기 차단.
03

대량/고빈도 처리 최적화

대량 요청·고빈도 이벤트를 기능별 예외처리 대신 공통 처리 패턴으로 통합했습니다.

우편 대량 처리 & 메모리/DB 정책

  • 대량 우편 처리 시 DB 파라미터 제한/지연 문제를 분할 전송 + 리스트 프로시저 + 실패 항목 분리 처리 구조로 해결.
  • 클라이언트/서버 테스트로 1회 처리 상한을 100개로 산정, DB 처리 결과를 리스트로 받아 개별 성공/실패 분리 관리 — 단일 트랜잭션 강제 대신 안정성과 체감 품질을 고려한 trade-off 설계.
  • 우편 데이터 캐싱 + 페이징 전송 + 세션 만료 관리로 메모리 사용량과 DB 접근 균형화.

장착 아이템 대량 분해 최적화

  • 테스트 기반으로 최대 분해 개수 산정 후 Config화.
  • 패킷과 DB 프로시저를 리스트 기반 단일 프로시저로 최적화.

길드 경작지 & 길드 공헌도 로직 최적화

  • 틱마다 경작 진행도/획득량을 계산·전송하던 방식을 이벤트 기반 계산으로 전환해 패킷 부하 절감.
  • 지속 활동 중 초 단위 공헌도 지급 요구사항에 대해, 지급 주기를 Config로 관리하고 주기마다 참여 길드원을 묶어 DB 업데이트와 패킷 전송을 각 1회로 배칭.
04

운영 변경 대응 & 스키마/데이터 확장성

기획 변경/운영 스케줄/QA 요구에 코드 수정이 아닌 데이터 조정만으로 대응되도록 스키마와 정책을 설계했습니다.

가챠 시스템 운영 스케줄링

  • 픽업 가챠 종료 시점에 일반 가챠 풀 자동 갱신 및 DB 반영.
  • 실서비스 운영 중 가챠 정보를 즉시 수정·반영할 수 있도록 별도 DB 테이블로 분리.
  • 가챠 확률 검증 시뮬레이션 커맨드 구현 — 지정 횟수 자동 수행 후 아이템별 실제 선택 비율을 로그로 출력, 입력 확률 대비 검증 지원.

영지 장식 오브젝트 구조 개선

  • 유저 레벨 상승 시 최대 개수만큼 선지급하던 방식을 실제 배치 시점에 사용분만 저장하는 방식으로 개편.
  • 신규 DB 테이블 구조 설계, 레거시 테이블 관련 코드 제거 및 데이터 마이그레이션 수행.

업적 & 컬렉션 / 장착 아이템 구조 개선

  • 업적&컬렉션을 퀘스트 기반으로 확장 — 퀘스트 데이터만 추가하면 업적&컬렉션이 자동 진행/완료되는 구조로 설계.
  • 장착 아이템 공통 로직을 상위 클래스로 이전 — 신규 장착 아이템 타입 추가 시 코드 중복 없이 데이터 추가만으로 확장.

Project LLL Gameplay Server

2022.01 — 2024.03
  • MMOTPS / 루트 슈터
  • PC/Console 크로스 플랫폼
  • Unreal Engine 5
  • 심리스 오픈월드 · 존 기반 멀티스레드
01

심리스 오픈월드 존 분할 / 경계 처리

존 겹침 판정 및 권위 전이 인터페이스 구현

  • 존별 스레드가 분리된 심리스 오픈월드에서, 오브젝트가 존 경계를 넘을 때의 판정·전이 인터페이스를 엔진팀 협업 창구를 전담하며 구현.
  • 엔진팀이 월드에 마킹한 레이어(비트마스크) 기반 발밑 쿼리로 존 겹침을 판정. 여러 존에 걸친 오브젝트는 겹친 존들에 레플리카를 생성하고, 완전 이탈 시 원본을 파괴하며 권위를 이전하는 경계 전이 흐름 처리.
  • 엔진팀 제공 존/경계 추출 기능을 서버 관점에서 테스트하고 버그 리포트·개선점을 피드백, 추출된 정보 기반으로 오브젝트 배치·존 변경·상태 전파 로직을 정비.
02

인터랙터블 오브젝트 시스템 신규 개발

G-Star 출품 버전을 1차 목표로, 조건 충족 시 정의된 동작을 수행하는 인터랙터블 오브젝트 시스템을 신규 개발했습니다.

State Machine + Data-Driven 설계

  • 오브젝트의 상태, 전환 조건, 다음 상태, 입장/퇴장 시 동작을 모두 데이터 테이블에서 정의 — 기획/레벨 디자인 팀이 코드 수정 없이 오브젝트 타입을 확장할 수 있는 구조.
  • G-Star 빌드의 빠른 수정·반영 사이클 대응.

설치형 부활 포인트

  • 설치 후 상호작용 시 해당 위치를 부활 지점으로 등록하는 오브젝트 — 존 전체에서 상태가 동기화되어야 하는 전역 오브젝트.
  • 존 매니저가 변경 발생 시 월드 매니저에 이벤트를 통보하고, 월드 매니저가 관련 존 전체에 브로드캐스트하는 구조로 존 기반 멀티스레드 환경에서 상태 일관성 유지.

개인화 오브젝트

  • 메인 퀘스트 진행도에 따라 동일 오브젝트가 플레이어마다 다른 상태로 보여야 하는 요구 — 열림 조건이 서버 권위 데이터라 클라이언트 단독 처리 불가.
  • 동기화 단위를 오브젝트 상태에서 플레이어별 상태로 분리: 공유 상태는 브로드캐스트, 개인화 상태는 시야 진입 시 관찰자별로 계산해 해당 유저에게만 유니캐스트.
  • 시야 이탈 시 플레이어별 상태를 해제하고 재진입 시 마지막 상태 기준으로 복구해 메모리 최적화.
03

게임 서버 테스트 자동화 & 성능 분석

테스트 자동화 시스템 구성

  • 서버 실행부터 더미 클라이언트 실행, 시나리오 수행까지 전체 테스트 플로우를 배치 자동화.
  • 맵/더미 수/반복 횟수/측정 여부를 스크립트로 외부 정의하는 Data-Driven 시나리오 구성 — 코드 수정 없이 시나리오 교체만으로 다양한 검증 수행.

Grafana 기반 성능 모니터링

  • 게임 오브젝트 스폰 수, 서버 메모리 증가율 등 주요 지표를 수집해 Grafana 대시보드로 시각화.
  • 부하 테스트 결과 비교, 시나리오별 메모리 패턴 분석, 기능 업데이트 후 성능 저하 검증에 활용 — 서버 최적화와 메모리 릭 탐지로 연결.
04

XML 스크립트 시스템 개발

월드 이벤트와 연동되는 XML 스크립트 시스템의 기능 개발, 검증 자동화, 디버그 툴링을 담당했습니다.

스크립트 엔진 기능 확장

  • 스크립트 문법 스키마 관리, 자동 완성 지원용 스키마 기반 자동 생성 파일 유지보수.
  • 스크립트에서 호출하는 하위 동작 함수(조건 검사·오브젝트 조작·트리거) 구현, AI behavior/미션 로직/월드 이벤트 등 다양한 콘텐츠로 스크립트 사용 범위 확장.
  • 플레이어 이동 경로에 따라 NPC/차량/오브젝트를 동적 스폰하는 월드 이벤트 시스템과 연동 — 이벤트 생성 시 지정 XML 스크립트 자동 실행.

검증 자동화

  • 스크립트 파일의 문법 오류·잘못된 참조를 감지하는 검증 Commandlet 개발.
  • 게임 서버 로드 시와 TeamCity CI/CD 파이프라인 양쪽에서 실행되도록 연동 — 잘못된 스크립트가 서버 로직 오류로 이어지는 문제를 커밋 단계에서 차단.

Graphviz 기반 디버그 툴 개발

  • 스크립트 사용 범위가 늘며 콘텐츠 디자이너가 동작을 파악하기 어려워진 문제에 대해, Graphviz + DOT 기반 시각화 디버그 툴을 R&D부터 구현까지 수행.
  • 스크립트의 실시간 동작 흐름, 현재 실행 상태·조건·변수 값을 그래프로 탐색 가능 — 디자이너의 제작/디버깅 효율과 스크립트 기반 콘텐츠 개발 속도 향상.
05

에디터 제작 편의성 개선

  • 엔진팀·기획팀과 협의해 언리얼 에디터의 오브젝트 제작·월드 배치 작업 흐름 개선.
  • 인터랙터블 오브젝트 Prefab 참조를 Alias 기반 매핑에서 태그 기반으로 전환해 확장성 확보.
유채원 — 경력기술서 NCSOFT 2022.01–2025.09 · NETMARBLE NEO 2026.02–

← RESUME