본문 바로가기
Study/Express(node.js)

Node.js ) 웹서버 기초 (1) - http 모듈, 요청 객체, 응답객체

by JongIk 2022. 1. 15.
반응형
  • 해당 글의 코드는 Postman을 이용해 테스트를 진행합니다.

Web Server 호출하기

http 모듈을 이용

// 모듈을 사용하기 위한 준비
const http = require("http");

// 요청을 받아와 응답하는 부분
// 첫 번째 인자로 사용자가 요청할 때 처리하는 콜백함수를 받는다.
http.createServer((req, res) => {
    res.writeHead(200);  // 응답코드를 200으로 설정
    res.end("hello world");   // 요청을 끝냄
  })
  .listen(3000, () => {
    console.log("server on : 3000 port");
  });
  • 콜백함수는 2개의 인자를 받는데 첫 번째가 요청 객체, 두 번째가 응답 객체입니다.
  • listen 은 첫 번째 인자로 포트 번호를 설정합니다. 3000번 포트가 이미 열려있다면 에러가 발생됩니다.
  • 정상적으로 웹 서버가 생성되었음을 포스트맨을 통해 확인할 수 있습니다.


요청 객체, 응답 객체

http로 서버를 만들 때 createServer에 클라이언트가 요청하면 실행되는 콜백함수를 만들었습니다.
콜백함수는 첫 번째 인자로 요청 객체, 두 번째 인자로 응답 객체를 받는다고 했습니다.

요청 객체 (request)

서버는 클라이언트의 요청에 따른 정확한 응답이 필요합니다. 즉, URL 의 형태와 method 에 따라 기능을 제공해야 합니다.

서버는 클라이언트의 요청사항을 해석하기 위해 요청 객체에 포함된 요청 method, URL, header, 요청 body 를 사용합니다.

  • 위의 코드에서 요청객체를 출력하는 코드를 추가해보겠습니다.
const http = require('http');

http.createServer( (req,res) => {
  // req, res 와 같은 이름은 중요하지 않습니다.
  // 첫 번째 인자가 요청객체, 두 번째 인자가 응답객체인 것이 중요합니다.
  console.log(req);
  res.writeHead(200);
  res.end('hello world');
}).listen(3000, () => {
  console.log('server on : 3000port ');
});

)

해당 코드를 실행한 뒤 postman 을 통해 웹서버에 요청했을 때 출력되는 코드 중 저희에게 필요한 headers 와 url, method를 찾을 수 있습니다.

필요한 데이터만 가져오기 위해 다음과 같은 형태로 데이터를 가져올 수 있습니다.

let { url, headers, method } = req;

console.log(url, method, headers);

위 코드를 적용하여 postman 의 params 를 이용해 출력해보겠습니다.

const http = require("http");

http
  .createServer((req, res) => {
    let { url, headers, method } = req;
    console.log(url, method);
    res.writeHead(200);
    res.end("hello world");
  })
  .listen(3000, () => {
    console.log("server on : 3000port ");
  });

)

이와 같이 요청 객체를 이용하면 클라이언트가 서버에 요청한 정보를 가져올 수 있습니다.

body 데이터의 경우에는 요청 객체에서 바로 가져올 수 없고 데이터가 포함되면 이벤트를 발생시켜 데이터를 받아와야 합니다. 클라이언트가 데이터를 보내면 서버는 데이터 이벤트를 감지하여 데이터를 받아야 합니다.

  • Postman 요청과 출력창

)

req.on('data') 의 콜백은 클라이언트가 포함한 body 데이터를 인자로 받는데 해당 데이터는 버퍼 형태로 되어 있기 때문에 toString() 으로 문자열로 변환이 필요합니다.
클라이언트가 전송한 body 는 key=value 형태로 있기 때문에 우리가 사용하기 편하도록 JSON 형태로 변형하여 사용합니다.

데이터를 처리하는 중 에러가 발생하는 경우에는 on('error') 를 호출하면 됩니다.
error 이벤트는 에러 정보를 첫 번째 인자로 포함한 콜백함수를 실행하게 됩니다.


응답 객체

요청 객체를 이용해 사용자의 요청을 파악한 다음에는, 응답 객체를 이용해 사용자에게 원하는 형태로 응답해야 합니다.
이 때는 두 번째로 받은 인자를 활용합니다.

가장 먼저 응답 코드를 설정해야 합니다. 자주 사용되는 코드는 다음과 같습니다.

  • 200 : 성공적으로 요청 처리
  • 201 : 성공적으로 데이터를 추가
  • 404 : 요청한 리소스가 없음
  • 500 : 서버의 문제로 에러 발생

HTTP 응답코드에 대한 상세한 정보는 여기 에서 확인하실 수 있습니다.


응답 코드 설정

응답코드는 위에서 살펴본 바와 같이 요청 객체 res 에서 writeHead 를 호출해 헤더를 설정할 수 있습니다.
WriteHead 는 첫 번째 인자로 전달된 숫자로 응답 코드를 설정합니다.

다음과 같은 방법도 가능합니다.

res.statusCode = 200;

응답 헤더 설정

응답 헤더를 설정할 땐 응답 코드를 설정할 때처럼 writeHead 를 호출하거나 setHeader 를 호출합니다.

const http = require("http");

http.createServer((req, res) => {
    res.writeHead(200, {'Content-Type': 'text/plain'});  // 응답코드를 200으로 설정
    res.end("hello world");   
  })
  .listen(3000, () => {
    console.log("server on : 3000 port");
  });

writeHead 는 두 번째 인자로 헤더를 설정할 수 있습니다.
제공되는 데이터 형식에 따라 Content-Type 은 바뀔 수 있습니다.

응답 코드처럼 헤더도 setHeader 를 이용해 간편하게 바꿀 수 있습니다.

req.setHeader('Content-type' : 'text/plain')

데이터 전송

헤더와 응답 코드 설정이 완료되었으면 마지막으로 데이터를 전달해줘야 합니다. 이때는 end() 를 이용합니다.

전달해 줄 때 html 이나 파일 같은 것들을 응답할 때에는 헤더에서 content-type 을 다르게 보냅니다. 여기서 헤더 설정의 중요성을 알 수 있습니다.

const http = require("http");

http
  .createServer((req, res) => {
    let resData = '<html><body><h1>text/plain</h1></body></html>'
    res.writeHead(200, { "Content-Type": "text/plain" }); 
      // res.writeHead(200, { "Content-Type": "text/html" }); 

    res.end(resData);
  })
  .listen(3000, () => {
    console.log("server on : 3000 port");
  });

text/plain

text/html


다음 글 에서는

GET, POST, 정적/ 동적 파일 제공의 주제를 다뤄보겠습니다.


참고도서 : 자바스크립트로 서버와 클라이언트 구축하기

반응형

댓글