본문 바로가기
Database/MySQL

[MySQL] Sequelize 개념 및 세팅 방법, 쿼리 예제

by VictorMeredith 2023. 5. 12.

1. Sequelize 

- Sequelize는 Node.js를 위한 ORM(Object-Relational Mapping)으로, MySQL, MariaDB, PostgreSQL, SQLite, 그리고 MSSQL과 같은 SQL 기반의 데이터베이스를 지원한다.

- JavaScript, TypeScript와 모두 호환 가능하다.
- Sequelize를 사용하면 SQL 쿼리를 직접 작성하지 않고도 데이터베이스에서 데이터를 조회, 삽입, 수정, 삭제가 가능하다.

- 모델 기반의 접근 방식을 통해 코드의 가독성과 유지보수성을 향상시킬 수 있다. Mongoose와 거의 똑같다. 문법만 다름

 

2. Sequelize의 장점

- JS로 쿼리 짤 수 있음

- 다양한 SQL DB 지원

- Promise , async/await 지원함

- 자동화된 마이그레이션 관리

 

3. Sequelize의 단점

- 초기 학습곡선이 좀 있음

- Raw한 SQL에 비해 성능이슈가 있음. 항상 최적화된 쿼리를 생성하는 것은 아니기 때문이다.

- 매우 복잡한 쿼리는 그냥 생성하는게 나음

- NoSQL 지원 부족

 

4. 초기 세팅

- 설치 : 

 npm i @types/sequelize sequelize sequelize-cli 

 npx sequelize init

 

- 파일구조

서버 디렉토리구조 대략적인거

 

models/users.ts

역할 : 인터페이스, 모델, 관계, 스키마와 table의 옵션을 정의

 

models/index.ts

역할 : db 유형설정(dev), sequelize 인스턴스 생성, Model연결, Model들의 관계 실행

 

root/db.ts

index.ts에서 인스턴스를 가져와서 sync를 통해 연결해주는 모듈

 

root/server.ts

db를 연결하고 서버를 시작

 

controllers/test_controller.ts

테스트해보기
잘 되는군!

 

5. Sequelize 쿼리

import User from './users';

// SQL INSERT
// INSERT INTO dbName.users (name, age, married, comment) VALUES ('name1', 20, 0, 'this is comment');
User.create({
  name : 'name1',
  age : 20,
  married : false,
  comment : 'this is comment'
})

// SQL READ 1
// SELECT * FROM dbName.users
User.findAll({});

// SQL READ 2
// SELECT name, married FROM dbName.users
User.findAll({
  attributes : ['name', 'married']
});

//SQL READ 3
// SELECT name, age FROM dbName.users WHERE married = 1 AND age > 30;
import { Op } from 'sequelize';
User.findAll({
  attributes : ['name', 'age'],
  where:{
    married : true,
    age: { [Op.gt]: 30} //30 초과 (greater than)
  }
})

//연산자
// Op.eq: 동일
// Op.ne: 다름
// Op.gt: 초과
// Op.gte: 이상
// Op.lt: 미만
// Op.lte: 이하

// 추가연산자
// Op.between: 값이 주어진 범위 내에 있는지 비교합니다.
// Op.notBetween: 값이 주어진 범위 내에 없는지 비교합니다.
// Op.in: 값이 주어진 배열 내에 있는지 비교합니다.
// Op.notIn: 값이 주어진 배열 내에 없는지 비교합니다.
// Op.like: 값이 주어진 패턴과 일치하는지 비교합니다.
// Op.notLike: 값이 주어진 패턴과 일치하지 않는지 비교합니다.
// Op.startsWith: 값이 주어진 접두사로 시작하는지 비교합니다.
// Op.endsWith: 값이 주어진 접미사로 끝나는지 비교합니다.
// Op.substring: 값이 주어진 부분 문자열을 포함하는지 비교합니다.
// 이러한 연산자들은 Sequelize의 쿼리에서 where 절에서 사용될 수 있습니다. 연산자를 사용하여 쿼리를 작성할 때 필요한 비교 조건을 정확하게 지정할 수 있습니다.

//SQL
// SELECT id,name FROM users ORDER BY age DESC, created_at ASC LIMIT 1 OFFSET 1;
User.findAll({
  attributes: ['id', 'name'],
  order: [['age', 'DESC'], ['created_at', 'ASC']],
  limit : 1,
  offset : 1
})

//SQL
// UPDATE dbName.users SET comment = '바꿀 내용' WHERE id = 2;
User.update(
  {comment : '바꿀내용'}, 
  {where : {id : 2} }
)

//SQL
// DELETE FROM dbName.users WHERE id = 2;
User.destroy({
  where:{id : 2}
})

User.destroy({
  where : {id : { [Op.in] : [1,3,5] } }
})


// 관계 쿼리
const example = async ()=>{
  try{
    const user = await User.findOne({
      include : [{
        model: Comment
      }]
    })
    if (!user) throw new Error('error')
    console.log(comments)
  }
  catch(err){
    throw new Error(`미들웨어로 ${err}`)
  }
}

// get모델명으로 관계 데이터 로딩 가능
// const user = await User.findOne({});
// const comments = await user.getComments(); 
// console.log(comments) 

// Raw 쿼리 직접 사용하기
const [result, metadata] = await sequelize.query('SELECT * FROM users');
// metadata에는 쿼리 실행에 대한 추가 정보가 들어있다.

 

- 더 복잡한 쿼리는 chatGPT가 해줄거양

'Database > MySQL' 카테고리의 다른 글

[MySQL] 이것이 MySQL이다  (0) 2024.03.25
[MySQL] (완) 기본 문법 - 7  (0) 2023.05.04
[MySQL] 기본 문법 - 6  (0) 2023.05.04
[MySQL] 기본 문법 - 5  (0) 2023.05.04
[MySQL] 기본 문법 - 4 (Join 개쉬움)  (0) 2023.05.04

댓글