HTTP Transaction

Purple·2021년 10월 22일
0

TIL

목록 보기
38/73

1. Node.js란

  • Node.js 공식 사이트에 내린 Node.js의 정의는 "Chrom V8 JavaScript 엔진으로 빌드된 JavaScript 런타임이다. Node.js는 이번트 기반, 논 블로킹 I/O 모델을 사용해 가볍고 효율적이다."
  • 또한 Node.js는 비동기 이벤트 주도 JavaScript 런타임으로써 Node.js는 확장성 있는 네트워크 애플리케이션을 만들 수 있도록 설계되었다.
  • 런타임이란 프로그래밍 언어가 구동되는 환경이다.

2. HTTP Transaction에 대하여

  • 모든 node 웹 서버 애플리케이션은 웹 서버 객체를 만들어야한다. 이때 createServer 를 이용한다.
	const http= require('http');
	const server = http.createServer((request,response) =>{
  	//statement작성
  
	})

2-1. 요청

  • 서버로 오는 HTTP 요청마다 createServer에 전달된 함수가 한번씩 호출된다.
  • HTTP 요청이 서버에 오면 node가 transaction을 다루려고 request와 response객체를 전달하며 요청 핸들러 함수를 호출한다.
  • 요청을 실제로 처리하려면 listen method가 server객체에서 호출되어야한다. 대부분 서버가 사용하고자 하는 포트번호를 listen에 전달하면 된다. 그 외 몇가지 다른 옵션이 있다.
  • Node가 request 객체에 유용한 프로퍼티를 넣어두었다. 우리는 구조분해로 꺼내서 쓰기만 하면 된다.
	const { method, url, headers } = request;
  • method는 항상 일반적인 HTTP 메서드/동사가 될 것 이다. 예) GET, POST 등등
  • url은 전체 url에서 서버, 프로토콜, 포트를 제외한 것으로, 세번째 슬래시 이후의 나머지 전부라고 생각하면 된다.
  • headers라는 전용객체가 request안에 있다. 클라이언트가 어떻게 헤더를 설정했는지에 관계없이 모든 헤더는 소문자로만 표현되야한다.
  • POST나 PUT 요청을 받는다면, 애플리케이션에 바디는 중요하다. 바디의 데이터를 받기 위해서는 스트림*의 'data'와 'end'이벤트에 이벤트 리스너를 등록해서 받을수 있다.
  • 스트림은 '컬렉션, 배열 등의 저장요소를 하나씩 참조하며 함수형 인터페이스(람다식)를 적용하며 반복적으로 처리할 수 있도록 해주는 기능이다.
  • 각 'data'이벤트에서 발생시킨 청크는 Buffer다. 이 청크가 문자열 데이터라는 것을 알고 있다면 이 데이터를 배열에 수집한 다음 'end'이벤트에서 이어붙이 다음 문자열로 만드는 것이 가장 좋다.
	let body=[];
	request.on('data',(chunk) => {
  	body.push(chunk);
	}).on('end', () => {
  	body = Buffer.concat(body).toString();
 	//statement
	});
  • request 스트림의 오류가 발생하면, 스트림에서 'error'이벤트가 발생하면서 오류를 전달할 수 있다. 이벤트 리스너가 등록되어 있지 않다면 Node.js 프로그램을 종료시킬 수도 있는 오류를 던질 것이다. 그러므로 단순히 오류를 로깅만 하더라도 요청 스트림에 'error'리스너를 추가하면 좋다.
	const http = require('http');

	http.createServer((request, response) => {
  		const { headers, method, url } = request;
  		let body = [];
  		request.on('error', (err) => {
    		console.error(err);
  		}).on('data', (chunk) => {
    		body.push(chunk);
  		}).on('end', () => {
    		body = Buffer.concat(body).toString();
    // statement
  		});
	})

2-2. 응답

  • 따로 설정하지 않으면 응답의 HTTP 상태 코드는 항상 200이다. 만약 상태코드를 변경하려면 'statusCode'프로퍼티를 설정하면 된다.
 	response.statueCode = 404;
  • 응답 헤더는 'setHeader'메소드로 설정한다.
	response.setHeader('Content-Type', 'application/json');
	response.setHeader('X-Powered-By', 'bacon');
  • 더 명시적으로 쓰고 싶다면, 'writeHead'메소드가 있다. 이 메소드는 스트림에 상태코드와 헤더를 같이 작성할 수 있다.
	response.writeHead(200, {
  		'Content-Type': 'application/json',
  		'X-Powered-By': 'bacon'
	});
  • 헤더까지 작성하면 응답 데이터를 전송할 준비가 된 것이다.
  • 응답 바디는 일반적인 스트림 메서드 'write'를 사용해서 작성 할 수 있다.
	response.write('<html>');
	response.write('<body>');
	response.write('<h1>Hello, World!</h1>');
	response.write('</body>');
	response.write('</html>');
	response.end();
  • 스트림의 end함수를 통해 선택적으로 데이터를 전송할 수 있다. 그래서 위의 예제를 다음과 같이 간단하게 작성할 수도 있다.
	response.end('<html><body><h1>Hello, World!</h1></body></html>');
  • 응답에서의 오류도 request처럼 처리할 수 있다.
  • request객체는 ReadableStream이고, response객체는 WritealbeStream이다.

출처: nodejs.org
[https://nodejs.org/ko/docs/guides/anatomy-of-an-http-transaction/]

profile
다시 보면, 더 많은 것들이 보인다.

0개의 댓글