Javascript/Node.js

[Sequelize] Sequelize로 postgresql 다루기

Frankie 2020. 3. 30. 19:04

1. ORM - 프로그램 상의 객체와 DB의 테이블이 일대일 대응하는 관계를 맺는 것

-> 를 이용하면 query가 아닌 메서드로서 데이터를 조작할 수 있다

-> 여러 DB(postgresql, mysql, sqlite 등)에서 사용 가능

 

2. Sequelize - Node.js의 대표적인 ORM, Promise문법(비동기 코드를 깔끔하게 작성하도록 도와주는 JS문법)을 사용

 

npm install sequelize postgres

 

3. Sequelize-cli - Sequelize를 조금 더 효율적으로 사용하기 위해서 몇 개의 폴더와 파일을 생성

 

npm install sequelize postgres

 

sequelize init

 

-> 이 명령어를 실행하면 폴더와 파일이 생성된다.

 

1) config/config.json - DB connection 정보를 각 환경에 맞게 설정할 수 있다

이런식으로 되어 있고 development, test, production 세 가지로 나뉘어져 있다

dialect는 사용할 관계형 데이터베이스 이름이고 operatorAliases는 연산자에 대한 별칭을 사용할 것인지에 대한 것이다.

 

2) models/index.js

- models 폴더는 model을 정의한 js파일들을 모아놓은 폴더이다

- index.js 파일은 config.json 파일의 설정 값을 읽어 sequelize를 생성하고 models 폴더 아래에 존재하는 js 파일을 모두 로딩해서 DB 객체에 model을 정의하여 반환한다.  -> 여러 모델들을 한 객체(DB)에 담아 반환하는 역할이다

index.js 파일 코드 중

코드를 보면 반복문을 돌면서 import를 통해 현재 폴더 내의 모든 파일들을 불러오는데

import 메서드는 파일에 있는 model 정의들과 같은 객체를 생성한다. 즉 models 폴더 내에 정의한 모델들을

반복문을 돌면서 취합한다

그런데 이것은 모델을 정의만 하는 것이고 실제 프로젝트 내에 모델을 등록하는 것은 뒤에서 살펴볼 sync() 메서드에 의해서 이루어진다.

코드 밑부분에서는 반복문을 돌며 associate() 메서드를 통해 model 사이의 관계를 정의한다.

 

4. sync() 메서드를 호출하여 sequelize 실행

sequelize는 CRUD의 데이터 조작과 데이터 정의를 지원한다.

따라서 이미 만들어진 테이블에 모델을 매핑할 수 있을 뿐만 아니라 DB에 테이블이 없는 상태이면 정의한 모델을 바탕으로 테이블을 생성할 수도 있다

sync() 메서드는 모델에서 정의한 이름을 갖는 테이블이 존재하지 않을 경우에만 동작하는 메서드이다.

즉, models/index.js파일에서 정의한 모델들을 바탕으로 실제로 모델을 등록하는 일을 한다

 

호출 방법은

/app.js 파일에 위와 같은 코드를 입력하면 된다.

 

그 후

npm start

     or

node app.js 를 입력해서 DB 연결 성공 로그가 출력되면 정상적으로 Model 등록되고 sequelize가 잘 연동된 것이다.

 

5. 모델 정의하는 법

1) 직접 작성

/models/users.js 파일을 생성하여 코드를 아래와 같이 작성하면

이렇게 테이블을 정의되면 index.js에서 반복문을 돌며 models 폴더 내에 있는 파일들을 읽어서 모델들을 취합한다. 

따라서 index.js에서 users.js파일을 읽어 모델로 정의가 된다.

 

2) CLI로 모델 정의

cmd창에

sequelize model:create --name user2 --attributes "user_id:string, password:string"

이 명령어를 입력하면 새로운 모델과 migration이 생성된다.

그래서 서버를 실행해서 user2 테이블을 생성해서 확인해보면

user2s라는 이름의 테이블이 존재하는데 그 이유는 cli로 테이블 생성하면, 자동으로 테이블 명을 복수형으로 만들기 때문이다.

그리고 id,createdAt,updatedAt 이 3개의 필드를 자동으로 생성해준다.

 

3) 옵션 부여

컬럼의 unique, not null 등의 옵션을 부여하려면 user2.js파일에서 

이런 식으로 옵션을 컬럼마다 부여할 수 있는데

type, primarykey, autoIncrement, allowNull, unique, comment, validate 등의 옵션을 넣을 수 있다

 

4) migration - 모델을 정의한 뒤에는 migration을 해야 하는데

migration은 up기능과 down기능이 있는 일련의 데이터베이스 작업이다. up기능은 데이터베이스를 변경하고 down기능은 데이터베이스를 up기능이 실행되기 전의 상태로 복원하려고 시도한다. migration을 사용하여 테이블에 데이터를 추가할  수도 있지만 주로 migration이 의미하는 것은 이전 상태의 데이터베이스 작동에 관한 것이다.

cli로 모델을 정의할 때 생성된 migration파일과 /models/user2.js 파일은 같은 내용인데 위에서 옵션을 추가해서 user2.js파일은 수정되어서 그 내용과 migration 파일의 테이블 정의를 맞춰주어야 한다.

그리고 나서

sequelize db:migrate

이 명령어를 실행하면 테이블 정의된 부분이 migrate 된 것이고 /model/user2.js 파일과 migration 파일이 일치하게 되는 것이다.

 

5) migration한 상태에서 수정

migration을 한 상태에서 테이블에 필드를 하나 더 추가하거나 기존 필드의 옵션을 바꾸려면

sequelize db:migrate:undo(:all) 명령어를 실행한 후 user2.js파일과 migration 파일의 내용을 같게 하고

sequelize db:migrate 명령어를 실행하면 migration이 create되면서 내용이 맞춰진다

 

*migration 파일을 삭제하였으면 sequelize migration:create 20171108014301-create-user-2

다음 명령어로 파일을 생성하고 이름을 20171108014301-create-user-2.js로 수정하면 된다

 

 

 

 

 

 

 

 

참조사이트 - https://victorydntmd.tistory.com/26?category=677306

'Javascript > Node.js' 카테고리의 다른 글

Postman  (0) 2021.04.16
Express  (0) 2021.04.16
[JavaScript] 객체지향  (0) 2020.02.23
[JavaScript] 함수지향  (0) 2020.02.23
[JavaScript] 자바스크립트 기본  (0) 2020.02.22