[데이터베이스] MVC 패턴과 ORM(Sequelize) 개념 학습

hosik kim·2022년 2월 6일
0

With CodeStates

목록 보기
44/45

📌 MVC (Model-View-Controller)


MVC는 소프트웨어 설계와 관련하여 흔히 사용되는 설계 패턴이다.

React의 단방향의 데이터 흐름, Redux의 Flux + Reducer 패턴 역시 설계 패턴의 일종이다.

어떤 서비스를 제공하기 위해 여러 과정들과 처리들이 필요한대, 그런 처리들을 각 기능별로 나뉜다는 특징이 있다.

Model은 Model의 역활로, Controller의 역할로 나눔으로써, 프로그래밍을 할 때, 하나의 코드베이스에서 모든 것을 하는게 아니라, 정돈된 코딩을 특정 역할에서 수행할 수 있다는 특징이다.

이로 인해 코드 가독성, 관리성, 코드의 질 등이 개선된다.

실제로 여러 유명한 웹 프레임워크는 MVC패턴을 사용하고 있다.

🔸 Model

Model은 Data의 정보를 갖고있다.

Model 그 자체 Data를 갖고있을 수 있고, Database와 연결되어 Data를 가져올 수 있다. 이러한
Data의 흐름은 Controller의 요청으로부터 Controller에 Data를 응답할 때, Model은 Database로부터, 또는
Model 자체의 Data로 응답한다.

Model이 View와 상호작용을 하는 경우는 거의 없다.

🔸 View

View는 User가 보는 화면을 보여주게 한느 역할이다.
브라우저의 경우 HTML 또는 CSS가 있다.

View는 Controller와 상호작용을 한다.

Controller에게 User의 Action이나 Event를 전달하면, View는 그 이후의 과정을 알지 못한다.

Controller가 Model과 상호작용으로부터 응답받은 Data를 View에게 응답한다.

View는 그 Data를 시각화할 뿐이다.

🔸 Controller

constroller는 View에서 일어나느 Action, Event의 input을 받고, 그 값들을 Model에게 전해주기 전에 가공한다.

가공된 데이터를 Model에 넘겨주게되면, Database에서 정보를 가져오거나, Model 스스로 데이터를 처리한 경우, Controller에게 그 데이터를 반환한다.

Controller는 Model로 받은 데이터를 View로 전해주기 전에, View가 인식할 수 있도록 데이터를 가공한다.

View는 그 Data를 시각화하게된다.

이 세가지 모델이 위 그림과 같이 수행한다.

Browser에서 어떤 이벤트가 발생되면, Router로 분기를 하고 Router는 각 엔드포인트에 정해진 Controller를 호출한다.

Controller는 View로 바로 데이터를 보내줄 수 있고, Model을 거쳐 Data를 받아 View에게 데이터를 반환하는 형태이다.

📌 ORM (Object-Relational Mapping)


  • ORM은 Model을 기술하는 도구이다. 이를 통해 데이터베이스와 프로그래밍 언어 사이 개념의 간극을 줄인다.

  • ORM을 사용하여 SQL문을 직접 작성하지 않고 엔티티들을 객체로 표현할 수 있다.

🔸 ORM을 사용하는 이유?

관계형 데이터베이스에서 필드는, Javascript 객체에서의 각 속성이라 볼 수 있다.

관계형 데이터베이스에서 Join Table의 경우, 객체 지향 프로그래밍에서 배열로 조회가 가능하다.

객체 지향으로 데이터를 다루는 방법과, 관계형 데이터베이스에서 데이터를 다루는 방법이 서로 다르다.

그래서, 관계형 데이터베이스가 불편하고, Javascript가 익숙하다면 ORM을 이용해 관계형으로 사고하지 않고 관계형 데이터베이스에 접근할 수 있다.

관계형 데이터베이스에 접근하는 방법 자체를 프로그래밍 언어의 관점에서 맞출 수 있도록 도와주는 것이 ORM이라 할 수 있다.

SQL문을 사용하지 않고, 데이터베이스에 접근할 수 있는 것이 큰 장점이다.

🔸 Sequelize

  • Sequelize는 Promise 기반의 Node.js ORM이다.

  • 지원하는 관계형 데이터베이스는 아래와 같다

    • Postgres
    • MySQL
    • MariaDB
    • SQLite
    • MS SQL Server

다양한 관계형 데이터베이스가 있는데, 이 관계형 데이터베이스들 간의 SQL문이 조금 다른 경우가 있다.
어떤 필드의 속성을 지정할 때, MySQL에선 String을 varchar(255) 으로 정의하는데, 다른 관계형 데이터베이스의 경우
다를 수 있다.

이런 것들을 Sequelize가 맞춰준다. 그래서, Javascript 코드만 작성하는 것으로 데이터베이스의 다양한 종류를 사용할 수 있다.

동일한 ORM 코드를 사용하는 것으로, 데이터베이스간 호환성을 신경쓰지 않아도 되는 장점이 있다.

var Sequelize = require('sequelize')
var db = new Sequelize('cahtter', 'root', '')

var User = db.define('User', {
  username: Sequelize.STRING,
})

var Message = db.define('Message', {
  userid: Sequelize.INTEGER,
  text: Sequelize.STRING,
  roomname: Sequelize.STRING,
})

Sequelize 모듈을 require로 가져오고, 인자의 첫번째로 Database, 두번째로 username, 세번째로 password를 전달하여
db를 정의한다.

이후 .define() 을 이용해 엔티티를 생성한다.

숫자, 문자열 타입을 지정할 때, 직관적으로 INTEGER, STRING 으로 정의할 수 있다.
또한 각 엔티티별 id 는 Primary key이다. 이 id는 엔티티를 생성할 때, Sequelize가 자동으로 생성한다.

추가적으로 created_At, updated_At 필드들도 자동으로 생성한다.

var Sequelize = require('sequelize')
var db = new Sequelize('cahtter', 'root', '')

var User = db.define('User', {
  username: Sequelize.STRING,
})

var Message = db.define('Message', {
  userid: Sequelize.INTEGER,
  text: Sequelize.STRING,
  roomname: Sequelize.STRING,
})

User.sync()
  .then(function () {
  return User.create({ username: 'Jean Valjean' })
})
  .then(function () {
  return User.findAll({ where: { username: 'Jean Valjean' }
})
 })
  .then(function (users) {
  users.forEach(function (user) {
    console.log(user.username + ' exists')
  })
  db.close()
 })
  .catch(function (err) {
  console.error(err)
  db.close()
})

이후, Promise를 이용해 CRUD를 수행할 수 있다. 예시는 위 코드와 같다.

에러를 핸들링할 때도, Promise에서 에러를 핸들링할 때와 같이 마지막에 .catch()를 추가하는 것으로 수행할 수 있다.

🔍 refrence


공식 문서

profile
안되면 될 때까지👌

0개의 댓글