MVC, ORM

Creating the dots·2021년 9월 1일
0

CS

목록 보기
16/19

MVC

소프트웨어 설계와 관련된 디자인 패턴으로 소프트웨어 공학에서의 흔히 사용되는 설계패턴

MVC

MVC는 Model, View, Controller 3가지로 역할을 나누어 코드에 대한 유지보수를 용이하게 개발하는 방법론이다.
MVC 패턴의 흐름은 간단히 설명하면 다음과 같다.

  1. 유저가 검색/버튼 클릭 등을 실행했을때, 원하는 기능을 처리하기 위해 컨트롤러에 요청을 보낸다.
  2. 컨트롤러는 뷰의 요청에 따라 모델에 요청을 보내고, 모델은 비즈니스 로직을 수행한다.
  3. 컨트롤러는 사용자에게 보여줄 뷰를 선택한다.
  4. 선택된 뷰는 컨트롤러부터 데이터를 전달받아 화면에 보여준다.

Model

  • 데이터를 다루고, 비즈니스 로직을 수행한다.
  • 데이터베이스와 컨트롤러와 상호작용한다.

View

  • 유저가 보는 UI이다.
  • 컨트롤러와 상호작용한다.
  • View가 업데이트되는 방법은 Model을 이용해 직접 업데이트하거나 Polling으로 주기적으로 Model의 변경을 감지하여 업데이트하는 방법이 있다.

Controller

  • 모델과 뷰를 연결해준다.
  • 뷰로부터 요청을 받고, 모델에 비즈니스 로직을 수행시킨 후 전달받은 데이터를 다시 뷰에게 전달한다.
  • 비즈니스 로직이 저장되어있다.
    • 프로그램을 통해서 어떤 문제를 해결할 것인가?
    • 어떻게 하면 문제를 풀 수 있을까?
    • 이렇게 작성한 글 하나 하나가 기능이 되고 그 기능이 비즈니스 로직이 된다.

MVC 장점

  • MVC 패턴을 사용하면 세 가지로 역할분담을 나누어, 프로그램을 확장할 경우, 유연성을 갖는다. 예를 들어, 특정 서비스를 웹으로 확장할 경우, 기존 모델은 그대로 사용하고, 뷰와 컨트롤러 로직만 수정하면 된다.
  • 또한, 동일한 코드를 반복해서 사용하지 않아도 되어서 중복 개발되는 부분을 방지할 수 있다.
  • 마지막으로, 실행 중 문제가 발생한 경우, 세 가지로 역할이 분담되어있기 때문에 에러를 찾아 해결하는 것이 용이하다.

MVC 단점

서비스의 기능이 많아질수록 컨트롤러에 업무가 과중되고, 컨트롤러가 뷰와 모델에 의존적이게 된다. 따라서, 코드를 수정하기 어렵고, 여러 side-effect를 일으킬 수 있다.


ORM

Object-Relational Mapping
자바스크립트의 객체와 관계형 데이터베이스의 엔티티 사이의 다리 역할

ORM은 왜 쓸까?

  • 원래 사용하는 언어만 사용하면 되고, SQL을 새로 배우지 않아도 된다
  • 객체지향적 코드로 더 직관적으로 쓰고 이해할 수 있다

Sequelize

  • a promise-based Node.js ORM
  • 지원 RDBMS
    • Postgres
    • MySQL
    • MariaDB
    • SQLite
    • Microsoft SQL Server

ORM 예시 코드

var Sequelize = require('sequelize');
var db = new Sequelize('chatter','root',''); //(db이름, user, password)

var User = db.define('User', { //define 메소드로 스키마를 작성하는 과정
  username: Sequelize.STRING 
  //mysql에서는 varchar(255)로 썼는데, rdbms 사이의 호환성을 유지시키기 위해 sequelize에서 타입을 만든 것
  //sequelize에서 자동으로 id(pk), created_at, update_at 등을 자동으로 생성
});

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

User.sync()
  .then(function(){
    return User.create({ username : 'Jean Valjean' }); 
  //객체를 사용해 새로운 레코드 생성하는 과정. SQL에서는 INSERT INTO를 사용했었다
  })
  .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.err(err);
    db.close();
  });

Association: join table 구현하기

sequelize에서 1:1, 1:N, N:M 관계는 다음과 같은 4개의 타입을 조합해 표현할 수 있다

  • The HasOne association
  • The BelongsTo association
  • The HasMany association
  • The BelongsToMany association

Transaction

예를 들어 '송금'을 하기 위해서는 다음 세개의 과정이 발생한다
1. 통장 조회
2. 통장 출금
3. 다른 통장으로 입금
만약, 출금은 이뤄졌지만 데이터베이스에 문제가 발생해 다른 통장으로 입금에 실패했다면 'Rollback'을 해주어야한다.

이처럼 하나의 쿼리를 작업단위로 보고 문제가 생기면 rollback, 성공했으면 commit을 해주는 것을 Transaction이라고 한다.

reference

profile
어제보다 나은 오늘을 만드는 중

0개의 댓글