본문 바로가기
TIL&WIL

250206 TIL - 슨배님들 훔쳐보기

by 나노다 2025. 2. 6.

슨배님들의 우아한 최종 프로젝트 훔쳐보기 - 서버 아키텍처

우리 프로젝트에서 활용할 기술 스택을 참고해볼까하고 슨배님들의 깃허브를 염탐해보았는데, 같은 기간에 해낸 게 맞는지 경이로운 프로젝트를 발견했다... 특히 충격적이었던 점은 딱 해보고 싶던 분산 서버 구조였는데, 구성이 기가 막혀서 시간 여유가 된다면 찬찬히 따라해보고 싶은 그런 느낌이었다!! 오늘 염탐한 내용을 간단히 정리해보자!


대략적인 디렉토리 구조

크게 apps와 common이란 디렉토리로 구분하고 계셨는데, 전자는 각 마이크로 서버들이 존재하는 디렉토리였고, 후자는 그 서버들의 뼈대 및 패킷 정의나 DB 연동 로직 등 공통으로 활용하는 코드들이 있는 디렉토리였다!!

common

  • config과 constants : 공용 환경변수 및 상수 들을 중앙 집중식으로 관리하기 위한 디렉토리!!
  • init과 protobuf : 원래대로라면 init은 서버가 가동될 때 함께 실행되는 로직들이 담기는 곳이지만, 슨배님들 프로젝트 기준 프로토 파일들을 로드해오는 모듈 뿐이었기 때문에 함께 씀!! protobuf는 각 서버들에서 쓰는 프로토 정의 파일들이 있다!!

utils

serialize와 deserialize 파일은 패킷을 직렬화 및 역직렬화해주는 모듈!! 모든 서버가 통신에서 두 과정을 거치니 common에 배치돼있는 듯 하다!! notification 파일은, 각 분산 서버가 모두 distributor 서버와 통신을 하기 때문에, 이 때 활용하는 모듈로 보인다!! 

classes

여기서 핵심적인 파일은 바로 TCPserver 파일로, 모든 서버 인스턴스의 기준이 되는 클래스가 정의돼있는 곳이다!! 각 분산서버는 이 클래스의 상속을 받아 각 서버의 특성을 추가하는 방식으로 생성하고 있다!! 여기가 가장 감동이었음


분산 서버 구조

크게는 클라이언트들과 직접 통신하게 되는 Gate 서버, Gate 서버에게 현재 가동되고 있는 서버들의 정보를 최신화해주는 Distributor 서버 두 녀석과 그 외의 서비스 서버들로 구성돼있었다!!

Gate 서버

클라이언트들과 직접 통신, 요청 유형을 구분해 알맞은 서비스 서버로 패킷을 전달해준다!!

Distributor 서버

Gate 서버에게 서비스 서버들의 정보를 알려준다!! 어떤 서비스 서버가 가동을 시작했는지, 서비스 서버들이 패킷을 받을 수 있는 상태인지 등등!! 각 서버의 주소는 어떤 것인지 등등!! Gate 서버는 이 SeverInfos를 바탕으로 통신하게 됨!!

서비스 서버들

Auth, Lobby, Room, Board, MiniGame (1~4) 등의 서비스 서버들이 존재하고, Gate 서버에게 요청을 전달받아 각자 이름에 맞는 역할을 수행하고, 처리 결과를 Gate로 반환해준다!!


마무리

대략적으로 살펴본 구조는 다음과 같고, 이런 서버 유형을 MSA, Micro Server Architecture라고 한다고 한다!! 서버의 기능을 세세하게 나눠 분산하는 방식으로, 어느 한 서버에 문제가 생겨도 극소 기능이기 때문에, 전체 서버의 가동에 큰 영향이 없다는 장점과, 치밀한 구조 설계가 필요하다는 단점 등이 있다고 한다!! 이거를 좀 공부해보면 좋을 것 같다!! 아래는 참고 서적 링크!!
https://thebook.io/006947/