
10. sequelize 기능 실습
'sequelize' 라이브러리 설치
npm i sequelize
C:\yjcho\Node.js\Project\Server\db\database.js
경로에 해당 내용 추가/수정.
import {config} from '../config.js'; import SQ from 'sequelize'; const {host, user, database, password } = config.db; export const sequelize = new SQ.Sequelize(database, user, password, { host, dialect: 'mysql', logging: false, // log를 남기지 않겠다는 의미. }) |
C:\yjcho\Node.js\Project\Server\index.js
경로에 해당 내용 추가/수정.
import {sequelize } from './db/database.js' sequelize .sync().then(() => { const server = app.listen(config.host.port); initSocket(server); }); |
10-1. data/auth.js를 ORM으로 수정해보기
C:\yjcho\Node.js\Project\Server\data\auth.js
경로에 해당 내용 추가/수정.
import SQ from 'sequelize' import { sequelize } from '../db/database.js'; const DataTypes = SQ.DataTypes; //users 테이블 만들기 export const User = sequelize.define( 'user', { id:{ type:DataTypes.INTEGER, autoIncrement:true, allowNull:false, primaryKey:true }, username:{ type:DataTypes.STRING(45), allowNull: false, }, password:{ type:DataTypes.STRING(128), allowNull:false }, name:{ type:DataTypes.STRING(45), allowNull:false }, email:{ type:DataTypes.STRING(128), allowNull:false }, url:{ type:DataTypes.TEXT }, regdate:{ type: DataTypes.DATE, defaultValue: DataTypes.NOW } }, {timestamps: false} ) export async function findByUsername(username){ return User .findOne({where:{username}}) } export async function createUser(user){ return User .create(user).then((data)=>data.dataValues.id) } export async function findById(id){ return User .findByPk(id); } |
10-2. data/tweet.js를 ORM으로 수정해보기
C:\yjcho\Node.js\Project\Server\data\tweet.js
경로에 해당 내용 추가/수정.
import SQ from 'sequelize' import { sequelize } from '../db/database.js'; import { User } from './auth.js'; const DataTypes = SQ.DataTypes // tweets 테이블 만들기 export const Tweet = sequelize.define( 'tweet', { id:{ type:DataTypes.INTEGER, autoIncrement:true, allowNull:false, primaryKey:true }, text:{ type:DataTypes.TEXT, allowNull:false } }, ); Tweet .belongsTo(User ); // belongsTo(): join의 개념. Tweet과 User의 join. const INCLUDE_USER = { // join했을 때 보고싶은것만 뽑아오는 목록을 새롭게 정의. attributes: [ // attribute에는 '대괄호'의 포맷을 항상 유지해야 함. 'id', 'text', 'createdAt', 'userId', [ sequelize.col('user.name'), 'name' ], [ sequelize.col('user.username'), 'username' ], [ sequelize.col('user.url'), 'url' ], ], include: { // include 옵션: User과 belongsTo() 된 내용을 Join해서 보여줌. model: User, attributes: [ ], } } const ORDER_DESC = { // 시간을 기준으로 내림차순으로 가져오고 싶은 경우. order: [['createdAt', 'DESC']] } // 1) export async function getAll() { // userId의 1번이 누가썼는지를 알아야함! return Tweet.findAll({...INCLUDE_USER, ...ORDER_DESC} ) } // 2) export async function getAllByUsername(username) { return Tweet.findAll({ ...INCLUDE_USER, ...ORDER_DESC, include: { ...INCLUDE_USER.include, where: {username} } })}; // 3) export async function getById(id) { return Tweet.findOne({ where: {id}, ...INCLUDE_USER }); } // 4) export async function create(text, userId) { return Tweet.create({text,userId}).then((data)=>{ console.log(data); return data; }); } // 0510 // 5) export async function update(id, text) { return Tweet.findByPk(id, INCLUDE_USER).then((tweet) => {tweet.text=text; return tweet.save(); }); } // 6) export async function remove(id) { return Tweet.findByPk(id, INCLUDE_USER).then((tweet) => { tweet.destroy(); }); } |
10-3. postman으로 확인
1). getAll()


password가 그대로 노출되어 보안상의 문제가 발생할 수 있음.
수정 시:

2) username으로 user에서 정보를 찾아보기

3) id로 user에서 정보를 찾아보기

4) create하기


5) update하기

6) delete하기
