개발 환경, 테스트 환경, 그리고 라이브

서버 개발자에게 컴퓨팅 자원은 곧 비용이다. 대충 한 열 명의 동접마다 한대씩 서버를 할당한다면 누구나 더 편하게 서버를 개발할 수 있을지도 모르겠지만, 현대의 기술은 아직 우리에게 이런 여유(혹은 낭비)를 허용하지 않고 있다. 게다가 열 명당 하나씩 서버를 둘 수 있다손 치더라도, 이로 인해 엄청나게 늘어나는 서버의 수를 관리하는 서버에 몰리는 부하를 처리해야하는 골치아픈 문제는 결국 그대로 남아있게 된다. 그러므로 결국 서버를 최대한 최적화하고 적당한 하드웨어를 찾아서 배포하는 방법론은 당분간 어쩔 수 없는 서버 개발자의 숙명이다.

클라이언트 개발자가 여러 대의 단말에서 테스트 한다면, 서버 개발자는 다양한 환경에서 서버 환경을 구축하고 테스트하게 된다. 끝없이 수정한 코드를 다시 실행해볼 개발 서버, 개발팀, 기획팀, 사내, QA팀을 위한 테스트 서버, FGT나 CBT등을 위한 일정 규모의 라이브에 준하는 서버, 그리고 실제로 서비스하는 라이브 서버, 마지막으로 게임이 성공해서 새로운 서버를 열어야하는 경우까지.. 안드로이드와 iOS라는 꽤나 다른 OS에서 동일한 어플리케이션을 동시에 준비하는 클라이언트 개발자들의 노력도 대단하지만, 상황에 따라 소규모부터 대규모까지 동시에 서버 환경을 만들어내야하는 서버 개발자의 고생도 더하면 더하지 덜하진 않다.

그렇다면 각각의 상황에 맞춰 필요한 하드웨어의 미덕과 준비 방법은 어떻게 될까. 이번 칼럼에서는 이를 이야기해보려고 한다.

1. 개발 환경

의외로 많은 개발자들이 개발 환경 하드웨어의 중요성을 무시하곤한다. 개발 환경의 서버는 최적화되기 전의 코드를 수행한다. 또한 끝없이 코드를 컴파일해야 한다. 그러므로 개발 생산성과 테스트 용이성을 위하여, 개발 환경의 하드웨어는 그 어떤 환경보다도 빠르고 많은 CPU 코어, 이래도 될까 싶을 정도로 많은 메모리와 디스크 용량, 가능한 예산 내에서 무조건 최대한 빠른 형태의 IO를 지원하는 디스크를 확보해야한다.
강력한 하드웨어는 개발과 동시에 빠른 피드백이 이루어지는 팀 테스트와 수정을 동시에 진행하는 경우에도 도움이 된다. 예를들어 스크럼 같은 개발 방법론을 활용하여 빠르게 개발해보고 포스트모템을 진행하는 경우, 강력한 개발 환경에서 단시간 안에 코드를 바꾸고 컴파일해서 테스트 해볼 수 있을 때 가장 효율이 좋다.

2. 테스트 환경

테스트 환경은 다양한 파트의 요청사항에 따라 끝도 없이 늘어날 수 있다는 것이 특징이다. 동일한 환경을 쉽고 간편하게, 그리고 필요에 따라 적절한 수준의 하드웨어에 배포할 수 있도록 배려하는 것이 중요하다. 스트레스 테스트를 위해서는 가능한 분리된 인스턴스에서 각각의 로그와 프로파일링 정보를 얻어내는게 중요하다면, 펀테스트를 위해서는 소수의 인원이 즐겁게 즐길 수 있도록 유도하는 환경이 되어야 한다.

보통 테스트 환경에서 코드를 컴파일할 일은 거의 없다. 즉, 새로 만든 패키지를 빠르게 배포하는 것이 중요하고, 사용자의 수나 컨텐츠의 양에 따른 하드웨어 능력의 분배가 중요하다. 또한 쉽게 배포하는 만큼이나 만들어진 서버 환경을 쉽게 회수할 수 있는 것 역시 중요하다.
그러므로 내부에서 사용할 때에는 vm으로 여러 개의 인스턴스를 관리할 수 있도록 하거나, 클라우드 등에서 저렴한 하드웨어를 필요할 때마다 만들어서 사용하는 것이 좋다.

3. 라이브 환경

라이브 환경을 결정하는 것은 보통 서버 개발자가 아니라 퍼블리셔인 경우가 많다. 물론 그렇긴해도 일반적으로 대형 퍼블리셔가 관리하는 IDC거나, 클라우드로 서버를 배포하는 경우가 가장 흔하다.
이 경우 서버 개발자가 준비해야하는 것은 동접자에 따른 전체적인 서버의 수와 구성 방식이다. 그리고 이를 위해서는 잘 구성된 스트레스 테스트 환경과 성능 프로파일링 방법이 필요하다. 그러므로 라이브 환경 설정은 테스트 환경의 연장선에 있다고 할 수 있다. 라이브 서버에 새로운 서버를 추가하는 경우에도 이는 마찬가지이다. 이 때 사용자의 분산과 추가 작업의 양을 결정하는 것은 비슷한 환경에서 얼마나 테스트를 해보았느냐에 달려있다.
또한 라이브 환경 서버 설정은 비용과 밀접한 관련을 가지게 되므로, 예상 동접은 소화할 수 있되, 노는 서버가 없도록 조율할 필요가 있다. 동시에 넉넉한 서버를 확보하기위하여 서버 개발자는 프로젝트의 책임자에게 잘 설명하여 퍼블리셔를 설득할 수 있는 이론적 기반을 마련해줄 수 있다면 금상첨화일 것이다.

지금까지 서버의 환경에 따른 구성과 이를 위해 중요한 부분은 무엇인지, 어떻게 준비해야하는지를 간단히 살펴보았다. 실제로 어떤 서버를 얼마나 준비해야하는지는 서비스 별로 가이드를 하기에 녹록치 않은 것이 사실이다. 게임마다 로직이 다르고, 장르마다 필요한 서비스가 다르다. 또한 어떤 기능을 어떻게 최적화했느냐에 따라 필요한 하드웨어의 사양은 천차만별이다. 그렇다보니 물고기를 주기보다는 물고기를 잡는 방법을 알려주라는 탈무드의 말과 같이, 주로 원론적인 내용 위주로 정리하게 되었다. 이번에도 미약하나마 서버 개발자들의 고민을 조금이라도 해결해주기를 바라며 이 칼럼을 마친다.

아이펀팩토리 박근환 TD

답글 남기기

댓글을 게시하려면 다음의 방법 중 하나를 사용하여 로그인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중