2 분 소요

MVC Design Patterns


MVC : Model View Controller

  • SW Architecture Design Pattern(소프트웨어 구조 설계 패턴)
  • separates application functionalities(기능 세분화)
  • Promotes organized programming(조직화된 프로그램)

img1

Model

  • Knowledge
  • Handles Data(데이터 처리)
  • Interaction with Database(데이터베이스 상호작용)

View

  • Visual representation of a model(모델 시각적 표현)
  • What the users see(UI)

Controller

  • Receives input(입력 수신)
  • Process requests(요청 처리)
  • get data from a model(데이터 받아오기)
  • pass data to the view(view를 위한 데이터 전달)

MVC Flow

img2

ORM


ORM : Object-Relational Mapping

Object <-> ORM <-> Relational Database

  • 데이터를 명시적으로 다룰 수 있다.

Sequelize

  • a promise-based Node.js ORM
  • 지원 RDBMS
    • Postgres, MySQL, MariaDB, SQLite, Microsoft SQL Server
  • SQL 문법이 조금씩 다른 경우도 통합해서 사용할 수 있다.

Sequelize 및 도구 이용


Squelize 및 sequelize-cli 설치


  • Squelize 설치
npm install sequelize sqlite3
  • Squeeze-cli 설치
npm install --save-dev sequelize-cli

ORM 설정(bootstraping)


npx sequelize-cli init

해당 명령어가 성공적으로 동작하면

  • Config
  • models
  • migrations
  • seeders

폴더 및 파일이 생성된다. 여기서 config 파일에 DB 연결 정보를 작성하여 해당 DB로 접근이 가능하다.

모델 생성


npx sequelize-cli model:generate --name url --attributes url:string,title:string,visits:integer
  • –name : 모델명, 나중에 s가 붙어 테이블 명이 된다.
  • –attributes : 필드 생성
    • id, createdAt, updatedAt은 자동 생성된다.
  • models, migrations 폴더의 name.js, ~-create-name.js에서 확인 가능하다.
    • 마이그레이션시 models의 파일과, migrations의 파일을 읽어 적용하기 때문에 defaultValue와 같은 추가 옵션을 해당 파일에 명시해 줄 수 있다.

Squelize 데이터 타입

Squelize 기본 문법

모델 마이그레이션


  • 생성한 모델을 config.json파일 정보를 사용하여 해당 DB에 접근해 테이블을 생성한다,
npx sequelize-cli db:migrate
# npx sequelize-cli db:migrate:undo -> 마이그레이션 실행 취소

img3

  • 스키마 변경이 있을 때마다 마이그레이션을 실행해줘야 한다.
  • Migrations 에서 확인 가능하다.

Sequelize 문법(CRUD)


Create

// Create a new user
const jane = await User.create({ firstName: "Jane", lastName: "Doe" });
console.log("Jane's auto-generated ID:", jane.id);

Read

  • SELECT * FROM ~
// Find all users
const users = await User.findAll();
console.log(users.every(user => user instanceof User)); // true
console.log("All users:", JSON.stringify(users, null, 2));
  • SELECT foor, bar FROM ~
Model.findAll({
  attributes: ['foo', 'bar']
});
  • WHERE
Post.findAll({
  where: {
    authorId: 2
  }
});
// SELECT * FROM post WHERE authorId = 2;

Update

// Change everyone without a last name to "Doe"
await User.update({ lastName: "Doe" }, {
  where: {
    lastName: null
  }
});

Delete

// Delete everyone named "Jane"
await User.destroy({
  where: {
    firstName: "Jane"
  }
});

이하 문법

Squeeze Associations(Join)


1:1 - hasOne, belongsTo

const A = sequelize.define('A', /* ... */);
const B = sequelize.define('B', /* ... */);

A.hasOne(B); // A HasOne B
A.belongsTo(B); // A BelongsTo B

1:N - hasMany

const A = sequelize.define('A', /* ... */);
const B = sequelize.define('B', /* ... */);

A.hasMany(B); // A HasMany B

N:M belongsToMany

const A = sequelize.define('A', /* ... */);
const B = sequelize.define('B', /* ... */);

A.belongsToMany(B, { through: 'C' }); // A BelongsToMany B through the junction table C(1:N N:1 관계를 연결하기 위한 자동 모델 생성)

MVC & orm(Squelize) 예제