RISK IT

[TIL21_23.1.29.] [NodeJS] Node 라이프사이클, 요청 및 응답 본문

IT/TIL

[TIL21_23.1.29.] [NodeJS] Node 라이프사이클, 요청 및 응답

nomoremystery 2023. 1. 29. 21:00
반응형

1. Node.js Program Lifecycle

Node.js 이벤트 루프는 작업이 남아 있는 한 계속해서 작동하는 루프 프로세스로 이벤트 리스너가 있는 한 계속 작동한다. 이는 서버가 계속 운영되기 위해서 제거하지 않아야 한다.

코어 노드 애플리케이션은 이 이벤트 루프에 의해서 관리된다. 사실상 모든 코드를 관리.
Node.js는 서버 관리를 포함해 다양한 방면에서 event driven 접근 방법을 가진다.(ex. 데이터베이스 접근 시)

Node.js가 이러한 패턴을 사용하는 이유는 단일 스레드 JavaScript를 실행하기 때문. 즉, 실행 중인 컴퓨터에서 전체 노드 프로세스가 하나의 스레드를 사용한다는 뜻

하지만 언젠가 이벤트 루프를 제거해야 한다면 process.exit() 사용

예시

const http = require('http');

const server = http.createServer((req, res) => {
  console.log(req);
  process.exit();
});

server.listen(1000);

2. 로그에 있는 요청 객체 다루기

console.log(req)의 출력값은 localhost:1000 페이지에 들어갔을 때 들어오는 요청에 있는 모든 데이터를 통해 Node.js가 대신 생성해 준 요청 객채이다. 해당 포트에 있는 요청을 듣고 있기 때문이다.

요청 객채는 아주 복잡한 객체이다. 해더를 보면 많은 양의 데이터 뿐만 아니라 호출할 수 있는 기능도 있는 복잡한 객체라는 것을 알 수 있다. 헤더는 요청 및 응답에 추가된 메타 정보다.

그 중 알아야 하는 필드

  1. url
  2. method
  3. headers

1번 '/'는 req.url에 해당하는 url 주소값인데, 설정한 주소가 없어서 '/'만 나온 상태이다.

2번 'GET'는 req.mothod에 해당하는 값이다. 브라우저에서 정보를 불러들여올 때는 항상 GET으로 호출한다.

3번은 헤더 정보를 담고 있다.

 

3. 응답 전송

const http = require('http');

const server = http.createServer((req, res) => {
  console.log(req.url, req.method, req.headers);
  //   process.exit();
  res.setHeader('Content-Type', 'text/html');
  res.write('<html>');
  res.write('<head><title>My First Page</title></head>');
  res.write('<body><h1>Hello from my Node.js Server!</h1></body>');
  res.write('</html>');
  res.end();

  // 이 이후에 다시 write 하면 작성할 수 없음
  // end 이후에는 Node.js가 다시 클라이언트로 전송하기 때문
});

server.listen(1000);

localhost:1000 출력 결과

개발자도구 Headers 탭

 

개발자도구 response 탭

html태그로 res.write한 값들이 잘 출력되는 모습을 볼 수 있다.

 

크롬 개발자도구 Network 탭에서 Name의 localhost를 누르면 header와 response 등의 정보를 확인할 수 있다.

(참고로 처음엔 name에 아무것도 안보였는데, Has blocked cookies를 체크 해제하니 잘 보였다.)

반응형