[데이터베이스] MVC
디자인 패턴중 하나인 MVC패턴
디자인패턴이란 : 약속,규약을 통해서 쉽게 쓸수있는 형태로 만든것이다. 구체적으로 말해보자면, 프로그래밍 개발중 생길수 있는 문제점들을 정리해서 상황에따라 간편하게 적용해서 쓸 수있는것을 정리하여 특정한 규약을 통해 쉽게 쓸수있는 형.태 로 만든것
앱 만들때,
1. 유지보수가 쉽고
2. 다른 사람이 알아볼수 있게
1,2를 위해서 어떤 방식을 쓸까? <= 클래스를 이용하여 코드를 짠다. <= 라이브러리, 프레임워크가 이런방식으로 되어있다.
"좀 더 쉽고 편리하게" 사용할 수 있게 만든 특정한 방법들을 디자인 패턴이라고 합니다.
MVC란?
M: model
V: view
C: controller
- 사용자가 웹사이트에 접속한다. (Uses)
- Controller는 사용자가 요청한 웹페이지를 서비스 하기 위해서 모델을 호출한다. (Manipulates)
- 모델은 데이터베이스나 파일과 같은 데이터 소스를 제어한 후에 그 결과를 리턴한다.
- Controller는 Model이 리턴한 결과를 View에 반영한다. (Updates)
- 데이터가 반영된 VIew는 사용자에게 보여진다. (Sees)
위 그림을 분석해보면,
1.사용자가 Controller부분을 조작하면 Conroller는 Model을 통하여 데이터를 가져온다.
2. Controller는 가져온 데이터를 바탕으로 View를 제어한다. 이후 사용자에게 전달한다.
모델 => 컨트롤러에게 , 컨트롤러 => 뷰에게 , 뷰 => 사용자에게 => 사용자 컨트롤러 조작 => 컨트롤러는 모델을통해 데이터가져옴
이렇게 영향을 끼치게되는 구조를 잘 생각해야한다.
이것이 MVC패턴이다.
MODEL
어플리케이션의 정보, 데이터를 나타낸다.
데이터베이스, 처음정의하는 변수, 초기값 등을 뜻하고 정보의 가공을 책임지는 컴포넌트다.
모델의 규칙.
1. 가공(편집)할 모든 데이터를 가지고있어야한다.
: 화면에 네모박스에 글자가 나타난다면 ? 네모박스의 화면위치정보, 네모박스의 크기정보, 글자내용 글자 위치,글자의 포맷정보 등등 가져야한다.
2. 뷰나 컨트롤러에 대해서는 어떤것도 알지 못해야한다.
: 컨트롤러를 통해 데이터변경이 일어날 시 뷰를 참조하는 내부 속성을 가지면 안된다. (UI를 수정할 코드가없어야한다.)
3. 변경이 일어나면 변경통지에대한 처리방법 코드가 있어야한다.
: 모델의 속성중 텍스트 정보가 변경되었다고 치면 이벤트 발생시켜 누군가에게 전달 or 누군가 모델을 변경시키는 이벤트를 모델에게 보냈을때 이를 수신할 수있는 코드가 있어야한다. 또한. 모델은 재사용가능해야한다.
VIEW
input, 텍스트,체크박스 항목 등, 사용자의 인터페이스 요소.
데이터를 기반으로 사용자가 볼 수 있는 화면!
뷰의 규칙
1. 모델이 가지고있는 정보를 따로 저장하면 안된다.
: 화면에 글자 표시하려면 정보를 전달받긴 하겠지만 따로 저장해선 안된다. 화면에 표시하는 명령을 받을 뿐 그릴때 필요한정보저장 노.
2. 모델처럼 다른 구성요소에 대해서 몰라야한다.
: 자기역할, 화면에 보여주는 역할만 하면된다.
3. 변경이 일어나면 변경통지에대한 처리방법 코드가 있어야한다.
: 모델과 같다. 사용자가 화면에 표시된것을 변경하면, 모델에게 전달. 모델이 변경해야하는데
전달하는 코드가 있어야한다. 이 코드는 재사용성이있어야하며, 알아보기 쉬워야한다.
Controller
모델,뷰의 다리역할
사용자가 데이터를 클릭하고 수정? <= 이런 이벤트처리를 담당.
컨트롤러의 규칙
1. 모델이나 뷰에대해서 알아야한다.
: 모델 뷰는 서로의 존재를 모르고, 변경 통지방법만 가지고있을뿐인데, 컨트롤러는 얘네의 다리역할이므로 이 둘에 대해서 알아야한다.
2. 모델이나 뷰의 변경을 모니터링해야한다.
: 변경통지를 받으면 변경해주기위해서 변경해달라는 코드를 모델이나 뷰에게 날릴것이다. 그러므로 계속 주시해줘야한다.
애플리케이션의 메인 로직은 컨트롤러가 담당.
MVC수도코드
http://yourapp.com/users/profile/1
//routes
users/profile/:id = Users.getProfile(id)
//controlls
class Users{
function getProfile(id){
profile = this.UserModel.getProfile(id)
renderView('users/profile',profile)
}
}
//models
Class UserModel{
function getProfile(id){
data = this.db.get('SELECT * fROM users WHERE id = id')
return data;
}
}
//views
//users
//profile
<h1>{{profile.name}}</h1>
<ul>
<li>Email: {{profile.email}}</li>
<li>Phone: {{profile.phone}}</li>
</ul>
MVC 패턴에 의의
MVC패턴은 결국 "어떻게 나눌 것인가"에 대한 해답 중 하나. 어떤 특정한 역할들에 대해 역할분담을 할 때 가이드라인을 제시하는 방법 중 하나가 바로 MVC패턴