만능재주꾼

[Node.js 교과서] REST와 라우팅 사용하기 본문

💻 Node.js

[Node.js 교과서] REST와 라우팅 사용하기

유고랭 2021. 3. 19. 00:06

💻 REST란?

: 서버의 자원을 정의하고 자원에 대한 주소를 지정하는 방법으로, 주소를 지정해주는 방법HTTP 요청 메소드를 이용하는 방법이 있다.

 

나는 HTTP모듈을 이용한 서버 만들기를 공부하고 있기 때문에 HTTP 요청 메소드를 이용하는 방법을 설명할 것이다


 

✏️ HTTP 요청 메소드를 이용해 데이터 전송

  • GET: 서버 자원을 가져올 때 사용하는 요청 메소드로, 데이터를 서버로 보내야 한다면 쿼리스트링을 사용
  • POST: 서버에 자원을 새로 등록할 때 사용하는 요청 메소드로, GET과 달리 요청의 본문에 새로 등록할 때 데이터를 넣어 전송
  • PUT: 서버의 자원을 요청에 들어있는 자원으로 치환할 때 사용하는 메소드로, 요청의 본문에 치환할 데이터를 넣어 전송
  • PATCH: 서버 자원의 일부만 수정할 때 사용하는 메소드로, 요청의 본문에 일부 수정할 데이터를 넣어 전송
  • DELETE: 서버의 자원을 삭제할 때 사용하는 메소드로, GET과 비슷하게 서버의 본문에 데이터를 넣지 않고 전송
  • OPTIONS: 요청하기 전 통신 옵션을 설명하기 위해 사용하는 메소드
const http = require('http');
const fs = require('fs').promises;

const users = {}; // 데이터 저장용

http.createServer(async (req, res) => {
  try {
    if (req.method === 'GET') { //GET 요청 시
      if (req.url === '/') { // 주소가 '/'이면
        const data = await fs.readFile('./restFront.html');
        res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
        return res.end(data);
      } else if (req.url === '/about') { //주소가 '/about'이면
        const data = await fs.readFile('./about.html');
        res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
        return res.end(data);
      } else if (req.url === '/users') { //주소가 '/users'이면
        res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });
        return res.end(JSON.stringify(users));
      }
      // '/'도 '/about'도 '/users'도 아니면
      try {
        const data = await fs.readFile(`.${req.url}`);
        return res.end(data);
      } catch (err) {
        // 주소에 해당하는 라우트를 못 찾았다는 404 Not Found error 발생
      }
    } else if (req.method === 'POST') { //POST 요청 시
      if (req.url === '/user') { //주소가 '/user'이면
        let body = '';
        // 요청의 body를 stream 형식으로 받음
        req.on('data', (data) => {
          body += data;
        });
        // 요청의 body를 다 받은 후 실행됨
        return req.on('end', () => {
          console.log('POST 본문(Body):', body);
          const { name } = JSON.parse(body);
          const id = Date.now();
          users[id] = name;
          res.writeHead(201, { 'Content-Type': 'text/plain; charset=utf-8' });
          res.end('ok');
        });
      }
    } else if (req.method === 'PUT') { //PUT 요청 시
      if (req.url.startsWith('/user/')) { 
        const key = req.url.split('/')[2];
        let body = '';
        req.on('data', (data) => {
          body += data;
        });
        return req.on('end', () => {
          console.log('PUT 본문(Body):', body);
          users[key] = JSON.parse(body).name;
          res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' });
          return res.end('ok');
        });
      }
    } else if (req.method === 'DELETE') { //DELETE 요청 시
      if (req.url.startsWith('/user/')) {
        const key = req.url.split('/')[2];
        delete users[key];
        res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' });
        return res.end('ok');
      }
    }
    res.writeHead(404);
    return res.end('NOT FOUND');
  } catch (err) {
    console.error(err);
    res.writeHead(500, { 'Content-Type': 'text/plain; charset=utf-8' });
    res.end(err.message);
  }
})
  .listen(8082, () => {
    console.log('8082번 포트에서 서버 대기 중입니다');
  });

 

 

4장의 쿠키와 세션 이해하기는 다음 편에 계속... to be continued...👉🏻

 

 

 

 

Comments