이 글에서는 서버/네트워크 프로그래밍에 대해 조사하면서 알게된 것들을 이것 저것 적어보았습니다.
Unity 게임과 통신 가능한 서버를 구현하기 위해 Boost.Asio를 이용하여 네트워크 프로그래밍에 대해 알아보았습니다. 먼저, Boost 홈페이지에 소개된 Boost.Asio의 의미를 살펴보겠습니다.
"Boost.Asio is a cross-platform C++ library for network and low-level I/O programming that provides developers with a consistent asynchronous model using a modern C++ approach."
"Boost.Asio는 모던 C++ 접근법을 통해 개발자에게 비동기적인 모델을 제공하는 저수준 I/O 프로그래밍과 네트워크를 위한 플랫폼 독립적인 C++ 라이브러리이다."
홈페이지에도 소개가 되어 있듯이, Boost.Asio는
- Asynchronous I/O (비동기 입출력)
- Cross-platform (멀티 플랫폼)
Unity와 Boost.Asio를 이용한 C++ 기반 서버와 통신을 어떻게 할지 조사하던 중, Marshalling과 Serialization이라는 개념에 대해서 처음 알게 되었습니다.
마샬링(Marshalling)이란, 객체의 메모리 구조를 저장이나 전송을 위해서 적당한 자료형으로 변형하는 것을 의미합니다. 예를 들어, Unity에서 만든 구조체 등을 C++ 서버로 보내기 위해 바이트 형태로 변환하는 것입니다. Marshalling은 보통 서로 다른 컴퓨터 혹은 서로 다른 프로그램 간에 데이터를 송수신할 때 사용됩니다.
직렬화(Serialization)이란, 객체를 '연속적인 데이터'로 변환하는 것을 의미합니다. 예를 들어, 클래스/구조체/열거형/델리게이트의 객체를 직렬화하여 스트림에 읽고 쓰는 것이 가능해 지는 것입니다.
설명만 듣고 보면 마샬링과 직렬화의 차이점이 뭔지 감이 잘 오지 않을 것입니다. 쉽게 이야기하면 직렬화는 객체 자체를 복사하는 개념이고, 마샬링은 코드베이스를 가져와 만드는 개념입니다. 그래서 객체를 이용하지 않는 다른 언어 또는 플랫폼 간의 통신을 할 때 주로 마샬링 과정을 통하게 됩니다. 그리고 네트워크나 객체 싱크에는 직렬화를 많이 이용하는 것입니다.
이러한 객체 변환과 객체 전달 방법을 좀 더 찾아보니, (고수님들께서) 마샬링 하지 않고 패킷 시리얼라이징하는 방법을 찾아보라는 글을 봤습니다. C++에서는 기존처럼 그대로 패킷을 만들면 되고, C#에서는 C++에서 온 스트림을 어떻게 다시 데이터화시킬지(Deserialize), C#쪽에서 보낼 때 어떻게 스트림으로 만들지(Serialize) 에 대한 고민을 하면 됩니다.
하지만 이러한 직렬화 프로토콜을 직접 만들기엔 빡시고.. 정신 건강에도 좋지 않다고 하므로.. 그래서 나온 것이 Google protobuf 입니다.
Protobuf (Protocol Buffers)는 구글에서 내놓은 오픈소스 직렬화 라이브러리입니다. 메시지(구조체)를 연속된 비트로 만들고, 반대로 비트에서 원래 메시지로 만들 수도 있습니다. 게임에서는 패킷 전송 시에 유용하게 사용될 수 있습니다.
직렬화 프로토콜에 대한 라이브러리를 알아보던 중, (많은 고수님들께서) "이제는 모바일 게임도 ProudNet 입니다." 라는 글을 보았습니다. 그래서 ProudNet이 무엇인지 찾아보았습니다.
프라우드넷(ProudNet)은 대한민국의 넷텐션에서 개발한 온라인 게임을 위한 네트워크 서버 엔진입니다. 온라인/모바일 게임 개발에 대한 많은 경험 없이도 쉽게 서버를 제작할 수 있도록 도와주는 미들웨어입니다. 직접 사이트에서 찾아보니 프라우드넷 기반의 게임이 어마어마 했습니다.
몬스터 길들이기, 마비노기 영웅전, 스트리트 파이더 5, 세븐 나이츠, 마구마구 등 유명 게임을 비롯해 수많은 게임 서버 개발에 많이 사용되고 있습니다. 고객사로는 넥슨, 넷마블, NHN Entertainment, 스마일게이트 등이 있습니다. 유명 게임 회사들이 사용하는 걸로 보아 정말 잘 만들어진 서버 엔진인것 같습니다.
댓글 없음:
댓글 쓰기