MVC의 M은 어디에 있습니까?


14

내 응용 프로그램을 MVC로 리팩토링하려고하지만 M 부분에 붙어 있습니다.

데이터베이스 기반 앱에서 모델은 앱 코드로 구현됩니다.

그러나 데이터베이스에 무엇이 있는가? 그것은 모델이 아닌가?

(데이터베이스를 단순한 객체 저장소로 사용하지 않습니다. DB의 데이터는 엔터프라이즈 자산입니다).


I'm not using the database as a simple object store. 나는 그것이 저장 프로 시저의 형태로 데이터베이스의 일부 비즈니스 논리를 의미한다고 생각합니다. 이론적으로는 MVC에 반대하지만 실제로는 중요하지 않습니다.
yannis

@YannisRizos -이 있습니다 DB를에 BL,하지만 난 그 의미하는 것은 내가 DB의 데이터가 응용 프로그램을 넘어 의미 생활을 할 것입니다.

3
I want the data in the DB to have a life and meaning beyond the application.뭐?
yannis

2
@YannisRizos-그 진술을 리팩토링하는 데 도움을 주셔서 감사합니다. 데이터는 엔터프라이즈 자산입니까? 앱에 속하지 않으므로 앱 에서 다른 앱의 데이터를 매우 재사용하기 어려운 경우 앱을 매우 쉽게 만드는 비정규 화 모델을 만들 수 없습니다 . 어떤 제안?

1
기존에 공유해야하는 형식이있는 경우에는 문제가되지 않으며, 이는 저장소 형식에 대한 요구 사항의 일부가됩니다. 미래에 다른 형식으로 필요한 것은 ETL 작업이 있거나 DAL로 변환 할 수 있습니다.
StuperUser

답변:


46

그러나 코드와 데이터베이스의 모델은 모두 "모델"입니다.

모델은 응용 프로그램 "IS"와 관련이 있으며 컨트롤러는 "실행"입니다. 데이터베이스에 대한 직접적인 지속성을 다루는 모든 코드는 모델로 간주됩니다.

참고 : MVC는 패턴 이므로 과도하게 생각하지 마십시오. MVC를 올바른 방식으로 수행하는 것은 쉬운 일이지만, 결국은 마음가짐 일뿐입니다! 즉, 비즈니스 로직을 데이터베이스와 UI에서 유지해야합니다. MVC 이전에는 사람들이 서버에 있어야 할 때 웹 페이지에 비즈니스 로직을 모두 배치했거나 지속성 코드와 함께 비즈니스 로직을 수행하는 데이터베이스에서 많은 스크립트를 실행했습니다. MVC는 사람들이 코드를 재사용 할 수있는 방식으로 생각을 시작하게 만들었으므로 세부 사항에 너무 신경 쓰지 마십시오.


15
C와 V의 관점에서 데이터베이스가 있다는 것은 M의 구현 세부 사항 일 뿐입니 까?

명확히. 멋지게 표현되었습니다.
herby December

3
@MattFenwick C 및 V의 관점에서 데이터베이스는 없습니다. 데이터베이스를 데이터 스토리지 이상으로 사용하고 있습니다. MVC 용어로 데이터베이스는 데이터 스토리지 일뿐입니다. 그러나 응용 프로그램에 적합하다면 완벽하게 좋습니다.
yannis

5
"하지 overthink MVC을"에 대한 한
하비에르

2
이 - "데이터베이스 및 UI에서 비즈니스 로직을 유지"
데이비드 머독

17

Trygve Reenskaug는 1978 년에 MVC 패턴을 설명 하는 초기 논문을 썼습니다 . 그의 설명에서 모델은 실제 객체, 현상 및 개념을 나타내는 객체 모델이었습니다. 데이터베이스 기반 응용 프로그램의 시나리오에서 모델은 데이터의 투영입니다. 간단히 말하면 모델은 응용 프로그램과 관련된 클래스와 관계입니다.

