1. Koa : Koa는 웹 응용 프로그램 및 API를위한 작고 표현력이 뛰어나며 견고한 기반을 목표로하는 Express 팀의 새로운 웹 프레임 워크입니다. 비동기 함수를 활용하여 Koa는 콜백을 제거하고 오류 처리를 크게 향상시킬 수 있습니다. Koa는 코어 내에 미들웨어를 번들로 제공하지 않으며 서버를 빠르고 재미있게 작성할 수있는 우아한 일련의 메소드를 제공합니다.
웹사이트 : https://koajs.com/
NPM 소개 : https://www.npmjs.com/package/koa
GITHUB : https://github.com/koajs/koa
설치조건 : Koa requires node v7.6.0 or higher for ES2015 and async function support.
-> 노드 버전 7.6.0 이상 또는 ES6 이상이 필요하다.
mkdir blog
cd blog
mkdir blog-backend
cd blog-backend
npm init
yarn add koa koa-router koa-bodyparser
// 아래는 옵션
// 코드변경시 자동으로 서버 재부팅
yarn add nodemon
// 문법검사
yarn add eslint
nodemon 설치시 아래코드를 추가
package.json
"scripts": {
"start": "node src",
"start:dev": "nodemon --watch src/ src/index.js"
}
yarn start:dev 라고 입력하고 코드변경후 저장시 자동으로 재부팅됨
src/index.js
const Koa = require('koa');
const Router = require('koa-router');
const bodyParser = require('koa-bodyparser');
const api = require('./api');
const app = new Koa();
const router = new Router();
// 라우터 설정
router.use('/api', api.routes()); // api 라우트 적용
// 라우터 적용 전에 bodyParser 적용
app.use(bodyParser());
// app 인스턴스에 라우터 적용
app.use(router.routes()).use(router.allowedMethods());
app.listen(4000, () => {
console.log('listening to port 4000');
});
src/api/index.js
const Router = require('koa-router');
const posts = require('./posts');
const api = new Router();
api.use('/posts', posts.routes());
// 라우터를 내보냅니다.
module.exports = api;
src/api/posts/index.js
const Router = require('koa-router');
const postsCtrl = require('./posts.ctrl');
const posts = new Router();
posts.get('/', postsCtrl.list);
posts.post('/', postsCtrl.write);
posts.get('/:id', postsCtrl.read);
posts.delete('/:id', postsCtrl.remove);
posts.put('/:id', postsCtrl.replace);
posts.patch('/:id', postsCtrl.update);
module.exports = posts;
src/api/posts/posts.ctrl.js
let postId = 1; // id의 초깃값입니다
const posts = [
{
id: 1,
title: '제목',
body: '내용'
}
];
/* 포스트 작성
POST /api/posts
{ title, body } */
exports.write = (ctx) => {
// REST API의 request body는 ctx.request.body에서 조회할 수 있습니다.
const {
title,
body
} = ctx.request.body;
postId += 1; // 기존의 postId 값에 1을 더합니다
const post = { id: postId, title, body };
posts.push(post);
ctx.body = post;
};
/* 포스트 목록 조회
GET /api/posts */
exports.list = (ctx) => {
ctx.body = posts;
};
/* 특정 포스트 조회
GET /api/posts/:id */
exports.read = (ctx) => {
const { id } = ctx.params;
// 주어진 id 값으로 포스트를 찾습니다
// 파라미터로 받아온 값은 문자열 형식이니, 파라미터를 숫자로 변환하거나,
// 비교할 p.id 값을 문자열로 변경해야 합니다.
const post = posts.find(p => p.id.toString() === id);
// 포스트가 없을 경우 오류를 반환합니다.
if (!post) {
ctx.status = 404;
ctx.body = {
message: '포스트가 존재하지 않습니다.'
};
return;
}
ctx.body = post;
};
/* 특정 포스트 제거
DELETE /api/posts/:id */
exports.remove = (ctx) => {
const { id } = ctx.params;
// 해당 id를 가진 post가 몇 번째인지 확인합니다
const index = posts.findIndex(p => p.id.toString() === id);
// 포스트가 없을 경우 오류를 반환합니다.
if (index === -1) {
ctx.status = 404;
ctx.body = {
message: '포스트가 존재하지 않습니다.'
};
return;
}
// index 번째 아이템을 제거합니다.
posts.splice(index, 1);
ctx.status = 204; // No Content
};
/* 포스트 수정 (교체)
PUT /api/posts/:id
{ title, body } */
exports.replace = (ctx) => {
// PUT 메서드는 전체 포스트 정보를 입력하여 데이터를 통째로 교체할 때 사용됩니다.
const { id } = ctx.params;
// 해당 id를 가진 post가 몇 번째인지 확인합니다
const index = posts.findIndex(p => p.id.toString() === id);
// 포스트가 없을 경우 오류를 반환합니다.
if (index === -1) {
ctx.status = 404;
ctx.body = {
message: '포스트가 존재하지 않습니다.'
};
return;
}
// 전체 객체를 덮어 씌웁니다.
// 따라서 id를 제외한 기존 정보를 날리고, 객체를 새로 생성합니다.
posts[index] = {
id,
...ctx.request.body
};
ctx.body = posts[index];
};
/* 포스트 수정 (특정 필드 변경)
PATCH /api/posts/:id
{ title, body } */
exports.update = (ctx) => {
// PATCH 메서드는 주어진 필드만 교체합니다.
const { id } = ctx.params;
// 해당 id를 가진 post가 몇 번째인지 확인합니다
const index = posts.findIndex(p => p.id.toString() === id);
// 포스트가 없을 경우 오류를 반환합니다.
if (index === -1) {
ctx.status = 404;
ctx.body = {
message: '포스트가 존재하지 않습니다.'
};
return;
}
// 기존 값에 정보를 덮어 씌웁니다.
posts[index] = {
...posts[index],
...ctx.request.body
};
ctx.body = posts[index];
};
포스트맨 : https://www.getpostman.com/
결과)
반응형
'WEB > REACT' 카테고리의 다른 글
16. [토이프로젝트 따라하기] 블로그-1 (0) | 2019.07.15 |
---|---|
15. MongoDB & Mongoose (0) | 2019.07.14 |
13. 코드 스플리팅 (0) | 2019.07.13 |
12. react-router로 SPA (0) | 2019.07.12 |
11. 웹 요청 (0) | 2019.07.12 |