확장 가능한 보물찾기는 신화, 하지만 우리는 거의 만들 뻔했다.

발행: (2026년 5월 23일 PM 08:45 GMT+9)
6 분 소요
원문: Dev.to

Source: Dev.to

실제로 우리가 해결하고 있던 문제

알고 보니 우리는 서버 인프라를 확장하는 문제를 해결하려고 한 것이 아니라, 우리 내부 아키텍처 자체의 문제를 해결하려고 했었습니다. 팀은 시스템을 모듈식으로 설계했고, 다양한 컴포넌트가 복잡한 메시지 큐와 HTTP 요청 네트워크를 통해 서로 통신하도록 했습니다. 이는 매우 구체적인 문제에 마이크로서비스 패턴을 적용하려는 시도였지만, 결국 계획대로 작동하지 않았습니다. 확장하려고 할수록 성능 지표가 점점 악화되었습니다. 평균 95번째 백분위수 지연 시간이 400 ms까지 상승했고, 웹 서버의 CPU 사용량은 80%에 달했습니다.

첫 번째 직감은 서버의 데이터베이스 쿼리를 최적화하는 것이었습니다. 데이터베이스가 주요 병목이라는 것을 알고 있었기에 쿼리 플랜, 인덱스, 캐시 전략을 조정하기 시작했습니다. 심지어 일부 쿼리를 처음부터 다시 작성하기도 했지만 큰 효과는 없었습니다. 지연 시간은 몇 밀리초 정도 감소했을 뿐이고, CPU 사용량은 계속 상승했습니다. 데이터베이스는 빙산의 일각에 불과했고, 실제 문제는 시스템 깊숙한 곳에 있다는 것이 명확해졌습니다.

그때 우리는 한 걸음 물러서서 아키텍처를 재평가했습니다. 모듈식 시스템이 오히려 성능을 저해하고 있다는 사실을 깨달았습니다. 컴포넌트 간 통신으로 인해 불필요한 오버헤드가 발생했고, 시스템은 분산된 모놀리쓰 형태로 변해가고 있었습니다. 우리는 접근 방식을 바꾸기로 했습니다—게임 상태를 저장하기 위해 단일 스레드의 인메모리 캐시를 사용하고, 업데이트는 메시지 큐를 통해 비동기적으로 처리하기로 했습니다. 훨씬 단순한 설계였지만, 바로 성능 문제의 핵심이었습니다.

새 설계를 적용한 뒤 성능이 크게 개선되었습니다. 평균 95번째 백분위수 지연 시간은 50 ms로 떨어졌고, 웹 서버의 CPU 사용량은 30%로 감소했습니다. 수천 명의 동시 사용자를 손쉽게 처리할 수 있게 되었으며, 시스템은 훨씬 더 반응성이 좋아졌습니다. 또한 할당 횟수가 크게 줄어들어 큰 고통점이 사라졌습니다. 애플리케이션이 더 이상 CPU와 메모리를 지속적으로 뒤흔들지 않았고, 불필요한 캐시와 큐 코드를 대거 제거할 수 있었습니다.

돌이켜 보면, 처음부터 시스템 설계에 더 과감한 접근을 했어야 했습니다. 우리는 모듈식 시스템으로 바퀴를 다시 만들려 했지만, 실제로는 더 단순한 설계가 훨씬 효과적이었습니다. 또한 개발 주기 초기에 성능 테스트를 집중했어야 했으며, 마지막 순간까지 미루지 말았어야 했습니다. 마지막으로 프로그래밍 언어와 런타임 선택에 더 신중했어야 했습니다. 우리는 파이썬을 사용했는데, 파이썬은 훌륭한 언어이지만 높은 동시성을 요구하는 시스템에는 최적의 선택이 아니었습니다. 그 결과 메모리 안전 문제와 성능 병목에 끊임없이 싸워야 했고, 이는 우리 삶을 불필요하게 어렵게 만들었습니다.

0 조회
Back to Blog

관련 글

더 보기 »

내 스킬

프로젝트를 위한 AI 지시문을 만들고, 설치하고, 관리하세요 — 코딩이 필요 없습니다. CREATE 이름을 정하고, 카테고리를 선택하고, 원하는 것을 설명하세요 — 마법사가 자동으로 구성합니다.