Sequelize - Node.js ORM

박재현·2022년 3월 6일
0
post-custom-banner

💡 Sequelize

  • Sequelize는 Node에서 데이터베이스 접속시 편리하게 작업할 수 있도록 도와주는 라이브러리, Promise 문법을 사용합니다.
  • ORM(Object-relational Mapping) 으로 자바스크립트 객체와 데이터베이스 릴레이션을 맵핑해 주고 자바스크립트 구문을 알아서 SQL로 바꾸어 질의하기 때문에 SQL 문법을 몰라도 데이터베이스를 다룰 수 있게 도와줍니다.
  • 더욱이 MySql, MariaDB, PostgreSQL, SQLite, MSSQL등 다른 데이터베이스도 같이 쓸 수 있기 때문에 유용하게 활용할 수 있습니다.

💡 Sequelize 설치

📌 npm i sequelize

  • sequelize 설치

📌 npm i mysql2

  • mysql 연결

📌 npm i sequelize-cli

  • sequelize를 조금 더 효율적으로 사용하기 위해서 몇 개의 폴더와 파일( 스켈레톤 )을 생성, npx sequelize init 을 통해 생성 가능

💡 dataType

📌 sequelize.define를 사용하여 column 선언시 속성의 dataType은 SQL문 dataType과는 조금 다른 이름으로 선언합니다.

  • VARCHAR: STRING
  • INT: INTEGER
  • UNSIGNED 옵션이 적용된 INT: INTEGER.UNSIGNED
  • ZEROFILL옵션: INTEGER.UNSIGNED.ZEROFILL
  • TINYINT: BOOLEAN
  • DATETIME: DATE
  • NOT NULL: allowNull
  • UNIQUE: UNIQUE
  • 기본값: defaultValue

📌 options

  • timestamps: true 일 경우 createdAt, updatedAt 컬럼을 자동으로 추가하고 row가 생성, 수정될 때 시간이 자동으로 입력됩니다.
  • paranoid: timestamps 가 true 경우에만 사용가능합니다. deletedAt 이라는 컬럼이 추가되며 row 삭제하는 sequelize 명령 내릴 경우 deletedAt에 제거 날짜를 입력합니다.
  • underscored: sequelize가 자동으로 생성해주는 컬럼명을 스네이크 형식으로 변경합니다. createdAt, updatedAt, deletedAt 컬럼을 각각 created_at, updated_at, deleted_at으로 변경해 줍니다.
  • tableName: sequelize는 자동으로 define 메소드 첫번째 인자(모델명)를 복수형으로 만들어 테이블명으로 사용합니다. 테이블 명을 다른 것으로 지정하고 싶을 때 해당 옵션을 사용합니다.

💡 Model 간 관계 선언

📌 아래 메소드들을 사용하여 table에 해당하는 model간 관계를 맺어줍니다.

doc associations

  • HasOne: One-to-one association
  • HasMany: One-to-many association
  • BelongsTo: One-to-one association
  • BelongsToMany: Many-to-many association with a join table.

1:1

1:1 경우 hasOne, belongTo가 반대여도 상관없습니다.

db.User.hasOne(db.Info, { foreginKey:"user_id", sourceKey:"id"});
db.Info.belongTo(db.User, { foreginKey:"user_id", tarketKey:"id"});

1:N

foreginKey 를 사용하여 관계를 맺어줄 경우 hasMany는 sourceKey, belongTo는 targetKey를 사용합니다.

User.hasMany(Comment, { foreginKey:"commenter", sourceKey: "id"}); 
Comment.belongTo(User, { foreginKey:"commenter", targetKey: "id"}); // User 모델의 id를 Comment 모델의 commenter 컬럼에 넣습니다.

N:M ( 각 테이블 PK를 부모로 여기는 추가 Table 생성)

새로운 릴레이션으로 사용될 이름을 through 속성의 값으로 넣어줍니다.

Post.belongToMany(HashTag, { through:"PostHashTag"});
HashTag.belongToMany(Post, { through:"PostHashTag"});
post-custom-banner

0개의 댓글