TIL 16

모모·2021년 11월 24일
0

TIL

목록 보기
16/28

웹 서버 기능구현 코드 알아보기

서버 생성

이 서버로 오는 HTTP 요청마다 createServer에 전달된 함수가 한 번씩 호출된다.
createServer가 반환한 server객체는 EventEmitter이다.
HTTP 요청이 서버에 오면 트랜잭션을 다루기 위해 requestresponse 객체를 전달하며 요청 핸들러 함수를 호출한다.
요청을 처리하려면 listen 메서드가 server 객체에서 호출되어야 한다. 대부분은 서버가 사용하고자 하는 포트 번호를 listen에 전달하기만 하면 된다.

// 축약 문법
// http 모듈 불러오기
const http = require('http');
// 웹 서버 객체 생성
  // createServer 사용
const server = http.createServer((request, response) => {
  // 여기서 작업이 진행됩니다!
})


const server = http.createServer();
server.on('request', (request, response) => {
  // 여기서 작업이 진행됩니다!
});

cf. EventEmitter는 인스턴스를 생성하는 클래스이다. 이 객체는 한 개 이상의 함수를 특정 event에 붙여서 실행할 수 있게하는 .on() 함수를 가지고 있다. 이 객체가 이벤트를 실행(emit)하면 특정 event에 붙어있는 한 개 이상의 함수를 모두 비동기적으로 호출한다. 호출된 함수로 인해 발생한 리턴 값은 모두 무시된다.
(https://url.kr/krvul3)

요청(request) 바디

핸들러에 전달된 request객체는 ReadableStream인터페이스를 구현하고 있다.
이 스트림에 이벤트 리스너를 등록하거나 다른 스트림에 파이프로 연결할 수 있다.
스트림의 dataend이벤트에 이벤트 리스너를 등록해서 데이터를 받을 수 있다.

data이벤트에서 발생시킨 chunk는 Buffer이다.
chunk가 문자열 데이터임을 알고 있다면 데이터를 배열에 수집하여 end이벤트에서 이어 붙여 문자열로 만드는 것이 가장 좋다.

let body = [];
request.on('data', (chunk) => {
  body.push(chunk);
}).on('end', () => {
  body = Buffer.concat(body).toString();
  // 이곳에 `body`의 전체 요청 바디가 문자열로 담김
});

request스트림의 오류가 발생하면 스트림에서 error이벤트가 발생하면서 오류를 전달한다.

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

HTTP 상태 코드 및 헤더

상태 코드는 따로 설정하지 않는 이상 항상 200이다.
상태 코드를 변경하려면 statusCode프로퍼티를 설정하면 된다.

response.status = 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'
});

응답(response) 바디 전송

response객체는 WritableStream이므로 클라이언트로 보내는 응답 바디는 일반적인 스트림 메서드를 사용해서 작성한다.

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>');

response스트림도 error이벤트를 발생시킬 수 있다. 따라서 request스트림 오류 처리와 동일하게 처리한다.

0개의 댓글