자바스크립트 후려치기 #1 가상돔
Sequelize #1 시작하기 (for MySQL)
2019-12-21
Explanation
최근에 간단한 서버를 개발할 일이 생겨서, Sequelize를 사용해서 ORM으로 개발을 하고 있는데요.
그래서 겸사겸사 Sequelize를 사용하는 방법에 대해 간단하게 정리해보려 합니다.
그리고 사용한 예제 코드를 모두 다 적기에는 너무 많아서 아래의 깃허브에서 확인 하실 수 있습니다.
https://github.com/falsy/blog-post-example/tree/master/sequelize-quick-start
아직 저도 sequelize를 사용한 지 며칠 되지 않아 잘못된 설명이 있을 수 있습니다.
가볍게 봐주시고, 잘못된 부분은 댓글로 알려주시면 감사할 거 같아요 :)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// package.json ... "dependencies": { "@koa/cors": "^3.0.0", "koa": "^2.7.0", "koa-body": "^4.1.0", "koa-logger": "^3.2.0", "koa-router": "^7.4.0", "mysql2": "^2.0.2", "sequelize": "^5.21.3" } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// index.js const koa = require('koa'); const cors = require('@koa/cors'); const koaBody = require('koa-body'); const logger = require('koa-logger'); const router = require('./src/router'); const run = async () => { const app = new koa(); const _router = router(router); app.use(cors()); app.use(logger()); app.use(koaBody()); app.use(_router.routes()); const port = 7777; const server = await app.listen(port); console.log(`server run ${port}`); return server; } run(); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// /db/index.js const Sequelize = require('sequelize'); const model = require('../model'); const sequelize = new Sequelize('sequelize' , 'root', '1234', { host: 'localhost', dialect: 'mysql', define: { timestamps: false } }); const models = model(Sequelize, sequelize); module.exports = { Sequelize, sequelize, models }; |
여기에서 new Sequelize() 선언에서 첫번째 인자는 DB이름, 두번째는 사용자 이름, 세번째는 비밀번호, 그리고 마지막에서 host는 이름 그대로 호스트 정보를 입력합니다.
그리고 dialect 에서 저는 MySQL을 사용하기 때문에 ‘mysql’을 적어 주었고 그리고 define에서 timestamps 속성은 기본적으로 sequelize에서 createdAt, updatedAt 컬럼을 만들어주는데, 그 설정을 false로 한 거에요.
1 2 3 4 |
new Sequelize('DB Name' , 'User', 'Password', { host: 'localhost', // 디비 호스트 dialect: 'mysql' // 디비 종류 }); |
그리고 model을 import했는데, 다음으로 model 폴더에 테이블 모델을 정의해줄거에요.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// /model/boards.js module.exports = (Sequelize, sequelize) => { return sequelize.define('boards', { id: { type: Sequelize.INTEGER(11).UNSIGNED, primaryKey: true, autoIncrement: true, allowNull: false }, name: { type: Sequelize.STRING(100), allowNull: false }, content: { type: Sequelize.TEXT, allowNull: false }, created_at: { type: Sequelize.DATE, defaultValue: Sequelize.fn('now'), allowNull: false } }); |
저는 ‘boards’라는 테이블에 대한 모델값을 입력해주었어요.
아직 잘 모르는데, 저는 위와 같은 설정으로 미리 로컬 데이터베이스에 ‘sequelize’ 라는 DB를 만들고, ‘boards’라는 테이블을 정의한 후에 위와 같이 컬럼을 정의해서 사용했는데요.
위와 같이 설정을 하면 sequelize에서 테이블을 직접 만들어서 사용하기도 하는거 같아요, 그러면 마이그레이션하거나 할때 편하겠죠??
이 부분은 다음에 직접 해보고 다시 포스팅하도록 하겠습니다~
+ 2019-12-30 추가
위에 이야기한 것처럼 모델을 정의해 놓고 sync() 메서드를 사용하면 해당 모델의 테이블이 없다면 직접 테이블을 만들어 준답니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
// /model/boards.js module.exports = (Sequelize, sequelize) => { const boards = sequelize.define('boards', { id: { type: Sequelize.INTEGER(11).UNSIGNED, primaryKey: true, autoIncrement: true, allowNull: false }, name: { type: Sequelize.STRING(100), allowNull: false }, content: { type: Sequelize.TEXT, allowNull: false }, created_at: { type: Sequelize.DATE, defaultValue: Sequelize.fn('now'), allowNull: false } }); boards.sync(); return boards; }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// /router/index.js const Router = require('koa-router'); const db = require('../db'); module.exports = () => { const router = new Router(); const models = db.models; router.get('/list', async (ctx) => { const results = await models.boards.findAll().map(({ id, name, content, created_at}) => { return { id, name, content, created_at }; }); ctx.body = { results }; }); return router; }; |
대략 위에서(3번) 정의한 db를 import하고 거기에 정의한 모델을 불러와서 사용하는데요.
저는 앞서 정의한 boards 모델을 findAll() 메서드를 통해 디비로 데이터를 요청한거에요.
1 |
db.models.boards.findAll(); |
위 메서드를 SQL Query로 바꾸면
1 |
SELECT `id`, `name`, `content`, `created_at` FROM `boards` AS `boards`; |
위와 같답니다.
대략 기본적인 시작은 위 내용인거 같고 간단하게 사용해본 쿼리 설정에 대해 적어보려 합니다.
만약에 위 예제 코드에서 id, name, content, create_at 컬럼이 있는데 이중에 name 값만 가져오고 싶다 하면,
attributes 속성을 사용하면 된답니다. (SQL Query에선 셀렉트 절이라고 하죠?)
1 2 3 |
db.models.boards.findAll({ attributes: ['name'] }); |
그리고 Query에서 웨얼절이죠? 뭐라고 말해야할 지 어렵네요.. 쿼리할 대상을 필터한다고 해야 할까요..?
대략 위 예제코드에서 id가 10보다 큰 raw 데이터만 받아 온다고하면.
1 2 3 4 5 6 7 8 9 10 |
const Sequelize = require('sequelize'); const Op = Sequelize.Op; db.models.boards.findAll({ where: { id: { [Op.gt]: 10 } } }); |
여기서는 역시 이름 그대로 where 라는 속성을 사용하면 되는데요, 그다음 key 값이 where할 대상이라고 해야 할까요? 그리고 그 객체 벨류가 속성명과 속성값이랍니다.
(그냥 그래 보이는 내용을 글로 적으니 더 이상하네요…)
그리고 Op라는 Sequelize의 값을 사용하죠? gt는 초과를 의미하고 그 밖의 내용들은 역시 Sequelize 공홈 메뉴얼을 참고하시면 좋을 거 같아요.
https://sequelize.org/master/manual/querying.html
where 속성에서 또 or도 많이 사용되지 않을까 싶어요.
예를 들면 id값이 10, 20, 30인 raw 데이터만 받아오고 싶다면,
1 2 3 4 5 6 7 8 9 10 |
const Sequelize = require('sequelize'); const Op = Sequelize.Op; db.models.boards.findAll({ where: { id: { [Op.or]: [10, 20, 30] } } }); |
limit, 예를 들면 최대 10개의 raw 데이터만 받아온다면
1 2 3 |
db.models.boards.findAll({ limit: 10 }); |
order, SQL에서 오더바이절이라고 부르는거 같아요, raw 데이터의 정렬?? 기준을 의미해요
ASC는 오름차순, DESC는 내림차순입니다.
1 2 3 |
db.models.boards.findAll({ order: [['id', 'ASC']] }); |