DTO = ViewModel?


103

내 도메인 개체를 유지하기 위해 NHibernate를 사용하고 있습니다. 단순하게 유지하기 위해 ASP.NET MVC 프로젝트를 프레젠테이션 레이어와 서비스 레이어로 사용하고 있습니다.

컨트롤러 클래스에서 XML로 도메인 개체를 반환하고 싶습니다. Stack Overflow에 대한 몇 가지 게시물을 읽은 후 DTO를 수집하는 것이 좋습니다. 그러나 ViewModel에 대한 게시물도 보았습니다.

내 질문 : 데이터 전송 개체와 ViewModel은 같은 것입니까? 아니면 ViewModel은 DTO의 일종의 하위 패턴입니까?


9
대부분의 답변이 MVVM을 언급하고 ASP.NET MVC로 작업하고 있기 때문에 ASP.NET MVC의 ViewModels가 WPF (MVVM)의 ViewModels와 100 % 동일하지 않다는 것을 언급하는 것이 적절하다고 생각합니다.
Matthijs Wessels 2011

답변:


105

DTO의 표준 정의는 동작이없는 개체의 데이터 모양입니다.

ViewModel은보기의 모델입니다. ViewModel은 일반적으로 하나 이상의 개체 (또는 DTO)의 전체 또는 부분 데이터와보기의 동작에 특정한 추가 구성원 (보기에서 실행할 수있는 방법,보기 요소를 전환하는 방법을 나타내는 속성 등)입니다. 뷰 모델을 뷰와 동작에 대한 모든 데이터로 볼 수 있습니다. ViewModel은 일대일 비즈니스 개체 또는 DTO에 매핑 할 수도 있고 매핑하지 않을 수도 있습니다.

그건 그렇고, NHibernate 프로젝션 은 특정 뷰 모델이 지속 된 객체의 데이터 하위 집합을 필요로하는 경우 유용합니다.


이것을 설명 할 수 있습니까? "DTO는 동작이없는 객체의 데이터 모양입니다"?
roozbeh S

2
의미 ... DTO 클래스는 보통 속성을 포함하고 비즈니스 로직 어떤 방법을 포함하지 않는 등 ...
다니엘 오거

71

ASP.NET MVC 사례의 ViewModel은 DTO와 동일하지만 MVVM의 ViewModel에는 동작이 있지만 DTO에는 없기 때문에 MVVM 패턴의 ViewModel은 DTO와 다릅니다.


4
이것은 좋은 대답입니다. 세부 사항은 짧지 만.

5
asp.net mvc의 ViewModel이 DTO와 같아야하는 이유는 무엇입니까? 말이 안 돼. ViewModel은 DTO가 아닌 동작을 가질 수 있습니다. 이것은 mvc에 의존하지 않습니다.
Elisabeth

8
ASP.NET MVC ViewModel과 MVVM ViewModel을 구별하기 위해 +1.
로널드

5
@Elisa-다소 오래된 질문에 대한 대답은 ASP.NET MVC에서 뷰가 상태 비 저장 방식으로 모델과 뷰를 변경하기 위해 컨트롤러 (ViewModel이 아님)에서 작업을 호출한다는 것입니다. 이 때문에 뷰에 대한 DTO는 본질적으로 ViewModel과 동일합니다. 그러나 다른 직렬화 경계가있는 대규모 시스템에서는 View를 위해 특별히 형성된 ViewModel과 분리되어있는 경우 DTO가 유용 할 수 있습니다.
단산 2014 년

27

DTO! = ViewModel

에서 MVVM의 패턴의 ViewModel이보기에서 모델을 분리하는 데 사용됩니다. 모델을 표현하기 위해 간단한 DTO 클래스를 사용할 수 있으며 , 이는 NHibernate를 통해 다시 데이터베이스에 매핑됩니다. 하지만 DTO로 모델링 된 ViewModel 클래스를 본 적이 없습니다. ViewModel 클래스는 대부분 DTO에는없는 동작을 가지고 있습니다.


2
그래서 DTO는 구조체 일 수 있습니까 (또는 구조체의 기능을 모방해야하는 클래스입니까)?
Max Alexander

20

DTO-데이터 전송 개체는 데이터 전송을위한 컨테이너라고 말한 그대로입니다. 그들은 동작이 없지만 단지 세터와 게터의 무리입니다. 어떤 사람들은 그것들을 불변으로 만들고 기존의 것을 업데이트하는 대신 필요할 때 새로운 것을 만듭니다. 유선을 통해 전송할 수 있도록 직렬화 할 수 있어야합니다.

일반적으로 DTO는 원격 서비스에 대한 호출이 비용이 많이들 수 있으므로 한 계층에서 다른 계층으로 데이터를 전송하는 데 사용됩니다. 따라서 필요한 모든 데이터가 DTO로 푸시되고 하나의 청크 (거친 단위)로 클라이언트로 전송됩니다.

그러나 일부 사람들은 화면 바운드 DTO의 개념을 사용합니다 (프로세스 경계를 ​​넘어서는 것과 관련이 없음). 다시 이것들은 필요한 데이터 (일반적으로 특정 화면에 필요한 데이터이며 다양한 소스의 데이터 집합 일 수 있음)로 채워져 클라이언트로 전송됩니다.

http://blog.jpboodhoo.com/CommentView,guid,21fe23e7-e42c-48d8-8871-86e65bcc9a50.aspx

이미 언급했듯이 간단한 경우에는이 DTO를 뷰에 바인딩하는 데 사용할 수 있지만 더 복잡한 경우에는 ViewModel을 생성하고 DTO에서 ViewModel로 데이터를 언로드해야합니다 (MVVM 패턴 적용시). .

