모의 면접

오늘은 프로젝트 진행과 지금까지 배웠던 사항들에 대해 모의로 면접을 보는 날이였다!

주요 질문

  1. TCP/IP 통신 시 일어나는 과정을 구체적으로 설명해주세요(= 현 프로젝트가 TCP 통신 서버임 )

  2. 서버가 느리다 라는 말을 들었을 때 어떻게 해결할 건가요?(= 게임 서버의 기본적인 트러블슈팅)

  3. 분산 서버의 이점과 주의사항을 설명해주세요. (= 현재 프로젝트에 분산 서버를 사용한 이유)

  4. Node.js 를 이용해 게임서버를 만들면 어떠한 장점과 단점이 있나요? (= 서버로 Node.js를 사용한 이유)

추가 조사

주요 질문들에 대해 대답을 못했거나 조금 더 알아보고 싶었던 사실들을 정리해두었다.

TCP/IP 통신

  • Application(응용 프로그램) Layer

    • 클라이언트가 특정 프로토콜(예: HTTP, FTP)을 사용하여 서버에 통신을 요청

    • 요청은 특정 주소(IP:PORT)로 전송됨

  • Transport(전송) Layer

    • 요청 정보를 전송 단위(TCP Segment)로 분할

    • TCP의 경우, 3-way handshake를 통해 연결을 설정하고, 신뢰성 있는 데이터 전송을 보장함

    • 헤더에 분할 순서, 오류 검출 정보, 포트 번호 등을 포함함

  • Network(네트워크) Layer

    • 패킷을 목적지 IP 주소로 전송하기 위해 라우팅을 수행

    • 라우팅 테이블을 참조하여 최적의 경로를 선택

    • ARP(Address Resolution Protocol)를 사용하여 IP 주소를 MAC 주소로 변환

  • Data-Link Layer

    • MAC 주소를 기반으로 패킷을 특정 기기로 전달

    • 이더넷 프레임을 사용하여 데이터를 캡슐화

  • Physical(물리) Layer

    • 물리적 매체(예: 케이블, 무선 신호)를 통해 데이터를 전송
  1. 송신자가 응용 프로그램을 통해 특정 주소(IP:PORT)로 통신을 요청

  2. 요청 정보를 전송 단위(TCP Segment)로 분할하는데, 이 때 분할순서, 전달지 및 오류검출에 필요한 정보들을 헤더에 담아둠

  3. 특정 주소(IP : 주소지 / PORT : 받는 프로그램)로 패킷 전송시작

  4. 패킷은 인터넷을 통해 여러 중간 노드들을 거쳐 특정 주소로 보내짐(라우팅)

  5. 네트워크 IP와 ARP을 이용해 MAC 주소(기기 고유 주소)를 찾아내 기기에 패킷을 전달함

  6. 패킷을 전달받은 기기는 헤더에 담긴 정보들을 통해 정보들을 조합하여 알맞은 PORT(응용 프로그램 주소)로 보내줌

서버 개선

  • 서버가 느린 이유에 대해 크게 2가지 정도를 생각해볼 수 있다!

    1. DB 접근이나 서버에 대한 I/O 요청에 의해 과부하가 걸렸을 때

    2. 서버 내부 로직에서 문법오류나 알고리즘 최적화가 덜되어 메모리/CPU 사용량이 증가할 때

1번 상황에 대해선 DB 샤딩( 대규모 DB를 여러 개의 작은 DB(샤드)로 분할하는 기법 ) 및 I/O 요청을 처리해주는 Gateway 서버엔 로드 밸런싱 + 오토 스케일 아웃을 통해
각 I/O 처리를 분산시켜 동시 최대 처리량을 증가시켜줄 수 있다! ( 대신 공유 정보에 대한 동기화 방법에 대해서 고민을 많이 해봐야 한다..)

2번 상황의 경우 프로파일링 및 디버깅을 통해 처리에 시간이 많은 구간을 찾아 최적화를 해주고,
그럼에도 이에 대한 자원이 부족하다면 상황에 따라 수직적/수평적 확장을 해준다!
( 수직적 -> 단일 컴퓨터의 필요 자원을 업그레이드 / 수평적 -> 처리할 컴퓨터를 여러 대 두어 부하 분산 )

아니면 서버가 느려질 수 밖에 없는 타이밍에 클라이언트에 특정 기능을 추가하거나,
특정 기능을 미리 작업하도록 해두어 사용자 경험을 높일 수도 있다!

분산 서버

  • 서버가 처리하는 데이터 양을 분산시켜 전체 시스템의 부하를 줄일 수 있다!
    ( 만약 특정 종류의 서버가 부하를 감당하지 못한다면 오토 스케일 아웃 시스템으로 서버를 증설할 수 있다 )

  • 특정 서버가 중단되더라도 전체 서비스가 유지되는 안정성을 제공한다 (= 가용성 증가)

  • 주의사항으로는 서버 간의 데이터 동기화 문제( 공용 데이터 동기화는 접근/LOCK 방식에 고민을 많이 해야되니.. ),
    네트워크 지연 ( 서비스 이용에 필요한 서버가 여러 개로 이루어져있으니 Latency는 단일 서버보다 당연히 증가.. ),
    복잡한 시스템 관리 ( 서버가 분산된 만큼 관리해야 되는 서버 절대량과 서버 구조 관리방법이 추가로 필요.. ) 등이 있다

Node.js와 게임 서버

  • 현재 대부분의 게임 서버들은 Node.js를 사용하지 않는다는 사실은 대부분 알고 있을 것이다!

  • 이에 대해 Node.js가 싱글스레드라 CPU 집약적 작업에 취약하다는게 큰 문제점인가? 싶지만,
    조금 더 원론적으로 들어가자면 Javascript가 인터프리터 언어라는 한계점이 더 크다!

  • 기존의 게임 서버에 이용되는 C++/C 는 컴파일 언어로 코드들을 한 번에 분석해 최적화를 한 후 실행파일을 만들고,
    만든 실행 파일을 컴퓨터가 직접 실행할 수 있으므로 빠르다!

  • 하지만 Node.js는 인터프리터 언어로 실행 시마다 코드들을 분석해야되기 때문에 대규모 프로그램이나 복잡한 연산 수행 시 성능 저하가 심해질 수 있고, 실행파일을 생성하지 않기 때문에 실행 속도가 느리다..

  • 그럼에도 게임 서버를 학습하면서 Node.js를 사용하는 이유는 뭘까?

  • 기본적인 서버 아키텍쳐나 기초 이론은 어느 언어와 상관없이 사용할 수 있기 때문이다!

-> 실습으론 사용자 친화적 언어인 Javascript를 사용하여 이론을 빠르게 적용해볼 수 있고,
이를 통한 경험으로 다른 언어를 배워가며 그에 맞게 적용시켜볼 수 있다.

한줄 평 + 개선점

  • 요즘 프로젝트에만 몰두해 기존에 배웠던 지식들이 조금씩 빠져나갔던 것 같다..

  • 여러 면접준비 외에도 문제가 생길 때 도움이 될만한 지식들을 되새김질 해야되겠다!