Node 로 서버 시작하기

최경락 (K_ROCK_)·2022년 1월 5일
0

node.js 의 문서인 HTTP 트랜잭션 해부를 기반에 둠
https://nodejs.org/ko/docs/guides/anatomy-of-an-http-transaction/

서버 시작하기

  • node 를 이용하여 서버를 작성하는 경우, 웹 서버 객체를 이용하여 만든다.
const http = require('http');

const server = http.createServer((request, response) => {
  // 서버 내부를 구현한다.
});
  • 해당 서버에 요청이 전송되면, 요청의 정보를 담은 객체가 request 로 전달되고, 해당 요청에 대한 응답을 위한 메소드response 객체에 작성되어있다.

요청의 HTTP 메소드와 url 받기

  • 요청에 의해 request 객체가 전달되면 해당 객체 내부에 methodurl 값이 함께 전달된다.
  • 구조분해 할당을 이용하여 const {method, url} = request 로 각각의 변수에 할당하거나, request.methodrequest.url 로 직접적으로 불러 올 수 있다.
// www.someurl.com/userinfo 에 GET 요청을 한 경우.

const http = require('http');

const server = http.createServer((request, response) => {
  const {method, url} = request
  console.log(`${url}${method} 요청이 전달 됐습니다.`)
  // '/userinfo 로 GET 요청이 전달 됐습니다.'
});
  • 이를 이용하여 특정 url 로 특정 요청(HTTP 메소드) 들어온 경우를 분기하여 원하는 값을 전달 해 줄 수 있다.

요청의 body 받아오기

  • 안타깝게도 request 객체에서 바로 body를 받아올 수는 없다.
  • 이때 EventEmitter 를 사용하여 해당 데이터를 받을 수 있다.
  • Emiiter.on(Event, Listener) 으로 사용하며, 해당 요소에 이벤트가 발생하면 리스너의 내용을 실행 시킨다.
    node.js 의 이벤트를 기준으로 한다.
  • 아래의 예시를 작성하여 요청의 body를 받아 올 수 있다.
let body = [];
request.on('data', (chunk) => {
  // data 라는 이벤트가 발생했을때, 그 인자를 chunk 로 받는다.
  // 이때 chunk 는 buffer의 형태를 가진다.
  body.push(chunk);
}).on('end', () => {
  body = Buffer.concat(body).toString();
  // end 라는 이벤트가 발생하면 Buffer에 body 내부의 버퍼값을 넣고,
  // 문자열로 바꾼다. => .toString()
});

응답으로 데이터 전송하기

  • 서버 문서를 시작할 때, request 객체 뿐만 아니라, response 객체도 불러오게 되는데, 이를 응답과정에서 사용하게 된다.

상태 코드와 헤더 설정하기

  • response.statusCode = 상태코드 로 요청에 대한 응답 코드를 설정 할 수 있다.
  • response.setHeader(헤더이름, 헤더내용) 으로 응답의 헤더를 설정 할 수 있다.
response.statusCode = 200
response.setHeader('Access-Control-Allow-Origin', '*')
response.setHeader('Access-Control-Allow-Methods', 'POST, OPTIONS')

// 요청에 대한 상태코드를 200으로 표시하고, 헤더에 아래의 내용을 포함시켜 응답한다.
  • 위 두 메소드는 response.writeHead(상태코드, {헤더이름 : 헤더내용}) 으로 한번에 작성이 가능하다.
response.writeHead(200, {
  'Access-Control-Allow-Origin': '*',
  'Access-Control-Allow-Methods': 'POST, OPTIONS'
})

// 위의 내용과 같다.

응답의 body 작성하기

  • response.write(내용) 으로 내용을 응답의 body로 전달 할 수 있다.
  • response.end(내용) 으로 body마지막을 명시함과 동시에 작성된 내용을 전달 할 수 있다.
response.write('<html>');
response.write('<body>');
response.write('<h1>Hello, World!</h1>');
response.write('</body>');
response.write('</html>');
response.end();
  • response.end()내부의 내용을 전달 할 수 있으므로, 위의 내용을 아래와 같이 축약 할 수 있다.
response.end('<html><body><h1>Hello, World!</h1></body></html>');

총 정리

  • 요청의 body 로 전달된 데이터를 대문자로 바꾸어 다시 응답으로 전달하는 경우
const http = require('http');

const server = http.createServer((request, response) => {
  let body = [];
  request.on('data', (chunk) => {
    body.push(chunk);
  }).on('end', () => {
    body = Buffer.concat(body).toString();
    // 요청의 body 내용을 문자열화 시킨다.
    response.writeHead(200, {
      'Access-Control-Allow-Origin': '*',
      'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',   
    })
    // 상태코드와 헤더를 설정한다.
    response.end(body.toUpperCase());
    // 응답의 body에 요청의 body의 내용을 대문자로 변경하여 전달한다.
}
  • 응답은 항상 상태코드, 헤더, body 가 모두 작성되어야 한다!

+

  • 디버깅할때 유용한 툴
    • nodemon → 서버 문서의 변경사항이 저장 될 때, 해당 서버를 새로고침한다.
    • postman → 내가 작성한 서버에 요청을 보내보거나, 응답의 내용을 확인 할 수 있다.
    • --inspect → 노드 서버의 실행 옵션으로, 개발자 도구에서 서버에 대한 응답이나, console.log 를 트리구조로 확인 할 수 있다.

0개의 댓글