다시 이미 언급했듯이 DTO! = ViewModel

DTO와 ViewModel은 삶의 목적이 다릅니다.


13

첫째, 주요 차이점은 ViewModel이 DTO가하지 말아야 할 동작이나 메서드를 가질 수 있다는 것입니다.

둘째, ASP.NET MVC에서 DTO를 ViewModel로 사용하면 응용 프로그램이 DTO와 밀접하게 연결되며 이는 DTO를 사용하는 목적과 정반대입니다. 그렇다면 도메인 모델 또는 DTO를 사용하는 차이점은 무엇입니까? 안티 패턴을 얻기 위해 더 복잡합니까?

또한 ASP.NET의 ViewModel은 유효성 검사를 위해 DataAnnotations를 사용할 수 있습니다.

동일한 DTO는 서로 다른 ViewModel 매핑을 가질 수 있으며 하나의 ViewModel은 서로 다른 DTO에서 구성 될 수 있습니다 (항상 구성이 아닌 개체 매핑 사용). DTO를 포함하는 ViewModel이 있으면 더 나쁘다고 생각하기 때문에 동일한 문제가 발생합니다.

프레젠테이션 계층에서 DTO를 계약으로 생각하면 응용 프로그램에 대해 낯선 것으로 간주해야하며 제어 할 수없는 개체를 받게됩니다 (예 : 서비스, dto 및 프레젠테이션 계층이 있더라도 당신입니다).

마지막으로 이렇게 깔끔하게 분리하면 개발자가 쉽게 함께 작업 할 수 있습니다. ViewModels, Views 및 Controllers를 설계하는 사람은 다른 개발자가 구현을 완료하면 매핑을 만들기 때문에 서비스 계층이나 DTO 구현에 대해 걱정할 필요가 없습니다. 테스트 용 데이터가있는 프레젠테이션 레이어


1
방금 VS 2012를 설치하고 MVC 4 단일 페이지 응용 프로그램을 살펴 보았습니다. 샘플 프로젝트에서 DTO는 WebApi의 컨트롤러 메서드 (또는 작업)에 대한 매개 변수로 사용됩니다. 즉, JSON이 해당 메서드에 게시되고 일부 MVC 마법으로 데이터가 메서드에 전달되기 전에 자동으로 DTO로 변환됩니다. 이 경우 DTO를 사용하는 것이 잘못되었다고 생각하십니까? ViewModels는 Web API와 함께 사용해야합니까? 나는 여전히 이러한 개념에 익숙하지 않기 때문에 더 잘 이해하기를 요청합니다.
Jean-François Beauchamp 2013 년

Salut Jean-François Beauchamp :) ASP.NET MVC는 URL 유모차를 객체로 구문 분석 할 수 있습니다. 예를 들면 다음과 같습니다.이 매핑이 인덱스 메서드 ajax / index / {jobID} / {ResultsToSkip} / {ResultsToSend} "에 대해 가지고 있다고 가정합니다. Controlle Index (int jobID, int ResultsToSkip, int ResultsToSend) I will have Index (request) (request is an object that encapsulate three fields jobID ...) 그래서 이제 params 대신 캡슐화하는 개체를 사용하여 응용 프로그램과 이야기하고 있습니다. DATA, 그래서 그래 우리는 말할 수 requestDTO 예를 들어 당신이 다른 하나 개의 필드 당신은 단지 DTO가 아닌 API 인터페이스 방법을 변경을 추가해야합니다..
riadh gomri

9

일부 간단한 뷰의 경우 DTO를 모델로 사용하지만 뷰가 더 복잡 해짐에 따라 ViewModels를 생성합니다.

나에게 그것은 신속 함 (DTO 사용)과 유연성 (ViewModel 생성은 더 많은 관심사 분리를 의미 함) 사이의 균형입니다.


2
좋은 실용적인 대답.
Simon Tewsi

0

DTO를 ViewModel로 사용하는 경우 DTO를 변경하는 이유 때문에 DTO에 대한 의존도가 높으면 ViewModel에 영향을 미칠 수 있습니다.

DTO를 더 잘 사용하고 뷰 모델로 변환하십시오.


-1

DTO 를 사용할 수 있습니다.Model 클래스와 동일하며 단일 뷰에서 여러 모델 데이터 / 속성을 표시 / 사용해야 할 때 viewmodel을 사용할 수 있습니다. 예 : 먼저 엔티티 프레임 워크 데이터베이스를 사용하여 일부 모델을 생성합니다. 이제 모든 모델이 데이터베이스를 기반으로 생성됩니다. 이제 데이터 주석이 필요합니다. 이러한 데이터 주석에 대해 폴더 이름 DTO를 생성 할 수 있습니다.이 DTO 폴더에서 이미 생성 한 모든 모델을 정확하게 유지하고 속성 위에 데이터 주석을 추가 할 수 있습니다. 그런 다음이 DTO 클래스를 사용하여 모든 작업 (컨트롤러 사용, 뷰 사용)을 사용할 수 있습니다. 복잡한 뷰가 필요할 때 하나의 뷰에서 여러 클래스 데이터가 필요할 때 뷰 모델을 사용할 수 있습니다. viewmodel의 경우 폴더 이름 viewmodel을 만든 다음 사용자 지정 클래스를 만들고 필요한 속성을 유지할 수 있습니다. 나는 스스로를 정리하려고했다. 어떤 제안이라도 대단히 감사합니다.

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