MVC 패턴

katsukichi·2021년 4월 12일
0

CodeStates_IM

목록 보기
40/48

MVC 디자인 패턴이란

react의 단방향데이터흐름이라던가, Redux의 Flux패턴역시 디자인 패턴중 하나이다.

Model, View, Controller 로

그중에서 Model과 Controller 사이

그리고 Model이 DB와 어떤 방식으로 연결되는지

알아보자.

그중 ORM이란 Model을 기술하는 도구이다.

이를통해서 DB와 프로그래밍언어사이의 차이를 줄여준다.

What is MVC

하나의 돌아가는 방식에대한 아이디어, 패턴이다.

각 기능별로 나눠서, 기능을 나눠가지고있다.

그렇게 됨으로써 프로그래밍할때 한곳에서 모든것을 하는게아니라

각각 특정 위치에서 역할을 수행하게끔한다.

코드퀄리티가 높아지고, MVC패턴을 의식하지않더라도

이미 이런식으로 코드가 짜여져있던 경우가 꽤있다.

회사에서도 유사한코드들을 많이 보게된다.

내 일부러라도 나누어놧더라도

결과적으로 MVC패턴과 닮아있을수있다.

MVC 컨셉의 프레임워크들

  • Ruby on Rails(Ruby)
  • Express(JS)
  • Lararvel(PHP)
  • Backbone(JS)
  • Codeigniter(PHP)
  • Angular(JS)
  • Django(PYTHON)
  • Flask(PYTHON)

1. Model

모델은

특정 데이터의 정보를 가지고있다.

자기자신이 데이터를 가지고있던지,

DB와 연결해서 데이터를 가지고오던지.


컨트롤러가 모델에게 물어보거나.

모델이 컨트롤러에게 데이터를 반환하거나

모델이 뷰랑 직접 이야기하는경우는 거의없다.


2. View

뷰는 유저가 보는 화면을 보여주게하는 역할을 한다.

html,css등? 이친구는 컨트롤러랑만 이야기한다.

컨트롤러에게 뷰에서일어나는 어떤 액션이나 이벤트를 전달한다던지,

뷰는그것을모른다.

컨트롤러,모델을 거쳐서 반환 반환하면 뷰는 그것을 다시 그린다.

그리는것이 역할에 충실한것이 뷰

3. Controller

컨트롤러는 일반적으로 뷰에서 일어나는 액션과 이벤트 인풋값을받는다. 어떤 특정의 일련의 가공과정을 거칠수있다.


그 가공후 모델에게 전달한다

이때 모델이 데이터를가지고있다면 그곳에서 해결

아니라면 db에서 가져온 데이터를 모델이 처리후 반환

컨트롤러가 반환(뷰가 알아들을수있게 가공해서 반환할수도있다)

예를들면

브라우저에서 유저에 액션들이 일어나면 라우팅 (분기를한다)

라우터는 각각 엔드포인트에 맞는 컨트롤러를 불러준다.

컨트롤러는 뷰로 바로 보내줄수도있고,
모델을 거쳐서 다시 뷰로 보내줄수도 있다.

ORM

Object-Relational Mapping

오브젝트와 관계형데이터베이스 사이에서

ORM이 동작한다

ORM은 왜쓰는가?

OOP vs. Reational Database


객체에서의 각속성은

데이터베이스에서의 각 필드다.


N:M을 객체내부에서 배열로 표현할수있다.

결론 : 서로가 접근방법이 다르다, JS의 객체와 관계형 데이터베이스는 구조적 특성이 많이다르다. (생각하는방법,접근하는방법도 꽤 다르다)

접근방법을 프로그래밍언어에 맞춰주는 친구가 ORM이다.

어뎁터라는게 필요하다.

JS와 RDBMS를 연결하려면 모듈이 필요하다.

ORM을사용해서 JS에서 편하게 DB에 접근할수있다.


Sequelize

  • 프로미스가 기본
  • 지원하는 RDBMS
    • postgres
    • mysql
    • mariaDB
    • SQLite
    • Microsoft SQL server

ORM 예시코드

var Sequelize = require('sequelize');
var db = new Sequelize('chatter', '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();
  });

더 공부해보면 좋은 주제

  • Association // 연관짓다. -> JOIN과 관련된 내용
    ORM을 이용해서 JOIN 테이블을 구현하는거 꼭 해보길 추천 실무에서 잘쓰일것 (1:1,1:n,n:m)
  • Transaction // 트랜잭션 -> 은행업무 -> 송금-> 분리해서 생각하면 ,

통장에서 출금 + 다른 통장으로 입금

통장에서 출금 + 서버에서 문제발생 +다른 통장으로 입금

이때 중간에 문제가 생기면 롤백을 해줘야한다.

그게 트랜잭션

profile
front-back / end developer / Let's be an adaptable person

0개의 댓글