본문 바로가기

4. Node.js | React.js

5/11(목) IT K-DT(49일차) / twitter 예제(5)

 

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하기