728x90
1. model/index.js
const Sequelize = require("sequelize");
// config.js에서 module.exports = config 내보내기를 하고
// require("../config/config") 가져오면 내보낸 객체가 가져와진다.
const { config } = require("../config/config");
const User = require("./users");
const Post = require("./post");
//시퀄라이즈 객체 생성 옵션을 적용한 객체 만들어 놓는다.
const sequelize = new Sequelize(
config.dev.database,
config.dev.username,
config.dev.password,
config.dev
);
//내보내기 위해서 빈객체 만든것
const db = {};
// 그 빈객체에 sequelize 키값으로 시퀄라이즈 객체 만든것을 넣어준다.
// User도 내보내서 사용할 예정리아
db.sequelize = sequelize;
db.User = User;
db.Post = Post;
//테이블 생성
User.init(sequelize);
Post.init(sequelize);
User.associate(db);
Post.associate(db);
// 보내고 싶은 값을 다 넣은 객체를 내보낸것
module.exports = db;
2. model/post.js
const Sequelize = require("sequelize");
class Post extends Sequelize.Model {
static init(db) {
return super.init(
{
msg: {
type: Sequelize.STRING(100),
allowNull: false,
},
},
{
sequelize: db,
timestamps: true,
modelName: "Post",
tableName: "posts",
paranoid: false,
charset: "utf8",
collate: "utf8_general_ci",
}
);
}
static associate(db) {
// belongsTo 함수를 사용해서 User 테이블과 연결 이 테이블이 자식
// belongsTo 첫번째 매개변수는 연결될 테이블 이름
// 유저의 id가 타겟이고 연결해주는 키는 user_id이다
db.Post.belongsTo(db.User, { foreignKey: "user_id", targetKey: "id" });
}
}
module.exports = Post;
3. model/users.js
const Sequelize = require("sequelize");
// User 클래스에서 시퀄라이즈 안에 모듈 객체의 기능을 상속시켜주기위해서
// User 클래스에 Sequelize.Model 기능을 준다.
class User extends Sequelize.Model {
// static init 메서드에서 테이블을 생성해 주는건데
// 사용하면 테이블을 생성 및 연결까지(매핑) 구성
static init(sequelize) {
// 상속받은 함수를 쓰려면 super 사용
// init 함수의 첫번째 매개변수가 테이블의 구성
// 컬럼이 어떤게 있는지 그 타입과 속성이 뭔지
// 여기에 정리해서 테이블 생성 해줌 매핑해줌
// https://pjt3591oo.github.io/sequelizejs_translate/build/html/CoreConcepts/DateTypes.html
// 여기에 테이블 자료형 타입들이 정리되있다.
return super.init(
{
//name 컬럼 하나
name: {
// 시퀄라이즈 안에 있는 데이터 타입을 사용해야한다. 꼭
// 그래서 가져온 시퀄라이즈 모듈 안에 있는 STRING 객체를 사용
// 여기서 한거는 컬럼의 데이터 타입을 정한것
type: Sequelize.STRING(20),
// 이값이 무조건 있어야 하는지 false면 이 컬럼값이 없으면 안된다고 표시하는것
allowNull: false,
// 기본키로 설정을 할것인지, 기본키 하나는 무조건 있어야 한다. 중복되지 않는키
// primaryKey: true,
// 고유키 : 겹치지 않게
// 여기서는 컬럼에 name 값이 겹치지 않도록 사용
// 주민번호나, 전화번호 등 겹치지 않는 값들 혹여나 안겹치게
// 중복되지 않는키, 우리가 쓰고싶을때 쓰면됨
unique: true,
},
age: {
//나이의 값은 숫자로 받을거니까
type: Sequelize.INTEGER,
allowNull: false,
},
msg: {
// 문자로 받을거니까
type: Sequelize.TEXT,
// 굳이 안써도 된다.
allowNull: true,
},
// 생성시간이 필요하다 할때 사용하면된다. 이 구문이나 테이블자체에
// timestamps : true 설정
// created_at: {
// // 시간 타입으로 받고
// type: Sequelize.DATE,
// allowNull: false,
// // 디폴트값 설정
// defaultValue: Sequelize.NOW,
// },
},
{
// sequelize 이건 위에서 매개변수 쓴걸 연결 시켜주는 옵션
sequelize,
// created_at을 직접 만드는것보다 장점 : 업데이트된 시간도 표시해줌
// created_at 과 updated_at도 생겨서 우리가 수정했을때 시간도 같이 기록해줌
timestamps: true,
// underscored 시퀄라이즈는 기본적으로 카멜표기법이다.
// 스네이크 표기법으로 바꿔주는 옵션
underscored: true, // createdAt, created_at 으로 바꿔줌
// 얘는 모델의 이름을 설정할수 있다.
modelName: "User", // 관계형으로 구성할때 사용한다.
tableName: "Users", //데이터베이스의 테이블의 이름을 설정한다.
// paranoid true로 설정하면 deleted At이 값에 살제한 시간이 추가된다.
paranoid: false,
// charset, collate : 각각 밑에 처럼 설정해주면 한글이 입력가능하게 되고
// 이모티콘 쓸거면 utf8
// 가나다 ㄱ ㅏ ㄴ ㅏ ㄷ ㅏ
charset: "utf8",
collate: "utf8_general_ci",
}
);
}
// (foreign key) 외래키
static associate(db) {
// 1:N 관계 (hasMany, belongsTo)
// 시퀄라이즈에서 1:N 관계를 hasMany 함수로 정의를 한다.
// hasMany함수를 이용해서 테이블의 관계를 정의해준다.
// 첫번째 매개변수 연결할 테이블
// sorceKey User테이블안에 무슨 키를 foreignKey와 연결할지
// hasMany() 첫번째로 넘겨준 테이블이 foreignKey 연결되고 foreignKey 이름은 user_id이다.
db.User.hasMany(db.Post, { foreignKey: "user_id", sorceKey: "id" });
//여러개 쓸거면 아래에다 계속 쓰면됨
// db.User.hasMany(db.Post, { foreignKey: "user_id", sorceKey: "id" });
}
}
module.exports = User;
4. app.js
//시퀄라이즈 구성 해보자 연결 및 테이블 생성 여기가 처음 매핑
// sync 함수는 데이터 베이스 동기화 하는 사용 필요한 테이블을 생성해준다.
// 필요한 테이블들이 다 생기고 매핑된다. 절대 어긋날 일이 없다.
// 테이블의 내용이 다르면 오류를 뱉어낸다.
// CREATE TABLE 문이 여기서 실행된다는것
// force 강제로 초기화 시킬것인지 (테이블 내용을 다 비워줄것인지)
sequelize
.sync({ force: false })
.then(() => {
//연결 성공
console.log("DB연결 성공");
})
//연결 실패
.catch((err) => {
console.log(err);
});
728x90
'개발 > node.js' 카테고리의 다른 글
sequelize Op연산자 (0) | 2022.08.25 |
---|---|
[Node.js] mysql FOREIGN KEY (0) | 2022.08.18 |
[Node.js] 로그인 만들기 (0) | 2022.08.18 |
[Node.js] crypto, bcrypto (0) | 2022.08.17 |
[Node.js] access token, refresh token 을 활용하여 로그인 유지시키기 (0) | 2022.08.16 |