ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • REST API, JSON, 라우터 리팩토링
    Node.js/백엔드 2020. 1. 4. 16:16

    REST API

    요청이 주소를 통해 들어오므로 서버가 이해하기 쉬운 주소를 사용하는 것이 좋다.

    • REpresentational State Transfer의 약어

    • 네트워크 구조의 한 형식 → 서버의 자원을 정의하고, 자원에 대한 주소를 지정하는 방법

    • 주소는 의미를 명확히 전달하기 위해 명사로 구성됨

    • /user → 사용자 정보에 관련된 자원 요청

      /post → 게시글에 관련된 자원 요청


    주소 외에도 HTTP 요청 메서드 사용

    HTTP 요청 메서드

    • GET: 서버 자원을 가져오고자 할 때 사용. 요청의 본문(body)에 데이터를 넣지 않는다. 데이터를 서버로 보내야 한다면 쿼리스트링을 사용한다.
      • 브라우저에서 캐싱할 수 있다. 같은 주소의 GET 요청을 할 때 서버에서 가져오는 것이 아니라 캐시에서 가져올 수 있다. 캐싱이 되면 성능이 좋아진다.
    • POST: 서버에 자원을 새로 등록하고자 할 때 사용. 요청의 본문에 새로 등록할 데이터를 넣어 보낸다.
    • PUT: 서버의 자원을 요청에 들어 있는 자원으로 치환하고자 할 때 사용. 요청의 본문에 치환할 데이터를 넣어 보낸다.
    • PATCH: 서버 자원의 일부만 수정하고자 할 때 사용. 요청의 본문에 일부 수정할 데이터를 넣어 보낸다.
    • DELETE: 서버의 자원을 삭제하고자 할 때 사용.

    주소 하나가 요청 메서드를 여러 개 가질 수 있다.

    REST API를 따르는 서버를 RESTful하다고 표현한다.

    JSON(JavaScript Object Notation)

    ''속성-값 쌍'' 또는 "키-값 쌍"으로 이루어진 데이터 오브젝트를 전달하기 위해 인간이 읽을 수 있는 텍스트를 사용하는 개방형 표준 포맷이다. 비동기 브라우저/서버 통신(AJAX)을 위해, 넓게는 XML을 대체하는 주요 데이터 포맷이다. 특히, _인터넷에서 자료를 주고 받을 때 그 자료를 표현하는 방법_으로 알려져 있다. 자료의 종류에 큰 제한은 없으며, 특히 컴퓨터 프로그램의 변수값을 표현하는 데 적합하다.

    출처: 위키백과

    JSON 메시지 단위는 배열이나 객체이다.

    Screen Shot 2020-01-02 at 12 26 58 PM

    장점

    • 텍스트로 이루어져 있어, 사람과 기계 모두 읽고 쓰기 쉽다.
    • 프로그래밍 언어와 플랫폼에 독립적이므로, 서로 다른 시스템간에 객체를 교환하기 좋다.
    • 자바스크립트 문법을 채용해서, 자바스크립트에서 eval 명령으로 곧바로 사용할 수 있다.

    JSON.parse()

    JSON 문자열의 구문을 분석하고, 그 결과에서 JavaScript 값이나 객체를 생성한다.

    const json = '{"result":true, "count":42}';
    const obj = JSON.parse(json);
    
    console.log(obj); // > Object { result: true, count: 42 }

    JSON.stringify()

    JavaScript 값이나 객체를 JSON 문자열로 반환한다.

    console.log(JSON.stringify({x: 5, y: 6})); // "{"x":5, "y":6}"
    console.log(JSON.stringify([new Number(3), new String('false'), new Boolean(false)])); // "[3,"false",false]"
    console.log(JSON.stringify({ x: [10, undefined, function(){}, Symbol('')] })); // "{"x":[10,null,null,null]}"
    console.log(JSON.stringify(new Date(2006, 0, 2, 15, 4, 5)));
    // ""2006-01-02T15:04:05.000Z""

    라우터 리팩토링

    const router = {
        get: {
            '/': (req, res) => {
                fs.readFile('./restFront.html',(err,data) => {
                    if(err) {
                        throw err;
                    }
                    res.end(data);
                });
            },
            '/users': (req,res) => {
                res.end(JSON.stringify(users)); 
            },
            '*': (req, res) => {
                fs.readFile(`.&{req.url}`, (err,data) => {
                    return res.end(data);
                });
            },
        },
        post: {
            '/users': (req,res) => {
                let body = '';
                req.on('data', (data) => {
                    body += data;
                });
                return req.on('end', ()=>{
                    console.log('POST 본문(Body):', body);
                    const {name} = JSON.parse(body);
                    const id = +new Date();
                    users[id] = name;
                    res.writeHead(201, {'Content-Type': 'text/html; charset =                                 utf-8'});
                    res.end('등록 성공');
                });
            },
        },
        patch: {},
        put: {
            '/users': (req, res) => {
                const key = req.url.split('/')[2];
                let body = '';
                req.on('data', (data) => {
                    body += data;
                });
                return res.on('end', () => {
                    console.log('PUT 본문(Body):', body);
                    users[key] = JSON.parse(body).name;
                    return res.end(JSON.stringify(users));
                });
            },
        },
        delete: {
            '/users': (req, res) => {
                const key = req.url.split('/')[2];
                delete users[key];
                return res.end(JSON.stringify(users));
            },
        },
    };
    
    const server = http.createServer((req,res) => {
      const matchedUrl = router[req.method.toLowerCase()][req.url]
      (matchedUrl || router[req.method.toLowerCase()]['*'])(req, res);
    }).listen(8085, () => {
        console.log('8085번 포트에서 서버 대기 중입니다.');
    });
    server.on('error', (err) => {
      console.error(err);
    });
Designed by Tistory.