-
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 메시지 단위는 배열이나 객체이다.
장점
- 텍스트로 이루어져 있어, 사람과 기계 모두 읽고 쓰기 쉽다.
- 프로그래밍 언어와 플랫폼에 독립적이므로, 서로 다른 시스템간에 객체를 교환하기 좋다.
- 자바스크립트 문법을 채용해서, 자바스크립트에서 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); });
'Node.js > 백엔드' 카테고리의 다른 글
AWS EC2로 Node.js 애플리케이션 배포하기(+ pm2) (0) 2020.03.05 (ppt슬라이드) Express로 서버 구축하기, Sequelize란? (0) 2020.01.31 What app.set function do (Express.js) (0) 2020.01.30 Node MySQL2 (0) 2020.01.30 노드 개념, 기능, 자바스트립트 (0) 2020.01.04