[Study] BE/Node.js

[포스코x코딩온] Sequelize

stop-zero 2023. 4. 9. 14:30
더보기

📂 이 모든 것을 알고 나면 편안해지는 게 맞겠죠?

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