실제로 MVC에는 일반적으로 도메인 모델 (데이터베이스에 매핑되는 항목)과 응용 프로그램 모델 (오늘 용어에서 뷰 모델이라고도 함)의 두 가지 모델이 사용됩니다. 응용 프로그램 모델은 뷰를 렌더링하기위한 뷰 특정 데이터도 포함하는 도메인 모델의 투영입니다. 이 접근 방식을 MMVC 라고 합니다 . 컨트롤러는 도메인 모델과 직접 상호 작용하고 애플리케이션 모델을보기에 제공합니다. MVVM 패턴에서 애플리케이션 모델과 컨트롤러가 결합됩니다.


+1 :이 답변이 가장 좋습니다. The model is a projection of your data.데이터베이스는 데이터를 액세스하고 인덱싱하기위한 가장 효율적인 방식으로 데이터를 저장하도록 설계되었습니다. 대신 비즈니스 도메인을 중심으로 모델을 설계해야합니다.
Joel Etherton

파싱하는 데 시간이 걸렸습니다 the Domain Model (what's mapping to your database). 좋은 대답입니다!

2
+1 이것은 MVC가 발전시킨 다양한 맛에 대한 훌륭한 설명입니다.
Ryan Hayes

고마워 나는 책을 쓰는 동안이 일에 깊이 빠져 들었다. 말이 되니 다행입니다!
Michael Brown

3
  1. MVC에는 데이터베이스가 필요하지 않습니다. 모델이 데이터베이스와 대화하는 경우 좋습니다. 또한 플랫 파일로 유지되거나 전혀 유지되지 않을 수 있습니다.

  2. 모델은 데이터가 응용 프로그램의 메모리에 저장되는 위치입니다. 또한 모델을 사용하여 데이터에 대한 계산 및 유효성 검사를 수행하려고합니다. 예를 들어, 금리, 용어 및 원칙과 같은 특성을 가진 FinancePayment 모델이 있습니다. 모델에 getMonthlyPayment () 메소드를 추가하여 월별 지불을 계산할 수 있습니다. 컨트롤러 또는보기에서 그렇게하고 싶지 않습니다.

  3. 로직이 전혀 없거나 간단한 데이터 바인딩 만 사용하여 뷰가 합리적으로 어둡습니다 ( Martin Fowler 사이트의 Passive View 및 Supervising Controller 패턴 참조 ). 사용자가 버튼을 클릭하는 등의 작업을 수행하면보기에서 이벤트가 발생합니다.

  4. 컨트롤러는 이벤트를 처리하고 (사용자가 저장 버튼을 클릭 할 때 일부 코드를 실행) 모델 속성을 설정하고 모델에로드 및 저장 (지속성을 사용하는 경우)을 지시합니다. 컨트롤러는 모델 데이터를 계산하지 않아야합니다. 그러나 컨트롤러에서보기를 대신하여 "if model.profit () <0 then widget.colour = 'red'"와 같은 일부 계산을 수행 할 수 있습니다.

  5. 모델을 변경하지 않고 모델의 기능을 잃지 않고 응용 프로그램의 명령 줄 버전으로 전환 할 수 있어야합니다.

ㅏ. 컨트롤러 또는 모델이 아닌보기 만 전환하여 데스크톱 버전과 달리 모바일 버전의 애플리케이션으로 전환 할 수 있습니다. GUI 테스트 프레임 워크없이 모델 및 컨트롤러를 단위 테스트 할 수 있어야합니다.


바로! 이것은 매우 분명하다.

2

모델은 프런트 엔드에서 V 및 C에 연결되고 백엔드에서 영구 저장소 (파일에서 SQL / NoSQL 데이터베이스에 이르기까지)에 연결된 코드입니다. db에서 저장하고 db로 저장하는 코드 일뿐만 아니라 (모델의 오해 중 하나임) 실제로 모든 "도메인"작업을 수행하는 코드입니다. 선택, 필터링, 변경, 계산, 결정 데이터. 응용 프로그램의 비 UI 논리를 모두 포함합니다.


지속적으로 유지하려는 원시 데이터입니다. 귀하의 모델에 가장 적합한 조직. 이 모델은 애플리케이션 로직을 실시간으로 만드는 API입니다. 그 데이터베이스는 (비 생물) 데이터를위한 스토리지입니다. 앱이 가능하다면 (어떤 종류의 앱인지 모르겠습니다) "데이터베이스 지원 앱"으로 생각하지 말고 데이터베이스를 방법으로 사용하는 "앱"만 생각하십시오. 모듈 데이터를 유지합니다. 많은 문제는 데이터베이스의 "아이콘 화"에서 비롯됩니다. 이는 모델의 데이터 저장소에 지나지 않습니다. 도랑을 제거하거나 구조를 변경하거나 도움이 될 경우 교체 할 수 있습니다.
herby

(위의 내용은 db의 데이터가 다른 응용 프로그램과 공유되지 않는 시나리오에 대해서만
적용됨

내 의견으로는 가난한 단어 선택에 대해 사과드립니다 . MVC와 관련 하여 데이터베이스에 무엇이 있는지 잘 모르겠다는 것 입니다. 데이터베이스가 MVC 외부에 있습니까? 모델의 일부입니까? V 또는 C의 일부입니까 (아마 그렇지는 않지만 요점을 얻습니다).

내가 참조. 아마도 내 대답에서 모델의 코드가 처리하는 응용 프로그램 데이터를 유지하는 역할을하는 모델의 일부임을 알 수 있습니다. (편집 참조) : 해당 데이터베이스가 응용 프로그램보다 오래 지속되어야하는 데이터베이스 인 경우 데이터베이스를 외부 서비스로보고 모델과 통신하고 계산을 위해 데이터를 가져 와서 다시 보내십시오.
herby December

극단적 인 경우, 비즈니스 로직이 DB 자체에있을 때 대부분 DB에 릴레이되는 매우 얇은 모델을 가지거나 db 모델 이라고 말할 수도 있습니다 (그러나 모든 로직을 가져야 함 ).
herby December

2

매우 단순하고 이상적인 견해를 취합니다.

모델은 일반적으로 데이터 모델이 아니라 도메인 (대개 비즈니스)의 모델로 표시됩니다. 이것들 비슷해 보이지만 서로 완전히 연결되어 있지는 않습니다.

뷰는 응용 프로그램 프런트 엔드의 모델이어야하며 컨트롤러는 한 뷰에서 다른 뷰로의 흐름 모델이어야합니다.

비즈니스 로직은 데이터베이스에 있든 코드에 있든 모델에 완전히 캡슐화되어야합니다. View 또는 Controller에서 일부 비즈니스 로직이 반복 될 수 있지만 여러 가지 이유로 이러한 두 구성 요소를 완전히 제거하고 다른 프런트 엔드를 제자리에 배치하는 것이 가능하고 안전해야합니다.


1

내가 이해하기에 MVC는 클라이언트 응용 프로그램의 아키텍처 패턴에 대한 설명 일뿐입니다. Wikipedia의 그림은 다음과 같습니다.

http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

물론 응용 프로그램의 일부가 "저장 프로 시저"로 구현 된 경우 해당 데이터베이스 코드는 모델의 일부이거나 컨트롤러의 일부일 수도 있습니다 (코드의 기능에 따라 다름). 그러나 그렇지 않다면 데이터베이스는 분명히 "MVC 외부"입니다.


1
But then, what is in the database -- is that not also the model?

전혀 그렇지 않다. " 모델 은 애플리케이션 도메인의 동작 및 데이터를 관리합니다." 모델이 데이터베이스에 연결되는 경우가 종종 있지만 요구 사항은 아닙니다. 모델은 응용 프로그램과 데이터베이스 사이 의 새로운 계층입니다. 백엔드는 일련의 Mock 객체, XML 또는 데이터 지속성을 지원하는 다른 것일 수 있습니다.

계층을 분리하면 더 나은 단위 테스트 방법을 사용할 수있는 유연성이 훨씬 커지고 코드의 관리 용이성 (EG SQL이 Oracle으로 대체 됨)을 다른 이점과 함께 활용할 수 있습니다.

컨트롤러도 마찬가지입니다. MVC는 컨트롤러를 두 계층 사이의 중개인으로 정의합니다. MVC에는 "비즈니스 계층"이 정의되어 있지 않습니다. 오히려, 당신은 당신 자신을 추가합니다. MVC는 대부분의 응용 프로그램을 구축하는 데 필요한 모든 계층을 캡슐화하지 않습니다. 기본 구조에 대한 일반적인 지침 일뿐입니다.

이러한 분리는 제어 역전 기능을 가능하게하는 핵심 요소입니다.


우수하고 유익한 답변을 얻으려면 +1; 그러나, 나는 마지막 문장이 해명 될 가치가 있다고 제안합니다. IoC가 반드시 널리 알려지고 이해되는 것은 아니기 때문에 약간의 혼란이 생길 ​​수 있습니다. 당신이 의미하는 바에 대한 정말 유용한 설명은 아마도 정상적인 SE 답변의 범위를 넘어서는 것이지만, 나에게 튀어 나왔습니다.
Adam Crossland

그러나 비즈니스 로직을 스토어드 프로 시저에 배치하면 데이터베이스에 모델이 포함됩니다. (개인적으로는 그 방법을 권장하지 않습니다.)
Roy Tinker

1
@ 로이 팅커-아뇨, 그건 중요하지 않습니다. 모델은 개념적으로 분리되어 있습니다. 계층 내 어딘가에 데이터베이스와 통합되는 엔터티가 있습니다. 이러한 엔티티는 다른 관계가있는 모델 내에 존재하는 다른 엔티티 (예 : 모의)와 분리되어 있어야합니다. 컨트롤러는 데이터의 출처와 방법을 모르는 방식으로 모델을 호출해야합니다. 오히려이 결정은 의존성 주입과 IoC (기본적으로 다른 백엔드, 조롱 또는 DB에 연결될 수있는 인터페이스)로 이루어져야합니다.
P.Brian.Mackey


0

실제로 "모델"은 데이터 인터페이스의 추상화를 나타냅니다. 그 이유는 다음과 같습니다.

  • 데이터베이스는 Model의 일부로 간주 되지만 모델 자체는 아닙니다.
  • 모델의 데이터는 데이터베이스, 파일, 웹 서비스에서 가져 오거나 조롱 할 수 있습니다.
  • MVC, HMVC 또는 이와 유사한 프레임 워크의 모델 클래스쿼리를 저장해야합니다 ( "지방 모델, 스키니 컨트롤러" 원칙 [ 1 ] [ 2 ] [ 3 ] 참조)

그리고 만약 내가 맞다면 – 누군가가 MVC 컨텍스트 외부의 모델을 언급 할 때, 누군가 가 데이터구조 (예 : 스키마 )를 언급 할 가능성이 높습니다 .


0

M에는 논리가 포함되어 있고 데이터를 DB에 저장한다고 생각합니다. 컨트롤러는 실행할 모듈을 호출하고이 모듈은 로직을 실행하고 DB에 데이터를 저장 한 후 (영구 계층이있을 수 있음)이 모듈은 값을 V로 반환합니다.


0

MVC의 M (odel)은 한 곳에서 비즈니스 / 도메인 의 모델 을 캡처해야합니다 .

도메인의 비즈니스 규칙 과 구조 가 이상적으로 포함되어야합니다 .

C (controller)는 비즈니스 모델의 정보를 프리젠 테이션 (예 : 뷰)에 중재하고 V (iew)에서 사용자 입력을 캡처하여 모델 상태의 변경을 시작하는 것에 이상적입니다.

데이터베이스 계층은 특정 시점에서 모델 상태의 지속성을 처리합니다 (또는 처리해야합니다).

따라서 그것은 무언가가 아니다 속한 하나에 모델 또는 컨트롤러 MVC 패턴의 일부가 아니라, 그것은 외관의 함수로 (투명 모델에 변화를 지속하여 암시 적으로 구현 될 수있는 완전히 별개의 관심사는을 제공한다 컨트롤러와 모델과의 상호 작용) 또는 모델에 대한 변이를 완료 한 후 컨트롤러가 명시 적으로 호출하는 것보다 자주 수행됩니다.


0

이상적인 세계의 모델에는 비즈니스 로직 만 포함되어야하며 하우스와 같은 실제 객체를 모델링합니다. 그러나 거의 모든 상황에서 모델은 데이터를 일부 스토리지에 유지해야합니다.

모델과 저장된 데이터 간의 상호 작용은 별도의 데이터 계층에서 또는 모델에서 직접 발생할 수 있습니다 (ORM (Object Relational Mapper) 사용시). 다시 말해, 모델은 데이터베이스에 직접 연결되거나 데이터베이스에 연결되는 다른 "데이터 액세스"개체로 데이터를 전달합니다.

ORM (Object Relation Mapper)은 데이터베이스 테이블의 필드를 모델 오브젝트의 속성에 맵핑하여 게터 및 세터를 제공합니다. 이 경우 별도의 데이터 계층이 없으며 모델은 데이터를 직접 유지해야합니다.

다음은 ActiveRecord널리 사용 되는 ORM을 사용하는 Ruby 예제입니다 .

class House < ActiveRecord::Base
end

house = House.new
house.price = 120000
house.save

Pricegetter 및 setter를 오브젝트에 추가하여 houses자동으로 감지되는 테이블 의 필드입니다 ActiveRecord. 때 save호출되는 가격 속성의 값은 데이터베이스에 유지됩니다.

내 관점에서 볼 때 데이터 레이어를 사용하는 전문가는 모델에 도달하기 전에 데이터를 조작 할 수있는 지점을 확보하고 모델에 대한 걱정이 적고 책임이 적다는 점입니다. 예를 들어, 호환되지 않는 여러 데이터 소스의 데이터를 결합해야 할 수도 있습니다. 이는 ORM이 쉽게 처리 할 수없는 것입니다.

주요 단점은 관리해야 할 또 다른 추상화 계층이며, 필요하지 않은 경우 간단하게 유지하십시오. 움직이는 부품이 적고 잘못 될 가능성이 적습니다.


-1

그래 당신 말이 맞아요.

(모델 뷰 컨트롤러)

사용자 인터페이스 (보기) 및 처리 (컨트롤러)와 데이터 (모델)분리하는 응용 프로그램을 구축하기위한 아키텍처입니다 .

실제로 MVC 뷰와 컨트롤러는 밀접하게 관련되어 있기 때문에 종종 단일 객체로 결합됩니다. MSDN 에 따르면

컨트롤러는 사용자의 마우스 및 키보드 입력을 해석하여 모델 및 / 또는 the view to change as appropriate.

이 다이어그램을 확인하십시오.

여기에 이미지 설명을 입력하십시오

예를 들어, 컨트롤러 코드는 데이터 요청의 유효성을 검사하고 뷰에서 반환되도록합니다. 뷰 컨트롤러 객체는 하나의 모델에만 연결됩니다. 하나,a model can have many view-controller objects associated with it.


4
In practice, MVC views and controllers are often combined into a single object because they are closely related.그렇게하고 있다면 잘못하고있는 것입니다.
yannis

다이어그램은 어디에서 왔습니까? 그리고 정의는 어디에서 왔습니까? 적절한 속성없이 인터넷에서 붙여 넣기를 복사하지 마십시오.
yannis

@Yannis Rizos-그는 MS 문서를 인용하고 있습니다. 여기서는 문맥에 약간의 차이가 있지만 웹이 아닌 응용 프로그램에는 종종보기 / 컨트롤러가 결합되어 있지만 웹 응용 프로그램에는 매우 분명한 차이점이 있습니다. 이것은 아마도 MS가 Windows 응용 프로그램 (MVVM 대신)을 MVC로 푸시하지 않고 웹 응용 프로그램을 보는 이유 중 하나 일 것입니다. msdn.microsoft.com/ko-kr/library/ff649643.aspx
P.Brian.Mackey

1
@ P.Brian.Mackey의 I 의심 MS는이 뒤에 어떻게 든했다 : P
야 니스

@ P.Brian.Mackey 링크를 포함하도록 귀하의 답변을 편집했습니다. 외부 소스를 인용해도 괜찮지 만 링크를 포함시켜야합니다. 또한 MVVM은 MVC와 매우 유사하지만 동일한 패턴은 아닙니다. MVC에서 뷰와 컨트롤러를 단일 객체로 결합해서는 안됩니다.
yannis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.