Search
▪️

http Module로 Web Server 만들기

http Module, localhost, Port

const http = require('http')
http.createServer()에서 http는 기본적으로 Event명을 기재하지 않아도 방문에 대한 Event를 자동으로 처리해준다.
http의 경우 80번, https의 경우 443번이 기본 Port Number이다. 기본 Port Number는 생략이 가능하다.
Port Number가 중요한 이유는, Host가 같아도 Port Number가 다르면 다른 사이트처럼 동작하게 된다.
Custom Port Number를 할당할 때는 1024보다 큰 값을 주는 것이 좋다. (1024보다 작은 값들은 중요한 Port Number들이 몰려 있어서 Crash 날 수 있기 때문에 운영 체제에서 자체적으로 검열을 한다.)
listen() Method가 생성되어 있는 Server가 죽지 않고 계속 구동될 수 있도록 해준다.
127.0.0.1은 자기 자신을 나타내는 IP Address인데, 이 127.0.0.1에 해당하는 Domain이 localhost이다.

Cookie 설정하기, req.url

Cookie의 값을 확인할 때는, req.headers.cookie 부분을 통해서 확인할 수 있다.
req.url은 Domain 아래로 존재하는 Path를 의미한다.
favicon.ico라고 하는 것은 Browser Tab에 존재하는 Icon이다. Chrome과 같은 Browser에서는 자동으로 favicon.ico를 달라고 Request를 보낸다.
req.url과 Parsing된 Cookie를 통해서 다른 페이지를 보내줄 수 있다.

Router 분기 처리와 Cookie

한글에 대해서 깨지지 않고 잘 보이고 싶다면 Cookie의 Value를 encodeURIComponent($value)로 Encoding하고, Response를 뿌려주는 부분에 {'Content-Type': 'text/html; charset=utf-8'}로 이용한다.
Cookie의 유효시간인 Expiration과 같은, 시간에 대한 표기는 toGMTString()을 이용한다.
Cookie의 설정 값에서 HttpOnly는 JavaScript에서 Cookie의 접근을 막는 것이다.
Cookie의 설정 값에서 Path를 주게 되면 해당 Path 아래로는 Cookie가 유효하다.

REST API 개념과 Frontend Code 설명

window.onload라는 것은 HTML이 Loading 될 때 발생하는 Event이다.
$variable.statusCode === 200 || $variable.statusCode === 201 과 같이 Status Code에 대해서 처리할 때 늘어나는 OR Operator는 아래와 같이 처리할 수 있다.
[200, 201].indexOf($variable.statusCode) → Browser [200, 201].includes($variable.statusCode) → Non Browser

Request 본문 처리하기 (POST, PUT, PATCH , DELETE)

|| 와 같은 OR Operator는 기본 연산자, && 와 같은 AND Operator는 보호 연산자라 고 부른다.

Router Refactoring

Express.js를 사용하지 않고 순수 Node.js를 통해서 구현해게 된다면 무수히 많은 Nested if문으로 처리해야 한다. 이런 반복 Code를 제거하고자 router라는 Object를 두어 Key 값에 따라 Function을 등록하여 해당 Key 값이 호출 되었을 때 Function이 실행될 수 있도록 Refactoring을 해줘야 한다.

https, http2

http2는 https를 기반으로 동작하기 때문에 https와 마찬가지로 Certificate가 필요하다.
http2의 경우 Express.js와 호환의 문제가 있다. 따라서 spdy를 사용하도록 한다.
http2의 경우 기존 http, https에 비해 속도에서 우세한 면을 보인다.
http2의 경우 .createServer() → .createSecureServer()로 바뀌었다.

cluster로 Multi Processing하기

const cluster = require('cluster')
const os = require('os')
const numCPUs = os.cpus().length
Server를 http, https, http2 어떤 것으로 구동을 하든, Node.js는 Single Thread로 구동되는 것이 변함이 없다.
즉, Multi Thread가 안 되기 때문에, Single Core를 이용하는 Node.js를 다른 Core까지 활용하도록 만든다. 이렇게 여러 Core로 Node.js를 구동하는 Multi Processing을 Clustering이라고 부르고 이를 통해서 Node.js의 Single Core Single Thread 동작을 극복한다.
위에서 os Module의 cpus() Method를 통해서 구한 Core 수만큼 반복하여 Server를 만드는 것이다. (노골적인 for 반복문이 아니라 cluster를 이용해야 한다.)
cluster에는 Master Process와 Worker Process가 있다. cluster.fork()를 통해서 Worker Process를 만들 수 있다.
Master Process의 경우 Worker Process들의 행동들을 모두 관리한다. 즉, Master Process가 cluster.fork()를 통해서 Core 수만큼 Worker Process를 생성하게 되고, Worker Process가 실제 Server를 만들게 된다. (Code를 참고하자.)
Master Process에 의해 생성된 Worker Process의 경우, Server를 구동하다가 죽어버리는 경우가 간혹 있다. 이 때 발생하는 Event는 exit이다. exit에 따라서 새로운 Workrer를 생성할 수 있도록 한다. (Code를 참고하자.)
이렇게 Worker들을 여럿 생성하여 동작하는 Server에서는 Request를 받으면 Worker들이 Request를 나눠서 받고 처리하게 된다. Workrer가 모두 종료되면 Server도 Down된다.
** process.pid를 통해서 Master, Workrer 구분 없이 현재 구동 중인 Process의 ID를 가져올 수 있다.