[model-view-controller] 데이터 전송 객체 란 무엇입니까?

데이터 전송 객체 란 무엇입니까?

MVC에는 모델 클래스 DTO가 있으며, 그렇지 않은 경우 차이점은 무엇이며 둘 다 필요합니까?



답변

데이터 전송 개체는 데이터를 캡슐화하여 응용 프로그램의 한 하위 시스템에서 다른 하위 시스템으로 보내는 데 사용되는 개체입니다.

DTO는 N 계층 응용 프로그램의 서비스 계층에서 자체적으로 UI 계층간에 데이터를 전송하는 데 가장 일반적으로 사용됩니다. 여기서 주요 이점은 분산 응용 프로그램에서 전선을 통해 전송해야하는 데이터의 양을 줄이는 것입니다. 그들은 또한 MVC 패턴에서 훌륭한 모델을 만듭니다.

DTO의 또 다른 용도는 메소드 호출을위한 매개 변수를 캡슐화하는 것입니다. 방법이 4 개 이상의 매개 변수를 사용하는 경우 유용 할 수 있습니다.

DTO 패턴을 사용할 때는 DTO 어셈블러도 사용합니다. 어셈블러는 도메인 개체에서 DTO를 만드는 데 사용되며 그 반대도 마찬가지입니다.

도메인 개체에서 DTO 로의 변환 및 다시 변환은 비용이 많이 드는 프로세스 일 수 있습니다. 분산 응용 프로그램을 작성하지 않는 경우 Martin Fowler가 설명하는 것처럼 패턴에서 큰 이점을 얻지 못할 수 있습니다.


답변

DTO에 대한 정의는 Martin Fowler ‘s site 에서 찾을 수 있습니다 . DTO는 매개 변수를 메소드 및 리턴 유형으로 전송하는 데 사용됩니다. 많은 사람들이 UI에서 이들을 사용하지만 다른 사람들은 도메인 객체를 팽창시킵니다.


답변

DTO는 멍청한 객체입니다. 단지 속성을 보유하고 있으며 게터와 세터를 가지고 있지만, 비교 () 또는 equals () 구현 이외의 다른 의미의 논리는 없습니다.

일반적으로 MVC의 모델 클래스 (여기서는 .net MVC라고 가정)는 DTO 또는 DTO 모음 / 집합입니다.


답변

일반적으로 Value Objects 는 변경할 수 없어야합니다. Java의 Integer 또는 String 객체 와 유사합니다 . 소프트웨어 계층간에 데이터를 전송하는 데 사용할 수 있습니다. 소프트웨어 계층 또는 서비스가 마이크로 서비스 환경 또는 레거시 Java Enterprise 앱과 같은 다른 원격 노드에서 실행되는 경우 우리는 두 클래스의 거의 정확한 사본을 만들어야합니다. 이것이 우리가 DTO를 만난 곳입니다.

|-----------|                                                   |--------------|
| SERVICE 1 |--> Credentials DTO >--------> Credentials DTO >-- | AUTH SERVICE |
|-----------|                                                   |--------------|

레거시 Java Enterprise Systems에서 DTO는 다양한 EJB 항목을 포함 할 수 있습니다.

이것이 모범 사례인지는 모르지만 개인적으로 다음과 같이 Spring MVC / Boot Project에서 Value Objects 를 사용 합니다.

        |------------|         |------------------|                             |------------|
-> Form |            | -> Form |                  | -> Entity                   |            |
        | Controller |         | Service / Facade |                             | Repository |
<- View |            | <- View |                  | <- Entity / Projection View |            |
        |------------|         |------------------|                             |------------|

컨트롤러 계층은 엔티티가 무엇인지 모릅니다. FormView Value Objects 와 통신 합니다. Form Objects에는 JSR 303 Validation 주석 (예 : @NotNull)이 있으며 View Value Objects 에는 사용자 지정 직렬화를위한 Jackson Annotations가 있습니다. (예 : @JsonIgnore)

서비스 계층은 엔티티 개체를 사용하여 저장소 계층과 통신합니다. 엔터티 객체에는 JPA / Hibernate / Spring Data 주석이 있습니다. 모든 계층은 하위 계층과 만 통신합니다. 순환 / 순환 종속성으로 인해 계층 간 통신이 금지됩니다.

User Service ----> XX CANNOT CALL XX ----> Order Service

일부 ORM 프레임 워크는 추가 인터페이스 또는 클래스를 사용하여 프로젝션 할 수 있습니다. 따라서 리포지토리는 View 개체를 직접 반환 할 수 있습니다. 추가 변환이 필요하지 않습니다.

예를 들어 이것은 User 개체입니다.

@Entity
public final class User {
    private String id;
    private String firstname;
    private String lastname;
    private String phone;
    private String fax;
    private String address;
    // Accessors ...
}

그러나 ID, 이름, 성만 포함하는 페이지 매김 사용자 목록을 반환해야합니다. 그런 다음 ORM 투영을위한 View Value Object를 작성할 수 있습니다.

public final class UserListItemView {
    private String id;
    private String firstname;
    private String lastname;
    // Accessors ...
}

저장소 계층에서 페이지 매김 결과를 쉽게 얻을 수 있습니다. 스프링 덕분에 투영을위한 인터페이스 만 사용할 수도 있습니다.

List<UserListItemView> find(Pageable pageable);

다른 변환 작업 BeanUtils.copy방법이 잘 작동하는지 걱정하지 마십시오 .


답변

  1. DTO무엇인지 에 대한 가장 좋은 대답 은 DTO테스트가 필요한 비즈니스 로직이나 메소드 구현을 포함해서는 안되는 간단한 객체라는 것 입니다.
  2. 일반적으로 MVC 패턴을 사용하는 모델은 지능형 모델이며 해당 모델에 대해 다른 작업을 수행하는 많은 / 일부 메소드를 포함 할 수 있습니다 (비즈니스 로직이 아니라 컨트롤러에 있어야 함). 그러나 데이터를 전송할 때 (예 : 어딘가에서 REST ( GET/ POST/ whatever) 엔드 포인트 호출 또는 SOA를 사용하여 웹 서비스 사용 등) 필요하지 않은 코드로 큰 크기의 객체를 전송하고 싶지 않습니다. 엔드 포인트는 데이터를 소비하고 전송 속도를 느리게합니다.

답변

MVC에서 데이터 전송 객체는 종종 도메인 모델을 더 간단한 객체에 매핑하여 최종적으로 뷰에 표시됩니다.

에서 위키 백과 :

이전에는 값 개체 또는 VO라고 알려진 DTO (데이터 전송 개체)는 소프트웨어 응용 프로그램 하위 시스템간에 데이터를 전송하는 데 사용되는 디자인 패턴입니다. DTO는 종종 데이터베이스에서 데이터를 검색하기 위해 데이터 액세스 개체와 함께 사용됩니다.


답변

데이터 전송 개체 (DTO)는 “프로세스간에 데이터를 전달하는 개체”(Wikipedia) 또는 “데이터를 캡슐화하여 응용 프로그램의 한 하위 시스템에서 다른 하위 시스템으로 전송하는 개체”(스택 오버플로 응답)를 설명합니다.