MVC 시스템에서 데이터베이스 지속성 코드는 어디에 있어야합니까?


21

데이터베이스에 정보를 유지하기위한 여러 구성을 보았습니다. 일반적으로 세 가지 유형의 디자인이 세계 곳곳에서 일반적으로 보입니다.

  • 컨트롤러는 지속성을 관리합니다
  • 지속성을 관리하는 모델
  • 타사 라이브러리는 지속성을 관리하며 일반적으로 모델에 대한 일종의 주석이 필요합니다.

개념적으로 MVC 아키텍처와 가장 사용하기 쉽고 호환되는 구성이 궁금합니다.

(제가 목록에없는 것이면 답변의 일부로 빠른 개요 / 개요를 제공하십시오)

답변:


13

두 번째와 세 번째 옵션은 동일합니다. MVC의 M은 데이터 모델이 아니라 도메인 모델입니다. 여기에는 직접 또는 ORM을 통한 지속성도 포함되며 완벽하게 정확합니다.

컨트롤러는 사이트의 흐름을 관리하고 처리 할 도메인 (때로는 서비스 계층을 통해)으로 물건을 전달하여 잘못되었거나 적어도 의미 적으로 불편한 상황이 지속됩니다.


2
어느 정도 동의하지 않습니다. 지속성의 구체적인 활용은 응용 프로그램 논리이므로 도메인 계층이 아닌 응용 프로그램 계층에 속합니다. 도메인 계층 (도메인 모델 포함)은 일반 비즈니스 프로그램의 지속성을 무시해야합니다. 컨트롤러 는 오케 스트레이터 입니다. (데이터) 서비스, UI 및 도메인 모델을 오케스트레이션 할 수 있습니다.
팔콘

1
@Falcon : 컨트롤러가 데이터가 데이터베이스에서로드되고 데이터베이스에 유지되는 시기를 제어해야하지만 모델에게 그렇게 지시하는 것은 완벽합니다. ORM (표준 또는 롤-자체)을 사용한다는 것은 일반적으로 모델에로드 / 저장하도록 지시 한 다음 ORM에 위임하는 것을 의미합니다. 또 다른 방법은 컨트롤러가 ORM에게 모델 클래스를 전달하는 무언가 (로드 할 선택 기준 포함) 또는 저장할 모델 인스턴스를로드 / 저장하도록 지시하는 것입니다. 어느 쪽이든 실제 로딩 / 저장은 모델과 밀접한 관련이 있습니다.
Marjan Venema 2013

@Marjan Venema : 예, 동의합니다. 문제는 코드가 어디에 있어야 하는가입니다. 가능한 지속성에 대해 무지한 모델을 유지하려고 노력하고 도메인 엔터티의 동작과 상호 작용 만 모델링합니다. 다른 것은 응용 프로그램 계층에 있습니다 (내 모델의 응용 프로그램이므로). 매핑 정보 / 데이터 액세스는 도메인 모델과 완전히 분리되어 있으며 버전 관리 (업그레이드 / 다운 그레이드)도 처리 할 수 ​​있습니다. 데이터 액세스 응용 프로그램은 서비스, 리포지토리 등을 포함하는 응용 프로그램 계층에도 있습니다.
Falcon

@ 팔콘 : 예, 그것은 좋은 방법이며 과거에 별도의 매핑 클래스를 사용하여 수행 한 방법입니다. 그러나 확장 된 RTTI (Delphi) 및 리플렉션 (.Net 및 기타)의 출현으로 모든 것을 진행하고 코드 후크의 과부하를 사용하기 위해 Business Object Model의 속성 주석과 함께 이들을 사용하는 것에 대한 자격이 없습니다. 데이터베이스 버전 관리를 위해 특별히 코딩 된 초기화 클래스
Marjan Venema 2012

5

현실적으로 MVC는 대부분 UI 구현 패턴이므로 문제는 다소 무의미합니다. 그러나 실제로 큰 그림 옵션은 두 가지뿐입니다. 컨트롤러는 일반적으로 1) 일종의 서비스 계층 또는 2) 활성 레코드 패턴을 사용하여 모델에서 엔티티를로드하거나 저장하라는 요청을 발송합니다.

서비스 계층은 다양한 형태를 취할 수 있지만 개인적 선호는 집계 루트 엔티티에 대한 저장소 추상화를 사용하는 것이지만 구체적인 구현은 일종의 ORM 또는 경량 DAO 또는 응용 프로그램에 적합한 일부 비 관계형 저장소에 대한 API.

활성 레코드 패턴은 모델이 지속성에 대한 책임이 있음을 의미하지만 일반적으로 일종의 기본 클래스가 상점에 대한 맵핑을 관리하므로 모델이 실제로 직접 관련되지는 않습니다.

기본적으로 컨트롤러는 저장소, UnitOfWork 구현 또는 엔티티의 Save 메소드에 대한 호출 여부에 관계없이 오브젝트를 유지하기위한 요청을 발송합니다. 리포지토리를 사용하는 경우 모델 개체는 지속성을 무시합니다.


3

MVC (model-view-controller) 시스템에서 모델에는 데이터가 포함됩니다. 따라서 데이터베이스 지속성이 있어야한다고 생각합니다.


2

내가 본 대부분의 고급 MVC 샘플 infrastructure에는 실제 데이터베이스 구현 코드 (즉, NHibernate, EF 또는 Linq에 대한 특정 호출 또는 데이터 계층이 무엇이든) 가있는 별도의 계층이 있지만 "모델"계층 (종종 "도메인"레이어)에는 데이터 서비스를 정의하는 인터페이스 가 있습니다.


0

MVC의 표준 관행은 M (odel) 레이어에 데이터 구조와 지속성을 포함시키는 것입니다.

모델 계층에는 응용 프로그램에서 사용할 클래스 (POCO 등) 만 포함되지 않습니다. 여기에는 해당 클래스의 저장소가 포함됩니다.

예를 들어 많은 데이터 클래스 인스턴스가있는 저장소는 다음과 같습니다.

Clients repository

AllClients()
RecentClients()
ClientByID(int id)

모델 도메인을보다 효과적으로 구성 할 수 있으며 여러 가지 방법으로 데이터에 액세스 할 수 있지만 여전히 데이터 / 모델 계층은 작고 강력합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.