서버에 관한 공부를 하기 전에 Node.js와 서버에 대한 것들을 정리해보고 넘어가자.
1. 서버(server)
🖥️ 서버(Server)란?
- 서버의 사전적의미는 '서비스(service)를 제공하는 사람'이라는 뜻이다.
그러나 현대의 '서버'는 광범휘하게 변해 인터넷 네트워크 환경에서 다른 컴퓨터에게 "다양한 기능, 데이터, 서비스를 제공하는 컴퓨터나 소프트웨어 전반"을 가리키는 의미로 발전하게 되었다.
🖥️ 서버의 종류
- 웹 서버 : 웹사이트 서비스를 제공하기 위한 서버
- 도메인 서버 : 도메인을 관리하기 위한 서버
- 게임 서버 : 게임을 제공하기 위한 서버
'서버'라는 같은 단어로 통칭되지만, 수없이 많은 기능들을 제공하는 컴퓨터와 소프트웨어들이 존재한다.
또한, 서버는 '하드웨어'에만 존재하는 것이 아닌 '소프트웨어'까지도 서버라는 개념에 포함된다.
🖥️ Web server
Web
- 인터넷을 기반으로 한, 정보를 공유하고 검색할 수 있게 만드는 서비스
- 웹은 3가지 요소 , URL(주소), HTTP(통신규칙), HTML(내용) 으로 구성되어있다.
Server
- 클라이언트에게 네트워크를 통해 정보나 서비스를 제공하는 컴퓨터 시스템
- 서버는 일종의 역할로서, 컴퓨터가 인터넷을 이용해 정보나 기능을 제공하는지, 제공받는지에 따라 서버와 클라이언트로 나눠진다.
- 즉, 서버라는 것도 기본적으로는 컴퓨터이며, 서버나 클라이언트 모두 다 본체 안에 CPU와 메모리, 저장 장치, 운영체제가 설치되어 있다.
- 역할의 관점에서 바라봤을 때 개인용 컴퓨터도 서버의 역할을 할 수 있다. 다만 제대로 된 서비스를 운영하기에 제약이 있기 때문에 보통 서버를 따로 둔다.
웹과 서버라는 두 단어를 합쳤을 때 웹서버는 인터넷을 기반으로 클라이언트에게 웹 서비스를 제공하는 컴퓨터라고 할 수 있다.
🖥️ 게임 서버
- TCP Server, Binary Server, Stateful Server 라고도 불린다.
- 클라이언트가 패킷을 서버에 전송해도 서버에서 응답을 꼭 보내주지 않아도 된다.
- 서버에서 클라이언트로 패킷을 전송할 수 있다.
- 실시간 통신이 중요하다.
2. Node.Js
node.js는 V8으로 빌드된 자바스크립트 Runtime(실행환경)이다.
- 원래 기존 자바스크립트는 웹 브라우저 내에서만 작동하던 언어였는데 node.js를 통하여 런타임을 확장 시켰다.
- node.js를 설치하면 터미널에서 브랑우저 없이 자바스크립트를 실행 가능하다.
특징
- Node.js는 단일 스레드(Single-Thread)의 논 블로킹(Non-blocking I/O) 이벤트 기반 비동기 방식으로 처리되어 높은 처리 성능을 가지고 있다.
- 내장 HTTP 서버 라이브러리를 포함하고 있어 웹 서버에서 아파치 등의 별도의 소프트웨어 없이 동작하는 것이 가능하며 이를 통해 웹 서버의 동작에 있어 더 많은 통제를 가능케 한다.
- Javascript 언어로 Front-end 뿐만 아니라 Back-end 개발 환경을 구성할 수 있기에 생산성이 높고 러닝 커브가 줄어든다.
- 다양한 패키지 매니저(npm: node Package Manager)를 기반으로 다양한 모듈(패키지)을 제공하며 필요 라이브러리에 대해 설치하고 사용할 수 있기에 효율성이 좋다.
하나씩 자세히 알아보자
❗️ 이벤트 기반
- 이벤트 기반(Event-driven)이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미한다.
- 이벤트 기반 시스템에서는 특정 이벤트가 발생할 때 무엇을 할지 미리 등록해두고, 이를 이벤트 리스너에 콜백함수를 등록한다.
- 이후 이벤트가 발생하면 리스너에 등록해둔 콜백함수를 호출하며, 이벤트가 끝난 후 노드는 다음 이벤트가 발생할 때까지 대기한다.
- 여러 이벤트가 발생했을 때 어떤 순서로 콜백함수를 호출 할지는 이벤트 루프가 판단한다.
[LINK] 이벤트 기반 비동기 방식에 대해 쉽게 알아보는 예시
❗️ I/O (Input/Output)란?
❗️ 블로킹 (blocking I/O)란?
- I/O가 동작되고 있는 동안에 다른 일을 처리하지 못하는 상태를 의미하며, 함수가 모든 일을 마무리될 때까지 다음 처리가 안되는 것을 의미한다.
❗️ 논 블로킹(Non-blocking I/O)란?
- I/O가 동작을 하면서 request를 받으면 바로 다음 처리에 요청을 보내 놓고 다른 작업을 처리하다가 먼저 요청한 작업이 끝나면 이벤트를 받아서 응답을 보내는 것을 의미한다.
❗️ 러닝 커브(Learning Curve)란?
- ’학습 곡선’이라고도 하며 특정 기술 또는 지식을 실제 필요한 업무와 같은 환경에서 효율적으로 사용하기 위해 드는 학습 비용을 의미한다.
단점
- Node.js 모든 API는 ‘비동기 기반의 처리 방식’이라 서버의 로직이 복잡한 경우에 ‘콜백 함수 늪(callback hell)'에 빠질 수 있다.
- 단일 스레드(Single Thread)이기 때문에 하나의 작업이 오래 걸리는 웹 서비스에 경우 애플리케이션의 성능이 저하될 수 있다.
- 해당 코드를 수행이 되어야지 코드에서 에러가 났는지 확인이 가능하며 에러 갈 날 경우 프로세스 자체가 내려갈 수 있다.
❗️ 콜백 함수(callback) 란?
- 함수를 등록하면 어떤 이벤트가 발생했거나 특정 시점에 도달했을 때 시스템에서 호출하는 함수를 말한다
3. 언제 사용하는게 효율적인가
- 하나의 언어로 Front/Back-end 개발환경을 구성할 때 유용하다
- 간단한 로직으로 구성하는 서비스에 사용하는 것이 좋다.
- 입출력(I/O)이 자주 발생하는 작고 빈번한 요청을 처리하는 서비스에 어울린다. ex) 알림 혹은 채팅 서비스
- 비동기 방식에 어울리는 서비스(네트워크 스트리밍 서비스, 채팅 서비스 등)에 유용하다.
- 빠르게 환경 구성을 하여 개발을 해야 하는 경우에 유용하다.