MVC는 소프트웨어 설계와 관련하여 흔히 사용되는 설계 패턴입니다.
React의 단방향 데이터 흐름, Redux의 Flux + Reducer 패턴 역시 설계 패턴의 일종입니다.
어떤 서비스를 제공하기 위해 여러 과정들과 처리들이 필요한데, 그런 처리들을 각 기능별로 나뉜다는 특징이 있습니다.
Model은 Model의 역할로, Controller는 Controller의 역할로 나눔으로써, 프로그래밍을 할 때, 하나의 코드 베이스에서 모든 것을 하는게 아니라, 정돈된 코딩을 특정 역할에서 수행할 수 있다는 특징입니다.
이로 인해 코드 가독성, 관리성, 코드의 질 등이 개선됩니다.
실제로 여러 유명한 웹 프레임워크는 MVC패턴을 사용하고 있습니다.
Model은 Data의 정보를 갖고있습니다.
Model 그 자체가 Data를 갖고있을 수 있고, Database와 연결되어 Data를 가져올 수 있습니다. 이러한 Data의 흐름은 Controller의 요청으로부터 Controller에 Data를 응답할 때, Model은 Database로부터, 또는 Model 자체의 Data로 응답합니다.
Model이 View와 상호작용을 하는 경우는 거의 없습니다.
View는 User가 보는 화면을 보여주게 하는 역할입니다.
브라우저의 경우 HTML 또는 CSS가 있겠습니다.
View는 Controller와 상호작용을 합니다.
Controller에게 User의 Action이나 Event를 전달하면, View는 그 이후의 과정을 알지 못합니다.
Controller가 Model과 상호작용으로부터 응답받은 Data를 View에게 응답합니다.
View는 그 Data를 시각화할 뿐입니다.
Controller는 View에서 일어나는 Action, Event의 input을 받고, 그 값들을 Model에게 전해주기 전에 가공합니다.
가공된 데이터를 Model에 넘겨주게되면, Database에서 정보를 가져오거나, Model 스스로 데이터를 처리한 경우, Controller에게 그 데이터를 반환합니다.
Controller는 Model로 받은 데이터를 View로 전해주기 전에, View가 인식할 수 있도록 데이터를 가공합니다. 그 가공된 데이터를 View에게 돌려주게 됩니다.
View는 그 데이터를 시각화하게 됩니다.
이 세가지 모델이 위와 같이 수행됩니다.
Browser에서 어떤 이벤트가 발생되면, Router로 분기를 합니다. Router는 각 엔드포인트에 정해진 Controller를 호출합니다.
Controller는 View로 바로 데이터를 보내줄 수 있고, Model을 거쳐 Data를 받아 View에게 데이터를 반환하는 형태입니다.
ORM은 Model을 기술하는 도구입니다. 이를 통해 데이터베이스와 프로그래밍 언어 사이 개념의 간극을 줄입니다.
ORM을 사용하여 SQL문을 직접 작성하지 않고 엔티티들을 객체로 표현할 수 있습니다.
관계형 데이터베이스에서 필드는, Javascript 객체에서의 각 속성이라 볼 수 있습니다.
관계형 데이터베이스에서 Join Table의 경우, 객체 지향 프로그래밍에서 배열로 조회가 가능합니다.
객체 지향으로 데이터를 다루는 방법과, 관계형 데이터베이스에서 데이터를 다루는 방법이 서로 다릅니다.
그래서, 관계형 데이터베이스가 불편하고, Javascript가 익숙하다면 ORM을 이용해 관계형으로 사고하지 않고 관계형 데이터베이스에 접근할 수 있습니다.
관계형 데이터베이스에 접근하는 방법 자체를 프로그래밍 언어의 관점에서 맞출 수 있도록 도와주는 것이 ORM이라 할 수 있겠습니다.
SQL문을 사용하지 않고, 데이터베이스에 접근할 수 있는 것이 큰 장점입니다.
Sequelize는 Promise 기반의 Node.js ORM 입니다.
지원하는 관계형 데이터베이스는 아래와 같습니다.
다양한 관계형 데이터베이스가 있는데, 이 관계형 데이터베이스들 간의 SQL문이 조금 다른 경우가 있습니다. 어떤 필드의 속성을 지정할 때, MySQL에선 String을 varchar(255)
으로 정의하는데, 다른 관계형 데이터베이스의 경우 다를 수 있습니다.
이런 것들을 Sequelize가 맞춰줍니다. 그래서, Javascirpt 코드만 작성하는 것으로 데이터베이스의 다양한 종류를 사용할 수 있습니다.
동일한 ORM 코드를 사용하는 것으로, 데이터베이스간 호환성을 신경쓰지 않아도 되는 장점이 있습니다.
Sequelize 모듈을 require
로 가져오고, 인자의 첫번째로 Database, 두번째로 username, 세번째로 password를 전달하여 db
를 정의합니다.
이후 .define()
을 이용해 엔티티를 생성합니다.
숫자, 문자열 타입을 지정할 때, 직관적으로 INTEGER
, STRING
으로 정의할 수 있습니다.
또한 각 엔티티별 id
는 Primary key입니다. 이 id
는 엔티티를 생성할 때, Sequelize가 자동으로 생성합니다.
추가적으로 created_At
, update_At
필드들도 자동으로 생성합니다.
이후, Promise를 이용해 CRUD를 수행할 수 있습니다. 예시는 위와 같습니다.
에러를 핸들링할 때도, Promise에서 에러를 핸들링할 때와 같이 마지막에 .catch()
를 추가하는 것으로 수행할 수 있습니다.