📂 이 모든 것을 알고 나면 편안해지는 게 맞겠죠?
ORM 패키지인 Sequelize를 배우고 정리해봤다.
더 자세한 것을 알기 위해서는 공식 문서를 읽어보는 것이 정답일 수도 있겠다. 문제가 생긴다면 가장 빠른 해결 방법은 구글링이라 생각한다. 이전에 sql문을 작성할 때는 실수가 잦았는데, sequelize를 사용하니 좀 더 편리하다는 생각이 들었다.
Sequelize
ORM 라이브러리 중 하나로 데이터베이스의데이터를 자바스크립트 구문을 통해 sql 문으로 변환한다.
이를 활용하면 sql 언어를 사용하지 않아도 DB 설정이 가능하다.
많은 RDBMS를 지원하고 promise 기반으로 구현되었기에 비동기 로직을 편하게 작성할 수 있다는 장점도 있다.
기존에는 SQL문 쿼리를 작성해서 CRUD를 수행했다면 Sequelize 사용을 통해 쿼리문 없이 CRUD문 수행이 가능하다.
설치
- sequelize : sequelize 패키지
- sequelize-cli : sequelize 명령어 실행
- mysql2 : mysql 과 sequelize 연결 드라이버 도구
npm install sequelize sequelize-cli mysql2
명령어 호출
npx : runner 실행을 해주는 역활로, 1회성으로 원하는 패키지를 사용하고 싶을 때 쓸 수 있는 명령어
npx sequelize init
새로운 폴더 중에 seeders(테이블에 기본 데이터 넣기), migrations(DB 변화과정 추적, git과 유사) 파일은 필요가 없어서 삭제했다.
Sequelize 설정
새로운 폴더 중에 config > config.json 에서 "development" 를 사용자 정보에 맞게 수정하면 된다.
{
"development": {
"username": "user",
"password": "1234",
"database": "visitor",
"host": "127.0.0.1",
"dialect": "mysql"
},
"test": {},
"production": {}
}
Sequelize 모델 정의
mysql에서 정의한 테이블이 대응되도록 몇까지 설정이 필요하다.
models > Visitor.js
Sequelize.define() 첫 번째 인자 - 모델 이름 설정
const model = Sequelize.define(
//모델 정의 -> sequelize 객체의 define 함수를 사용
'visitor', //인자1 : 모델 이름 설정
{ }, //인자2 : 컬럼 정의
{ } //인자3 : 모델의 옵션 정의
);
Sequelize.define() 두 번째 인자 - 컬럼 정의
- type : 데이터 타입 정의 (문자, 숫자, 날짜 등)
- primaryKey : 기본키 설정 (default : false)
- autoIncrement : 숫자 자동 증가 (default : false)
- allowNull : column 에 대한 설명 작성
- comment : column에 대한 설명 작성
- validate : 데이터 유효성 검사
Sequelize.define() 첫 번째 인자 - 모델 옵션 정의
- charset : "utf8"
- collate : "uft8_general_ci"
- 여기서 설정하지 않으면 DB 생성할 때 설정해야 한다.
- tableName : 테이블 이름 설정
- freexeTableName : true로 설정하면 이름을 복수로 설정하지 않는다.
- timestampse : 기본적인 설정은 true
Sequelize 쿼리문
sequelize 에서 SQL 문에 상응하는 메서드가 존재한다. 즉, sql 문을 js로 생성한다. promise 로 반환. .then() 을 붙여서 결과값 사용 가능
findAll() - select
exports.getVisitors = async (req, res) => {
// sql문
// => SELECT * FROM visitor;
// ver1. then() 메서드 사용
// models.Visitor.findAll().then((result) => {
// res.render('visitor', { data: result });
// });
// ver2. async/await 사용
const result = await models.Visitor.findAll();
res.render('visitor', { data: result });
};
findOne() - select
- 하나의 값만
exports.getVisitor = async (req, res) => {
// sql문
// => select * from visitor where id=${id}
const result = await models.Visitor.findOne({
where: { id: req.query.id },
});
res.send(result);
};
create() - insert
exports.postVisitor = async (req, res) => {
// sql문
// => insert into visitor(name, comment) values('${data.name}', '${data.comment}');
const result = await models.Visitor.create({
name: req.body.name,
comment: req.body.comment,
});
res.send(result);
};
update() - update
exports.patchVisitor = async (req, res) => {
// sql문
// => 'update visitor set name='${data.name}', comment='${data.comment}' WHERE id=${data.id}`
const result = await models.Visitor.update(
{
name: req.body.name,
comment: req.body.comment,
},
{
where: {
id: req.body.id,
},
}
);
res.send('수정완료');
};
destroy() - delete
exports.deleteVisitor = async (req, res) => {
// sql 문
// => `delete from visitor where id=${id}`
await models.Visitor.destroy({
where: { id: req.body.id },
});
res.end();
};
'[Study] BE > Node.js' 카테고리의 다른 글
[포스코x코딩온] Socket (0) | 2023.04.18 |
---|---|
[포스코x코딩온] Cookie, Session (0) | 2023.04.12 |
[포스코x코딩온] MVC_MySQL (1) | 2023.04.09 |
[포스코x코딩온] 파일 업로드 (0) | 2023.04.05 |
[포스코x코딩온] Node.js MVC 구조 (0) | 2023.04.05 |