1. mac mysql설치하기(v.8)
2. mysql설치 후 node 패키지에 라이브러리 설치하기
$ npm i sequelize sequelize-cli mysql2
mysql2 > node와 mysql을 연결해주는 드라이버
sequelize > javscript를 sql문으로 변환
3. sequelize 세팅
$ npx sequelize init
프로젝트에 config, models, migration, seeders폴더가 생성됨
config.js에서 자신이 만든 mysql 계정정보(username, pw)와 db이름을 입력한다
models/index.js를 최신 코드로 수정해준다.
'use strict';
const Sequelize = require('sequelize');
// env : development, test, production 상황에 맞춰 설정 (현재 development 상태)
const env = process.env.NODE_ENV || 'development';
const config = require('../config/config')[env];
const db = {};
const sequelize = new Sequelize(config.database, config,username, config.password, config);
Object.keys(db).forEach(modelName => {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;
user테이블 생성
models/user.js 파일 생성 후 user테이블을 선언해준다.
module.exports = (sequelize, DataTypes) => {
const User = sequelize.define('User', { // MySql에는 users테이블 생성
// id: {}, // mysql에서 자동으로 넣어줌
email: {},
nickname: {},
password: {},
}, {
charset: 'utf8',
collate: 'utf8_general_ci', // 한글 저장 (이모티콘도 저장하려면 mb4)
});
User.associate = (db) => {};
return User;
}
그 후에 다음과 같이 칼럼 별로 설정을 해주면 끝
module.exports = (sequelize, DataTypes) => {
const User = sequelize.define('User', { // MySql에는 users테이블 생성
// id: {}, // mysql에서 자동으로 넣어줌
email: {
type: DataTypes.STRING(30),
allowNull: false, // 필수 (NotNull)
unique: true, // 고유 값
},
nickname: {
type: DataTypes.STRING(30),
allowNull: false,
},
password: {
type: DataTypes.STRING(100),
allowNull: false,
},
}, {
charset: 'utf8',
collate: 'utf8_general_ci', // 한글 저장
});
User.associate = (db) => {};
return User;
}
4. 연관관계 설정하기
user와 post 엔티티가 있다.
한 user는 여러개의 게시글을 올릴 수 있으므로 user와 post의 관계는 1:N이다.
models/user.js
module.exports = (sequelize, DataTypes) => {
const User = sequelize.define('User', { // MySql에는 users테이블 생성
// id: {}, // mysql에서 자동으로 넣어줌
email: {
type: DataTypes.STRING(30),
allowNull: false, // 필수 (NotNull)
unique: true, // 고유 값
},
nickname: {
type: DataTypes.STRING(30),
allowNull: false,
},
password: {
type: DataTypes.STRING(100),
allowNull: false,
},
}, {
charset: 'utf8',
collate: 'utf8_general_ci', // 한글 저장
});
// 관계 설정
User.associate = (db) => {
db.User.hasMany(db.Post)
};
return User;
}
models/post.js
module.exports = (sequelize, DataTypes) => {
const Post = sequelize.define('Post', {
// mysql에 id 기본적으로 세팅되어있음.
content: {
type: DataTypes.TEXT,
allowNull: false,
},
}, {
charset: 'utf8mb4',
collate: 'utf8mb4_general_ci', // 한글, 이모티콘(mb4) 저장
});
Post.associate = (db) => {
db.Post.hasMany(db.User);
};
return Post;
}
이와 같이 설정해주면 된다.
5. 다대다 관계 설정하기
JPA에서는 다대다 매핑을 1:N N:1로 풀어서 설정을 하였지만 노드 시퀄라이즈에서는 각 테이블에 belongsToMany를 해주면 중간 테이블이 자동 생성이 된다.
- through : 중간 테이블 이름 설정
- as : 테이블 호출 이름 설정 ( as: "Likers" 하면 PostId -> LikersId로 바뀜),
- foreignKey : 컬럼 이름 설정
물론, 중간 테이블에 다른 칼럼을 추가로 넣고싶으면 따로 엔티티를 선언해서 연결해주면 된다. (check)
models/user.js
module.exports = (sequelize, DataTypes) => {
const User = sequelize.define('User', { // MySql에는 users테이블 생성
// id: {}, // mysql에서 자동으로 넣어줌
email: {
type: DataTypes.STRING(30),
allowNull: false, // 필수 (NotNull)
unique: true, // 고유 값
},
nickname: {
type: DataTypes.STRING(30),
allowNull: false,
},
password: {
type: DataTypes.STRING(100),
allowNull: false,
},
}, {
charset: 'utf8',
collate: 'utf8_general_ci', // 한글 저장
});
User.associate = (db) => {
db.User.hasMany(db.Post);
// sequelize에서 Like테이블 자동 생성
db.User.belongsToMany(db.Post, { through: 'Like', as: 'Likers' }); // 좋아요 테이블 1:N - like - N:1 / as: db 이름 설정
};
return User;
}
models/post.js
module.exports = (sequelize, DataTypes) => {
const Post = sequelize.define('Post', {
// mysql에 id 기본적으로 세팅되어있음.
content: {
type: DataTypes.TEXT,
allowNull: false,
},
}, {
charset: 'utf8mb4',
collate: 'utf8mb4_general_ci', // 한글, 이모티콘(mb4) 저장
});
Post.associate = (db) => {
db.Post.belongsTo(db.User);
db.Post.belongsToMany(db.User, { through: 'Like', as: 'Liked' }); // 좋아요 테이블 1:N - like - N:1
};
return Post;
}
6. 서버 실행
설정 완료 후 models/index.js에 해당 파일들을 불러온다.
'use strict';
const Sequelize = require('sequelize');
const env = process.env.NODE_ENV || 'development';
const config = require('../config/config')[env];
const db = {};
const sequelize = new Sequelize(config.database, config,username, config.password, config);
db.Post = require('./post')(sequelize, Sequelize);
db.User = require('./user')(sequelize, Sequelize);
Object.keys(db).forEach(modelName => {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;
app.js에 db sequelize를 한다
const db = require('./models');
db.sequelize.sync()
.then(() => {
console.log('db 연결 성공');
})
.cathch(console.error);
서버를 실행기전에 해당 명령어 실행 (db 실행)
$ npx sequelize db:create
'Dot Programming > Node.js' 카테고리의 다른 글
[Node.js] Passport로 로그인 구현하기 (0) | 2021.01.28 |
---|---|
[Node.js] Cors 설정 ( credentials ) (0) | 2021.01.28 |