Sequelize

프최's log·2020년 10월 26일
2

study

목록 보기
34/59
post-thumbnail

 Sequelize 는 프로미스 기반의 Node.js ORM(Object-Releational-Mapping) 이다. DBMS인 PostgreSQL, MySQL, MariaDB, SQLite, MS-SQL을 지원한다.

공식문서

환경세팅

//설치
$ npm install --save sequelize

sequelize-cli & Migrations

 sequelize-cli 는 마이그레이션을 할 수 있도록 돕는 툴로, CLI에서 모델을 생성해주거나, 스키마 적용을 할 수 있도록 돕는다. 설치 후, 공식 문서 외에 npx sequelize-cli --help 을 통해 명령의 종류를 파악할 수 있다.

// Sequelize CLI 설치
$ npm install --save-dev sequelize-cli
// 프로젝트 초기화(init)
$ npx sequelize-cli init

프로젝트 초기화 후, 아래와 같이 폴더가 생성된다.

  • config, DB 연결 정보 저장
  • models , DB 모- migrations , 마이그레이션 데이터 자동저장
  • seeders , 데이터 정의

 congif.json을 통해서 서버 연결을 진행하는데 기본적으로 development 를 사용한다. 만약 새롭게 다른 곳을 원한다면 model/index.js 에서 const env = process.env.NODE_ENV || 'development'; 를 설정해주면 바꿀 수 있다.

 config 파일 설정 후 아래와 같은 에러가 나온다면 비밀번호를 그냥 숫자로 집어넣은게 아닌지 확인해야한다. 에러문자 그대로 " data " 매개변수는 type이 string 이어야한다고 나와있다. 비밀번호를 따옴표 안에 넣어줘야 정상작동한다.

Migration을 이용한 모델(Model)만들기

 마이그레이션(Migrations)은 스키마 변경에 따른 데이터 이주(migration)를 뜻한다. model:generate 명령어를 통해서 작성할 수 있다.

  • name : 모델명(테이블)
  • attributes : 모델 속성(컬럼)
$ npx sequelize-cli model:generate --name User --attributes firstName:string,lastName:string,email:string

그럼 아래와 같은 형태로 폴더 안에 파일들이 생성된다. 참고로 모델명을 단수로 적어도 테이블명은 복수형나온다. 위에 User 모델의 테이블명은 'Users'임을 확인할 수 있다.

하지만 DB는 비어있다. 이 단계에서는 모델을 만들어주었을 뿐이라, DB에 등록하기 위해서는 db:migrate를 이용해서 제작해줘야한다.

$ npx sequelize-cli db:migrate

그럼 아래와 같이 테이블이 생성되고, 지정한 컬럼 속성이 어떻게 들어갔는지 알 수 있다.

실행취소

$ npx sequelize-cli db:migrate:undo
// 특정 migration 실행취소
$ npx sequelize-cli db:migrate:undo:all --to XXXXXXXXXXXXXX-create-posts.js

위와 같이 롤백이나 실행취소를 했을 경우, 다시 마이그레이션을 통해 동기화 작업을 진행할 수 있다.

마이그레이션을 하는 이유

 마이그레이션은 Git의 '커밋'과 같다.

 마이그레이션을 통해서 스키마 변경에 대한 기록 을 진행하고, 그 로그를 확인할 수 있다. 스키마 버전관리로 보면 알기 쉽다. 스키마를 완벽하게 설계할 수 없기 때문에 마이그레이션을 통해 추후 새로운 기능을 추가하는 스키마 관리를 할 수 있다. 또한 데이터 복구를 위해서도 존재한다. 참고로 이미 만들어진 '필드'는 지우면 안된다. 이 필드는 언제 어디서 쓸지 모르기 때문이다.

 위에 테이블 생성에서 보면 SequelizeMeta 라는 테이블이 자동 생성된 것을 알 수 있는데 이는 현재 데이터베이스에 실행된 migrations 기록을 볼 수 있는 테이블이다. 한 테이블에 하나의 Meta가 생성된다.


Association = JOIN

테이블간의 관계성을 만들어주는 것. 각 모델안에 아래의 관계를 작성해 준 후, 스키마 마이그레이션으로 연결할 외래키 컬럼을 생성하면 된다. (외래키 컬럼이 없을 경우), 제약이름을 설정해줘여 casecade나 remove 등이 가능하다.

  • 1:1
    • The HasOne association
    • The BelongsTo association
  • 1:다
    • The HasMany association
    • The BelongsTo association
  • 다:다
    • The BelongsToMany association
  • static associate method를 사용하는 부분이 sequelize 공식문서에서 조용히 사라졌다고 한다. ES6문법 관련으로 문제가 있던걸까?
  • Transaction = 통장에서의 조회/출금/송금 섞는 것
    • 작업 중 발생하는 에러에 대한 롤백
    • 완료되었을 때, 커밋하는 작업의 단계

내가 생성한 제약조건 확인

참조
https://github.com/codestates/help-desk/issues/609


추가 참조사이트
Sequelize CLI를 사용하여 User API 만들기
처음 사용해보는 Sequelize
[Node.js] sequelize(2) - 모델 정의하기
https://sequelize.readthedocs.io/en/2.0/
int(11)관련


서버에서 활용하기

var db = new Sequelize('DB명', 'root', '비번')

db.define : 엔티티 정의(테이블)

테이블.sync() = 코드와 스키마를 일치시켜준다.
.then( ()=>{
return 테이블.create() = INSERT INTO 
})
.then( ()=>{
return 테이블.findAll({where:...}) = SELECT *
})
... → 비동기코드 체이닝
profile
차곡차곡 쌓아가는 나의 개발 기록

0개의 댓글