문제

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

MVC에서는 모델 클래스 DTO이며, 차이점이 아니라면 둘 다 필요합니까?

도움이 되었습니까?

해결책

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

DTO는 N-Tier 애플리케이션에서 서비스 계층에서 가장 일반적으로 사용하여 자체와 UI 계층간에 데이터를 전송합니다. 여기서 주요 이점은 분산 애플리케이션에서 와이어를 통해 전송되어야하는 데이터의 양을 줄이는 것입니다. 또한 MVC 패턴으로 훌륭한 모델을 만듭니다.

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

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

도메인 객체에서 DTO로, 그리고 다시 돌아 오는 것은 비용이 많이 드는 프로세스가 될 수 있습니다. 분산 애플리케이션을 작성하지 않는다면 아마도 패턴에서 큰 이점을 보지 못할 것입니다. Martin Fowler는 여기에 설명합니다

다른 팁

DTO의 정의는 찾을 수 있습니다 마틴 파울러의 사이트. DTO는 매개 변수를 메소드 및 리턴 유형으로 전송하는 데 사용됩니다. 많은 사람들이 UI에있는 사람들을 사용하지만 다른 사람들은 도메인 객체를 팽창시킵니다.

DTO는 멍청한 객체입니다. 속성을 보유하고 getters and setter가 있지만, 다른 의미의 다른 논리는 없습니다 (Compare () 또는 equals () 구현).

일반적으로 MVC의 모델 클래스 (.NET MVC가 여기에서.

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

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

레거시 Java Enterprise Systems에서 DTO는 다양한 EJB 제품을 가질 수 있습니다.

나는 이것이 모범 사례인지 아닌지 모르지만 나는 개인적으로 사용합니다. 가치 객체 내 봄 MVC/부팅 프로젝트에는 다음과 같은 프로젝트가 있습니다.

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

제어 장치 레이어는 엔터티가 무엇인지 모릅니다. 그것은 의사 소통합니다 형태 그리고 가치 객체를보십시오. 양식 개체에는 JSR 303 검증 주석 (예 : @NotNull)이 있습니다. 가치 객체를보십시오 맞춤 직렬화를위한 Jackson 주석이 있습니다. (예 : @jsonignore)

서비스 계층은 엔티티 객체를 사용하여 리포지토리 계층과 통신합니다. 엔티티 객체에는 JPA/Hibernate/Spring Data Annotation이 있습니다. 모든 레이어는 하단 레이어 와만 통신합니다. 원형/주기적 의존성으로 인해 계층 간 통신은 금지됩니다.

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

약간 ORM 프레임 워크는 추가 인터페이스 또는 클래스를 사용하여 투영 능력이 있습니다. 따라서 리포지토리는 뷰 객체를 직접 반환 할 수 있습니다. 추가 변환이 필요하지 않습니다.

예를 들어 이것은 사용자 엔티티입니다.

@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, FirstName, LastName을 포함하는 페이지에 입은 사용자 목록을 반환해야합니다. 그런 다음 ORM 프로젝션에 대한 뷰 값 객체를 만들 수 있습니다.

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 패턴 사용)은 지능형 모델이며 해당 모델에 대해 다른 작업을 수행하는 많은 방법을 포함 할 수 있습니다 (비즈니스 로직이 아닌 컨트롤러에 있어야 함). 그러나 데이터를 전송할 때 (예 : 휴식을 호출하는 (GET/POST/uthing) 어딘가에서의 끝점 또는 SOA 등을 사용하여 웹 서비스를 소비합니다 ...) 엔드 포인트에 필요하지 않은 코드로 큰 크기의 객체를 전송하고 데이터를 소비하며 전송 속도를 늦추고 싶지 않습니다.

MVC의 데이터 전송 객체는 종종 도메인 모델을 vere에 의해 표시되는 더 간단한 개체에 도메인 모델을 매핑하는 데 사용됩니다.

에서 위키 백과:

이전에 값 객체 또는 VO로 알려진 데이터 전송 객체 (DTO)는 소프트웨어 애플리케이션 서브 시스템간에 데이터를 전송하는 데 사용되는 설계 패턴입니다. DTO는 종종 데이터 액세스 개체와 함께 사용하여 데이터베이스에서 데이터를 검색합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top