[4장] 서버 만들기 (REST & Routing)

2022. 5. 3. 00:00책/Node.js 교과서

2. REST와 라우팅

2.1 REST / REST API / RESTful

  • REST ; REpresentational State Transfer. : 서버의 자원을 정의하고 자원에 대한 주소를 지정하는 방법을 말한다. 여기서 자원이란 서버가 행할 수 있는 모든 것들을 통틀어서 의미한다고 보면 된다(파일을 포함한 모든 것들)
  • REST API : REST 규칙(총 6가지)을 지켜서 서비스 API를 구현하는 것을 REST API라고 하는데, 사실 저걸 다 지키기는게 쉬운 일은 아니다. 
  • RESTful : REST를 준수하는 서비스를 RESTful 하다고 한다.

2.2 서버 만들기

HTTP Method(GET, POST, PUT, PATCH, DELETE)를 끼얹어서 RESTful한 서버를 만들어보자. 코드만 주구장창 써내려가면서 중요한 부분만 언급하겠음.

더보기
const http = require('http');
const fs = require('fs/promises');
const users = {};

const server = http.createServer(async (req, res) => {
    try {
        console.log(req.method, req.url);
        switch (req.method) {
            case 'GET' :
                // GET 요청이 들어오면 경로에 맞는 html파일을 보내준다
                if (req.url === '/') {
                    const data = await fs.readFile('./restFront.html');
                    res.writeHead(200, { 'Context-Type': 'text/html; charset=utf-8' });
                    return res.end(data);
                } else if (req.url === '/about') {
                    const data = await fs.readFile('./about.html');
                    res.writeHead(200, { 'Context-Type': 'text/html; charset=utf-8' });
                    return res.end(data);
                } else if (req.url === '/users') {
                    res.writeHead(200, { 'Content-Type': 'text-plain; charset=utf-8' });
                    return res.end(JSON.stringify(users));
                }

                // 근데 html에 딸린 js랑 css파일도 보내줘야됨
                // 그 부분을 여기서 처리하는거임
                // req.url에 ~~~.css ~~~.js도 같이 들어옴
                try {
                    const data = await fs.readFile(`.${req.url}`);
                    return res.end(data);
                } catch (err) {
                    
                }
            case 'POST' :
                if (req.url === '/user') {
                    let body = '';
                    // 클라이언트로 부터 받는 정보는 stream 형식으로 돼있음
                    // 따라서 stream 형식으로 받아서 정리
                    req.on('data', chunk => (body += chunk) );
                    req.on('end', () => {
                        console.log('POST 본문(body):',body);
                        const { name } = JSON.parse(body);
                        const id = Date.now();
                        users[id] = name;
                        res.writeHead(201);
                        res.end('등록성공');
                    });
                    return
                }
            case 'PUT':
                if (req.url.startsWith('/user/')) {
                    const key = req.url.split('/')[2];
                    let body = '';
                    req.on('data', chunk => (body += chunk) );
                    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');
                    });
                };
            case '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');
                }
            default:
                res.writeHead(404);
                return res.end('NOT FOUND');
        }
    } catch (err) {
        console.error(err);
        res.writeHead(500, { 'Contet-Type': 'text/plain; charset=utf-8' });
        res.end(err.message);
    }
});

server.listen(8082);
server.on('listening', () => console.log('8082번 포트 서버 대기중'));

 

' > Node.js 교과서' 카테고리의 다른 글

[4장] 서버 만들기 (cluster)  (0) 2022.05.03
[4장] 서버 만들기(쿠키와 세션)  (0) 2022.05.03
[4장] 서버 만들기 (http모듈)  (0) 2022.05.01
[3장] 노드 기능(2)  (0) 2022.04.29
[3장] 노드 기능(1)  (0) 2022.04.26