본문 바로가기

카테고리 없음

HTTP 트랜잭션 해부

이 글의 목적은 node.js HTTP 처리 과정을 잘 이해하기 위해서 하는 것이다. 언어나 프로그래밍 환경에 관계없이 상식선에서 HTTP 요청이 어떻게 동작하는지 알고 있어야 한다.

 

서버 생성

const http = require('http');

const server = http.createServer((request, response) => {
  //서버를 생성한다
});

HTTP 요청이 서버에 오면 node가 트랜잭션을 다루려고 request와 response객체를 전달하며 요청 핸들러 함수를 호출한다.

요청을 처리하려면 listen메서드가 server객체에서 호출 되어야 한다. 대부분 서버가 사용하고 하는 포토 번호를 listen에 전달하기만 하면된다.

 

메서드,URL,헤더

요청을 처리할 때, 우선은 메서드와 URL을 확인한 후 이와 관련된 적절한 작업을 실행한다. Node가 request 객체에 유용한 프로퍼티를 넣어두었으므로 사용하면 된다.

fetch('http//server${url}')

console.log(request.url)
//fetch의 url부분만 콘솔차에 보여진다.

 

 


요청 바디

POST나 PUT 요청을 받을 때 애플리케이션에 요청 바디는 요청 헤더에 접근하는것보다 어렵고 더 중요하다. 이 스트림에 이벤트 리스너를 등록하거나 다른 스트림에 파이프로 연결할 수 있다. 스트림의 'data'와 'end'이벤트에 이벤트 리스너를 등록해서 데이터를 받을 수 있다.

 

각 'data' 이벤트에서 발생시킨 결과는 Buffer이다.이 결과 값은 문자열 데이터이다. 이 데이터를 배열에 수집한 뒤 'end' 이벤트에서 이어 붙인 다음 문자열로 만드는 것이 가장 좋다.

let body = [];
request.on('data', (chunk) => {
//Buffer형태의 데이터를 배열에 담는다.
  body.push(chunk);
}).on('end', () => {
//Buffer형태의 데이터를 문자열로 풀어준뒤 배열에 담는다.
  body = Buffer.concat(body).toString();
});

에러 처리하는 방법

예기치 않은 에러가 발생하면 node.js프로그램을 종료시킬 수도 있다. 그러므로 단순히 로깅만 하더라도 요청 스트림에 'error'리스너를 추가해야 한다.

request.on('error', (err) => {
  console.error(err.stack);
});

클라이언트에서 보내준 문자열 데이터를 대문자로 바꿔 보내주는 예제

const http = require('http');

const PORT = 5000;

const ip = 'localhost';

http.createServer((request, response) => {
 let body = [];
 request.on('data', (chunk) => {
    body.push(chunk);
  }).on('end', () => {
  //body의 Buffer형태 데이터를 문자열로 바꿔준다.
    body = Buffer.concat(body).toString();
    response.writeHead(200, {'Content-Type': 'application/json'})
    res.end(data.toUpperCase());
  });
server.listen(PORT, ip)

 

 

 

 


node.js공식 홈페이지에 글을 제 입맛대로 수정한글입니다. 더 자세한건 글에서 참고하실수 있습니다.

https://nodejs.org/ko/docs/guides/anatomy-of-an-http-transaction/