내일배움캠프 Node.js 사전캠프 3일차
1. ZEP에서 이루어진 팀단위 아티클 스터디
(1) 아티클의 주제 요약
- 게임의 특성, 요구하는 성능에 따라 게임 서버를 구성하는 언어와 프레임워크는 달라질 수 있다.
- Node.js는 가벼운 클라이언트와 연동하여 동작하는 서버를 빠르게 만들어 보기에 적합하다.
- 그렇다면 Node.js의 어떤 특징들이 이처럼 빠르게 게임 서버를 만드는 데 도움이 되는 걸까?
(2) Node.js를 이해하기 위한 질문
Node.js란 무엇인가?
- Node.js는 오픈 소스 및 크로스 플랫폼 JavaScript 런타임 환경이다.
- 구글 Chrome의 핵심인 V8 자바스크립트 엔진을 브라우저 외부에서 실행한다. 이를 통해 매우 뛰어난 성능을 선보이는 게 특징이다.(Node.js — Introduction to Node.js (nodejs.org))
Node.js의 장점
- V8 자바스크립트 엔진의 강점을 브라우저 바깥에서도 사용할 수 있다.(원래 자바스크립트는 웹 개발 언어였다. 이걸 브라우저 밖에서도 쓸 수 있으면 편리하겠다는 발상에서 시작된 게 Node.js)
- V8은 고성능 자바스크립트 및 WebAssembly 엔진이다. Google에서 오픈소스로 제공하고 있으며, C++로 작성되어 있어 웹 브라우저가 아니더라도 별도로 이식이 가능하다. 즉, V8을 통한다면 C++에서 사용하던 기능을 자바스크립트 엔진에서도 이용할 수 있다는 뜻이다.
- 기존에 널리 쓰이던 방식은 멀티 스레드 방식이었다. 프로세스 내부에서 스레드를 여러 개 만들어 여러 개의 로직을 동시에 처리해왔다. 그러나 복잡한 동기화의 문제가 있어 생산성의 저하로 이어졌고 비용의 증가를 불러왔다.
- 반면 Node.js는 새 스레드를 생성하지 않고 단일 프로세스를 실행한다. 또 코드를 한 줄씩 수행하는 기존의 Blocking방식이 아니라 Non-blocking I/O를 채택했다.
- 따라서 Node.js는 CPU 사이클이 지연되지 않고, 새 응답이 돌아올 때까지 입출력 작업을 바로 수행한다. 이를 통해 단일 서버로도 수천 개의 동시 연결을 처리할 수 있다.
- 브라우저용 JavaScript를 작성하는 프론트엔드 개발자가 완전히 다른 언어를 배울 필요 없기 때문에 Node.js에는 고유한 이점이 있다.(Node.js — Introduction to Node.js (nodejs.org))
Node.js의 단점
- Node.js의 비동기 특성으로 인해 콜백 함수가 중첩되는 경우가 발생한다.(이를 콜백 지옥이라고 한다.) 이로 인해 코드를 읽고 유지 관리하기가 어려울 수 있다.
- Node.js는 단일 스레드 이벤트 루프에서 작동하며, 이는 CPU를 많이 사용하는 작업에 대한 제한이 될 수 있다. I/O 바운드 작업을 처리하는 데는 탁월하지만 과도한 계산은 이벤트 루프를 차단하여 성능에 영향을 줄 수 있다.
- 자바스크립트는 동적 언어다. 즉 실행 되는 과정에서 새로운 속성이 추가되거나, 대체되거나, 삭제될 수 있다는 것을 의미한다. 자바나 대다수의 언어의 경우 애플리케이션 시작 이후에는 동적으로 변경될 수 없는 언어와는 다른 차이다. 이런 특징 때문에 디버그를 하기 어려운 런타임 오류가 발생할 수 있다.(Advantages and Disadvantages of Node.js: Reasons to Choose or Avoid Node.js | by Emperor Brains | Medium)
Node.js 로 게임 서버를 만든다면 어떤류의 게임에 적합한가?
- 동시 연결에 강하다는 장점과 복잡한 코드의 유지보수가 어렵다는 단점을 생각해본다면, 비동기형 게임 중 유저 간 상호작용이 적은 게임에 유리할 것이라고 생각한다. 실제 동기화는 되었지만 반영이 안 될 수도 있기 때문이다.(구승모 교수 "게임 서버 제작과 운영, 아마존을 통해 쉽게 해결한다" (inven.co.kr))
- 어쩌면 다수의 유저가 턴제로 행동하는 소셜 게임에 적합하지 않을까???(유저 입력값에 실시간으로 반응하기보다는 입출력된 결과물의 동기화 처리가 더 중요한 게임들…? 모두의 마블, 마피아 42 등…)
(3) 인사이트 공유하기
찾아보니 모르는 용어들이 너무 많아서 따로 나만의 인사이트를 적기보다는 궁금했던 단어들을 찾아보기로 결정했다. 열심히 검색한 결과를 나누어 볼까 한다. 출처는 나무위키나 블로그 등지에서 가져온 것이라 어느 정도로 믿을만한지는 잘 모르겠으나, Node.js를 이해하기에 조금이라도 도움이 될 수 있으리라고 생각한다.
- 스레드 : 최신 운영체제의 필수요소 중 하나. 프로세스보다도 작은 실행 흐름의 최소 단위이다. 예전에는 프로그램을 실행하는 흐름이 오로지 프로세스뿐이었으나, 소프트웨어가 진보하면서 하나의 프로그램에서 복잡한 동시 작업을 요구하기 시작하였다. 이를 위해서는 하나의 프로그램이 여러 개의 프로세스를 만들어야 했는데 프로세스 특성상 하나의 프로그램이 이러한 동시 작업을 수월하게 할 수가 없었다. 그래서 프로세스보다 더 작은 실행 단위 개념이 만들어지게 되는데 이것이 스레드이다. 하나의 프로세스에서 여러개의 스레드가 메모리를 공유하여 작동할 수 있으며, 그래서 생성과 속도가 빠르고, 적은 메모리를 점유하며, 정보 교환이 쉽고 Context Switching 부하가 적지만 그 대가로 자원 선점과 동기화 문제를 얻게 되었다. 대다수 OS의 스케줄러는 스레드를 최소 단위로 하여 작동한다.(출처 : 나무위키)
- 콜백 함수 : js에서 함수는 다른 함수의 인자로 쓰일 수도 있고 어떤 함수에 의해 리턴될 수도 있다. 이때 인자로 넘겨지는 함수를 콜백 함수라고 한다. 단지 함수를 등록하기만 하고 어떤 이벤트가 발생했거나 특정 시점에 도달했을 때 시스템에서 호출하는 함수! 비동기 방식으로 작성된 함수를 동기 처리하기 위해 필요 하다.(출처 : Callback함수란?? 뭔데?? (velog.io))
- 동기(synchronous) 방식: 하나의 요청이 오면 완료가 된 후 다음 요청을 실행하는 방식 - 순차적 로직 흐름(출처 : Callback함수란?? 뭔데?? (velog.io))
- 비동기(asynchronous) 방식: 어떤 요청이 오면 완료가 되기 전에 다음 요청을 실행하는 방식(출처 : Callback함수란?? 뭔데?? (velog.io))
- 동기식 콜백(synchronous callbacks)은 중간에 비동기 작업 없이 외부 함수 호출 직후에 호출되는 반면에, 비동기식 콜백(asynchronous callbacks)은 asynchronous 작업이 완료된 후 나중에 호출된다.(출처 : 콜백 함수 - MDN Web Docs 용어 사전: 웹 용어 정의 | MDN (mozilla.org))
2. 팀 노션으로 회의록 발행
(1) 무엇을 새롭게 배웠는가
Node.js는 CPU 집약적인 작업에는 부적합하다. 그럼에도 실시간성이 중요하지 않는 게임에는 유리할 것이다.(모바일 소셜, 레이싱 게임) 왜냐하면 서버에서 실제 동기화는 되었더라도, 클라이언트엔 반영이 안 될 수 있기 때문이다. 간단한 응답 구조가 다량화된 게임 시스템에 최적화되어 있다.
(2) 무엇이 새롭게 궁금해졌을까.
모바일 게임 시장 성장과 하이퍼캐주얼 게임 장르가 부상하는 요즘, Node.js가 가진 가능성에 대해 알아가고 싶다.
3. 하루를 되돌아 보며
저번 아티클에선 게임의 특성에 따라 각기 다른 서버 방식이 채택된다는 사실을 배웠다. 그리고 이번 아티클에선 Node.js가 어떤 게임에 적합할지 스스로 고민해보는 시간을 가져 보았다.
결과적으로 비동기 방식에 유리하면서도 Node.js 가진 단점을 상쇄할 수 있는 게임 장르가 무엇이 있는지, 팀원들끼리 많은 인사이트를 나누게 되었다.
지피지기면 백전백승이라는 말이 있듯이, 내가 다루는 언어가 어떤 강점을 가지고 있는지 또 어떤 약점을 가지고 있는지 파악한다면 개발과정에서 생산성을 훨씬 높일 수 있을 것이라고 생각한다.
앞으로 Node.js를 배울 때에 이 점에 유의하며 프로젝트의 주제를 고민해봐야겠다.
댓글