⇒sql을 편리하게 js에서 사용할 수 있도록 만들어주는 라이브러리다.
기존에 SQL문으로 query 를 써서 보내는 방식이 아닌 js문법으로 sql을 조작 할 수 있다.
// 시퀄라이즈 ORM (객체관계 매핑)
// 객체와 데이터 베이스를 ORM 라이브러리가 매핑을 시켜주어서 자바스크립트 구문으로 SQL을 제어할 수 있다.
// 자바스크립트로만 sql작업을 할 수 있도록 도와주는 라이브러리
const e = require("express");
const path = require("path");
const dot = require("dotenv").config();
const { sequelize, User, Post } = require("./models");
// 설치할 모듈은 express,ejs,sequelize mysql2
// 서버 객체 만들고
// 등등
const app = e();
app.set("views", path.join(__dirname, "page"));
app.set("view engine", "ejs");
app.use(e.urlencoded({ extended: false }));
// 시퀄라이즈 구성 연결 매핑
// sync함수는 데이터베이스를 동기화 시켜주는 메서드
// true일때는 초기화가 된다.
// false 일때는 초기화 안됨
sequelize
.sync({ focus: false })
.then(() => {
// 연결 성공
console.log("연결 성공");
})
.catch((err) => {
console.log(err);
// 연결실패
});
app.get("/", (req, res) => {
res.render("create");
});
app.post("/create", (req, res) => {
const { name, age, msg } = req.body;
// create insert 문을 실행 시켜주는 메서드
// 매개변수로 컬럼의 내용을 객체로 만들어서 전달
User.create({
// name 컬럼의 값
name: name,
// age 컬럼의 값
age: age,
// msg 컬럼의 값
message: msg,
})
.then(() => {})
.catch((err) => {
console.log("app create", err);
});
res.send("값 추가");
});
app.get("/main", (req, res) => {
// findAll메서드에 매개변수로 검색 조건을 객체로 추가 할 수 있다.
User.findAll()
.then((e) => {
res.render("main", { data: e });
})
.catch((err) => {
console.log(err);
});
});
app.post("/create_post", (req, res) => {
const { name, value } = req.body;
console.log(name, value);
// 한개의 값을 조회 메서드
User.findOne({
// 검색 조건 추가
where: { name: name },
}).then((e) => {
Post.create({
msg: value,
user_id: e.id,
});
});
res.send();
});
app.get("/view/:name", (req, res) => {
// 유저를 조회하고 가지고 있는 글을 볼거임
User.findOne({
where: { name: req.params.name },
// 관계형으로 불러온 값을 다 풀어서 볼수가 있다.
// raw:true,
// 해당 유저의 id로 참조된 user_id가 있는 post테이블의 값을 같이 조회한다.
include: [
// 조회할 모듈 post 모델
{ model: Post },
],
}).then((e) => {
e.dataValues.Posts = e.dataValues.Posts.map((a) => {
return a.dataValues;
});
const Posts = e.dataValues;
console.log(Posts);
res.render("view", { data: Posts });
});
});
app.listen(8080, (req, res) => {
console.log("성공했구나 이녀석");
});
sequelize
.sync({ focus: false })
.then(() => {
// 연결 성공
console.log("연결 성공");
})
.catch((err) => {
console.log(err);
// 연결실패
});
app.post("/create", (req, res) => {
const { name, age, msg } = req.body;
// create insert 문을 실행 시켜주는 메서드
// 매개변수로 컬럼의 내용을 객체로 만들어서 전달
User.create({
// name 컬럼의 값
name: name,
// age 컬럼의 값
age: age,
// msg 컬럼의 값
message: msg,
})
.then(() => {})
.catch((err) => {
console.log("app create", err);
});
res.send("값 추가");
});
app.get("/main", (req, res) => {
// findAll메서드에 매개변수로 검색 조건을 객체로 추가 할 수 있다.
User.findAll()
.then((e) => {
res.render("main", { data: e });
})
.catch((err) => {
console.log(err);
});
});
app.post("/create_post", (req, res) => {
const { name, value } = req.body;
console.log(name, value);
// 한개의 값을 조회 메서드
User.findOne({
// 검색 조건 추가
where: { name: name },
}).then((e) => {
Post.create({
msg: value,
user_id: e.id,
});
});
res.send();
});
app.get("/view/:name", (req, res) => {
// 유저를 조회하고 가지고 있는 글을 볼거임
User.findOne({
where: { name: req.params.name },
// 관계형으로 불러온 값을 다 풀어서 볼수가 있다.
// raw:true,
// 해당 유저의 id로 참조된 user_id가 있는 post테이블의 값을 같이 조회한다.
include: [
// 조회할 모듈 post 모델
{ model: Post },
],
}).then((e) => {
e.dataValues.Posts = e.dataValues.Posts.map((a) => {
return a.dataValues;
});
const Posts = e.dataValues;
console.log(Posts);
res.render("view", { data: Posts });
});
});
const config = {
dev: {
username: process.env.USERNAME,
password: process.env.PASSWORD,
database: process.env.DATABASE,
host: process.env.HOST,
dialect: "mysql",
},
};
module.exports = config;
const Sequelize = require("sequelize");
const config = require("./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 = {};
db.sequelize = _sequelize;
db.User = User;
db.Post = Post;
// 테이블을 초기화 하는 부분
User.init(_sequelize);
Post.init(_sequelize);
console.log('asd')
User.associate(db)
Post.associate(db)
module.exports = db;
const Sequelize = require("sequelize");
class Post extends Sequelize.Model {
static init(sequelize) {
return super.init(
{
msg: { type: Sequelize.STRING(100), allowNull: false },
},
{
sequelize,
timestamps: true,
modelName: "Post",
tableName: "posts",
charset: "utf8",
collate: "utf8_general_ci",
}
);
}
static associate(db) {
// 1:N 예
// 1:N 관계
// 시퀄라이즈에서 1:N관계를 hasMany 메서드로 정의해준다.
// sourceKey: user테이블 안에 어떤키를 foreignKey와 연결해줄지.
// hasMany 메서드의 첫번째 매개변수 넘긴 테이블이 foreignKey에 연결이되고 이름은 user_id다.
// belongsTo 메서드를 사용해서 user에 id를 foreignKey로 연결한다.
// 유저의 id가 따라갈 키 참조키는 user_id
db.Post.belongsTo(db.User, { foreignKey: "user_id", targetKey: "id" });
}
}
module.exports = Post;
const Sequelize = require("sequelize");
// user 클래스에 시퀄리아즈 안의 model 클래스를 상속 시켜준다.
class User extends Sequelize.Model {
static init(sequelize) {
// super 상속받은 부모의 함수를 실행 init 실행시켜서 반환
// init 메서드는 첫번쨰 매개변수로 컬럼에 대한 설정값이 들어가고
// 두번째 매개변수로 테이블의 자체 설정 값이 들어간다.
return super.init(
{
// 컬럼에 대한 설정
// name 컬럼
// VARCHAR => STRING으로
// allowNull:null을 혀용할지
// unique:고유키로 사용할 것인지 중복되지 않는 값.
// primaryKey:프라이머리키 설정
name: {
type: Sequelize.STRING(20),
allowNull: false,
unique: true,
primaryKey: false,
},
age: {
type: Sequelize.INTEGER,
allowNull: false,
},
// TEXT = TEXT
message: {
type: Sequelize.TEXT,
},
},
{
// 테이블의 자체 설정
// 매개변수로 전달받은 _squelize먼저 작성해주고
sequelize,
//테이블에 row 추가 했을 때 생성시간과 업데이트 시간을 표기 해준다.
// created_at과 updated_at 이라는 컬럼이 자동으로 추가된다.
// 우리가 row추가했을 때 시간을 기록, 수정했을 때도 시간을 기록해준다.
timestamps: true,
// 표기법을 바꿔준다. 기본적으로 스네이크 표기법으로 되어있는데,
// 이를 카멜 표기법으로 바꿔준다.
underscored: false,
modelName: "User", //모듈의 이름을 설정. 노드 프로젝트에서 사용
tableName: "users4", //복수형으로 설정해주자. 추가될 테이블의 이름
paranoid: false, //true로 설정하면 delete_at이라는 컬럼도 생성이 됩니다. 이는 값은 삭제되지않고 남아있고, deleted_at에 삭제시간이 표시됨
charset: "utf8", //인코딩 방식, 꼭 작성하자
collate: "utf8_general_ci", //인코딩 방식 꼭 작성하자
}
);
}
static associate(db) {
// 1:N 예
// 1:N 관계
// 시퀄라이즈에서 1:N관계를 hasMany 메서드로 정의해준다.
// sourceKey: user테이블 안에 어떤키를 foreignKey와 연결해줄지.
// hasMany 메서드의 첫번째 매개변수 넘긴 테이블이 foreignKey에 연결이되고 이름은 user_id다.
db.User.hasMany(db.Post, { foreignKey: "user_id", sourceKey: "id" });
}
}
module.exports = User;
유익한 글 잘 봤습니다, 감사합니다.