MVC, 즉 Model, View, Controller라는 영역으로 나누면 딱 좋다라는 것을 알게 되었습니다.
UI에서 가장 중요한 것은 역시 화면이죠.
첫번째는 우리가 제일 쉽게 이해할 수 있는 부분! 바로 이 View입니다.
웹 프론트에서는 대개 최종적으로 HTML과 CSS로 만들어지는 결과물을 의미합니다.
V(View)는 html, css로 만들어진 말 그대로의 화면을 말합니다.
소프트웨어가 멈춰있는 화면만 있으면 디자인과 다를 게 없겠죠.
화면에의 어딘가는 실제의 데이터가 반영이 되어 나타나야 합니다.
이러한 데이터를 주관하는 영역을 Model이라고 부릅니다.
이 Model의 범주는 아키텍쳐에 따라 달라집니다.
javascript의 Object일 수도 있고,서버의 API로 받는 데이터일수도 있고,서버에 있는 DB일 수도 있습니다.
어쨌든 화면이 아닌 소프트웨어가 다뤄야할 중요한 데이터 영역입니다.
M(Model)은 ajax
를 통해 받은 데이터
와 그 데이터를 통해 변경될 수 있는 상태
를 말합니다.
UI 소프트웨어의 본질은 단순합니다. 우선 데이터를 화면에 그립니다. 그리고 우리가 어떤 동작을 취하면 데이터가 바뀝니다. 데이터가 바뀌면 다시 화면이 바뀌겠죠.
- 이렇게 Model의 데이터를 받아서 화면에 그리고, 화면으로 부터 사용자의 동작을 받아서 Model을 변경합니다.
- 이러한 Model과 View사이의 중간 역할을 하는 것을 Controller라고 합니다.
- MVC가 이렇게 나눠진 이유는,
화면을 다루는 문제와 데이터를 다루는 문제의 성격이 달라서 분리하고 싶고Model과 View간의 의존관계를 최소화 해서 화면의 수정이 데이터수정에 영향을 미치지 않고 데이터 수정이 화면의 수정에 영향을 미치지 않고자 함입니다.
웹 프론트엔드라는 개념도 없던 웹 서비스 초창기 시절의 MVC는
- 데이터베이스를 Model로 취급하고
- HTML과 CSS, 그리고 javascript까지 포함한 클라이언트 영역을 View로
- 그리고 가운데서 라우터를 통해 데이터를 처리하고 새로운 HTML을 만들어서 보여주는 백엔드 영역을 Controller라고 취급했습니다.
그러다가 프론트엔드의 역할이 추가되고 특히 ajax라는 기술이 만들어지면서 이제는 HTML을 서버에서 직접 만들 필요가 없게 되었습니다.
- ajax로 부터 받는 데이터를 Model로 취급합니다.
- HTML과 CSS로 만들어지는 화면을 View로 취급합니다.
- javascript가 중간에서 서버의 데이터를 받아서 화면을 바꾸고 이벤트를 처리해서 서버에 데이터를 전달하는 Controller의 역할을 수행하게 됩니다.
View
의 버튼을 통해 이벤트를 호출할 것입니다.Controller
가 서버에 데이터를 요청하든지 상태를 직접 변경하든지 Model
을 변경합니다.Model
이 변경되면 View
에 변경된 Model
을 반영해줍니다.Model
은 직접 View
를 변경할 수 없고, Controller
를 통해 변경해야 합니다.View -> Controller -> Model -> Controller -> View
형태입니다.Model, View, Controller
는 각각의 의존관계를 가지고 있기 때문에 코드를 작성할 때, 유지보수가 쉽고 코드의 흐름을 예측할 수 있어서 원하는 부분을 찾기 수월해집니다.// Model
let state = 0;
const $button = document.querySelector('button');
// View
const render = () => {
document.body.innerHTML = state;
};
// Controller
const setState = newState => {
state = newState;
render();
};
$button.addEventListener('click', () => {
setState(state + 1);
});
button
을 클릭하면 button에 바인딩된 함수가 호출되면서 setState
setState
함수는 Model인 state
의 값을 변경하고, render
함수를 호출하는데 DOM에 직접 접근하여 View영역을 변경해준다.View
영역의 button
에 접근했는데, Controller
와 Model
을 순차적으로 거쳐 View
Model
class User {
constructor(name, email) {
this.name = name;
this.email = email;
}
save() {
// Code to save user data to a database or API
}
update() {
// Code to update user data in the database or API
}
delete() {
// Code to delete user data from the database or API
}
}
View
<!-- HTML template for displaying user information -->
<div id="user-info">
<h1 id="user-name"></h1>
<p id="user-email"></p>
</div>
// JavaScript code to update the View with user data
function updateUserView(user) {
document.getElementById('user-name').innerText = user.name;
document.getElementById('user-email').innerText = user.email;
}
Controller
// JavaScript code for handling user interactions and updating the Model and View
class UserController {
constructor(model, view) {
this.model = model;
this.view = view;
}
updateUser(name, email) {
// Update the Model with new data
this.model.name = name;
this.model.email = email;
// Save the updated data
this.model.save();
// Update the View to reflect the changes
this.view.updateUserView(this.model);
}
}
// Usage:
const user = new User('John', 'john@example.com');
const view = new UserView();
const controller = new UserController(user, view);
// Update user data and trigger View update
controller.updateUser('Jane', 'jane@example.com');
// Model (Data)
const dataModel = {
counter: 0
};
// View (User Interface)
const view = {
displayCounter: function(counter) {
document.getElementById('counter').textContent = counter;
}
};
// Controller (Logic)
const controller = {
incrementCounter: function() {
dataModel.counter++;
view.displayCounter(dataModel.counter);
},
decrementCounter: function() {
dataModel.counter--;
view.displayCounter(dataModel.counter);
}
};
// Event Listeners
document.getElementById('incrementBtn').addEventListener('click', controller.incrementCounter);
document.getElementById('decrementBtn').addEventListener('click', controller.decrementCounter);
view
가 UI에 업데이트된 카운터 값을 표시합니다.{{ }}
, <?= ?>
, <%= %>
와 같은 치환자로 통해 선언적으로 편하게 개발을 하는 반면 jQuery의 경우 전체 html를 갱신했다가는 번쩍거리는 화면을 맛볼 수 있으니 수정해야 할 부분을 일일히 찾아서 수정을 해줘야 했습니다.