[Node.js] MySQL 테이블 사용하기
이제 MySQL에서 정의한 테이블을 시퀄라이즈에서도 정의해야 합니다.
users 테이블 comments 테이블
위의 테이블과 대응되는 User와 Comment 테이블을 만들어 테이블에 연결해봅시다. sequelize.define 메서드로 테이블명과 각 컬럼의 스펙을 입력합니다.
// models/user.js module.exports = (sequelize, DataTypes) =>{ return sequelize.define('user',{ name:{ type: DataTypes.STRING(20), allowNull: false, unique: true, }, age:{ type: DataTypes.INTEGER.UNSIGNED, allowNull: false, }, married:{ type: DataTypes.BOOLEAN, allowNull: false, }, comment:{ type: DataTypes.TEXT, allowNull: true, }, created_at:{ type: DataTypes.DATE, allowNull: false, defaultValue: DataTypes.NOW, }, },{ timestamps: false, }); };
시퀄라이즈는 알아서 id를 기본 키로 연결하므로 id 컬럼은 적어줄 필요가 없습니다.
//models/comment.js module.exports = (sequelize, DataTypes)=>{ return sequelize.define('comment', { comment: { type: DataTypes.STRING(100), allowNull: false, }, created_at: { type: DataTypes.DATE, allowNull: true, defaultValue: DataTypes.NOW, }, }, { timestamps: false, }); // commenter 컬럼은 일단 생략되어 있음... 추후에 설명 };
시퀄라이즈의 자료형은 MySQL의 표현과 조금 다릅니다. VARCHAR는 STRING, INT는 INTEGER, TINYINT는 BOOLEAN, DATETIME은 DATE로 적습니다.
define의 세 번째 인자는 테이블 옵션입니다. 만약 timestamps의 값이 true이면 시퀄라이즈는 createdAt과 updateAt 컬럼을 추가합니다. 로우가 생성될 때와 수정될 때의 시간이 자동으로 입력됩니다.
모델을 생성햤다면 models/index.js와 연결합니다.
// models/index.js //... db.sequelize = sequelize; db.Sequelize = Sequelize; db.User = require('./user')(sequelize,Sequelize); db.Comment = require('./comment')(sequelize,Sequelize); module.exports = db;
db라는 객체에 User와 Comment 모델을 담아두었습니다.
마지막으로 config 폴더 안의 config.json을 수정합니다.
// config/config.js { "development": { "username": "root", "password": "1234", "database": "nodejs", "host": "127.0.0.1", "dialect": "mysql", "operatorsAliases": false }, //...
테이블간의 관계를 정의할 수 있습니다. 예를들어 사용자 한 명은 댓글을 여러 개 작성할 수 있습니다. 하지만 댓글 하나에 사용자(작성자)가 여러 명일 수는 없습니다. 이러한 관계를 일대다(多) 관계라고합니다. 이 외에도 일대일 다(多)대다(多) 관계가 있습니다.
1:N은 시퀄라이즈에서 hasMany 메서드로 표현합니다. 로우 하나를 불러 올 때 연결된 comments 테이블의 로우들도 같이 불러올 수 있습니다. 반대로 belongsTo 메서드도 있습니다. comments 테이블의 로우를 불러올 때 연결된 users 테이블의 로우를 가져옵니다.
models/index.js에서 모델들을 연결해준 곳 밑에 추가로 넣어줍니다.
// models/index.js //... db.sequelize = sequelize; db.Sequelize = Sequelize; db.User = require('./user')(sequelize,Sequelize); db.Comment = require('./comment')(sequelize,Sequelize); db.User.hasMany(db.Comment, {foreignKey:'commenter', sourceKey: 'id'}); db.Comment.belongsTo(db.User, {foreignKey:'commenter', targetKey: 'id'}); module.exports = db;
시퀄라이즈는 방금 정의한 대로 테이블 간의 관계를 파악합니다. 다음으로 npm start 명령어로 서버를 시작하면 메세지가 뜹니다.
npm start 이후 콘솔 메시지
SQL문을 자동으로 만들어 주는것을 확인할 수 있습니다.
이와 비슷한 방법으로 1:1 관계에서는 hasOne 메서드와 belongsTo 메서드를 사용하고, N:M 관계에서는 belongsToMany 메서드를 사용합니다. 특히, N:M 관계에서는 조회 할 때 여러 단계를 거쳐서 합니다.
시퀄라이즈로 CRUD 작업을 하기 위해서는 시퀄라이즈의 쿼리에 대해 알아야 합니다. 여러가지 예시를 알아봅시다.
// INSERT INTO nodejs.users(name, age, married, comment) VALUES ('zero', 24, 0, '자기소개1'); const { User } = require('../models') User.create({ name:'zero', age:24, married:false, comment:'자기소개1', });
// SELECT * FROM nodejs.users; User.findAll({}); // SELECT * FROM nodejs.users LIMIT 1; User.findOne({}); // SELECT name, married FROM nodejs.users; User.findAll({ attributes: ['name','married']; }); // SELECT name, age FROM nodejs.users WHERE married=1 AND age > 30; const{ User, Sequelize: { Op } }= require('../models'); User.findAll({ attributes: ['name','age'], where:{ married: 1, age: { [Op.gt]:30 }, }, }); // SELECT id, name FROM users WHERE married=0 AND age > 30; const{ User, Sequelize: { Op } }= require('../models'); User.findAll({ attributes: ['id','name'], where:{ [Op.or]:[{married: 0}, {age: { [Op.gt]: 30 } }], }, }); // SELECT id, name FROM users ORDER BY age DESC; User.findAll({ attributes: ['id','name'], order:[['age','DESC']], }); // SELECT id, name FROM users ORDER BY age DESC LIMIT 1; User.findAll({ attributes: ['id','name'], order:[['age','DESC']], limit: 1, }); // SELECT id, name FROM users ORDER BY age DESC LIMIT 1 OFFSET 1; User.findAll({ attributes: ['id','name'], order:[['age','DESC']], limit: 1, offset: 1, });
// UPDATE nodejs.users SET comment = '바꿀내용' WHERE id=2; User.update({ comment:'바꿀내용', },{ where: {id: 2}, });
// DELETE FROM nodejs.users WHERE id=2; User.destroy({ where: {id:2}, });
출처 : Node.js 교과서
from http://badaturtle93.tistory.com/40 by ccl(A) rewrite - 2020-03-11 01:20:06
댓글
댓글 쓰기