Http 트랜잭션 해부

Siwoo Pak·2021년 8월 4일
0

1. node.js

  • 브라우저에는 서버에 요청을 보내기 위해 fetch같은 http 요청을 보내는 도구가 기본적으로 내장
  • 서버는 클라이언트(브라우저)의 요청에 알맞는 응답을 보낼 수 있도록 코드를 작성해야함
  • nodes.js는 http 요청을 보내거나 응답을 받을 수 있는 도구 제공
  • 이러한 프로그램을 웹서버라고 부름

2. HTTP 트랜잭션 해부

2.1 서버생성

const http = require('http');
const server = http.createServer((req, res) => {
//내용작성
});
  • 모든 node 웹서버앱은 웹서버를 객체를 만들어야 함
  • 이때 createServer()를 사용
  • 서버로 요청마다 createServer에 전달된 함수가 한 번씩 호출됨
  • createServer()가 반환한 server 객체는 EventEmitter, 위에선 server객체를 생성하고 리스너는 추가하는 축약 문법을 사용
const server = http.createServer();
server.on('request', (req, res)=> {
//내용 작성
})

2.2 메서드, url, 헤더

  • 요청을 처리할 때, 우선은 메서드와 url을 확인한 후 작업을 실행
  • http의 2개의 객체가 있는 request, response가 있음
  • request안엔 method, url, headers등이 잇음
// 구조분해 할당으로 간편하게 사용가능
const {method, url} = request;
  • 헤더부분도 request의 headers 객체를 사용하여 알수 있음
  • 클라이언트가 어떻게 헤더를 설정했든가에 모든 헤더는 소문자로만 표현됨.
  • 일부 헤더를 반복해서 설정한다면 rawHeader를 사용할수 도 있음.

2.3 요청바디

  • http의 method가 put or post인 경우 body정보를 보냄
  • 여기서 보내온 헤더에 접근하는 것보다 body정보를 받는게 더 어려움
  • 핸들러에 전달된 request 객체는 ReadableStream 인터페이스를 구현하고 있음.
  • 이 스트림에 'data','end' 이벤트를 사용하여 데이터를 받을 수 있음.
  • 각 'data'이벤트에서 발생시킨 청크는 Buffer객체.
  • 만약 이 데이터의 타입이 문자열 데이터라면 배열에 담아서 'end'이벤트에서 이어 붙인 다음 문자열로 만드는 것이 가장 좋음
let body = [];
request.on('data', chunk => {
  body.push(chunk);  
}).on('end', ()=> {
  body = Buffer.concat(body).toString();
})

2.4 오류처리

request.on('error', (err) => {
  // 여기서 `stderr`에 오류 메시지와 스택 트레이스를 출력합니다.
  console.error(err.stack);
});

2.5 http 상태코드

//response객체의 statusCode 속성으로 설정가능
response.statusCode = 404;

2.6 응답 헤더 설정

response.setHeader('Content-Type', 'application/json');
response.setHeader('X-Powered-By', 'bacon');

2.7 명시적인 헤더 데이터 전송

response.writeHead(200, {
  'Content-Type': 'application/json',
  'X-Powered-By': 'bacon'
});

2.8 응답바디 전송

  • response객체는 WritableStream이므로 클라이언트로 보내는 응답바디는 일반적인 스트림 메서드를 사용해서 작성
response.end('<html><body><h1>Hello, World!</h1></body></html>');
profile
'하루를 참고 인내하면 열흘을 벌 수 있고 사흘을 참고 견디면 30일을, 30일을 견디면 3년을 벌 수 있다.'

0개의 댓글