문제

나는 최근에 사람들이 그렇게 말하는 것을 들었습니다 데이터 전송 개체 (dtos)는 an입니다 패턴 방지.

왜요? 대안은 무엇입니까?

도움이 되었습니까?

해결책

일부 프로젝트에는 모든 데이터가 두 번 있습니다. 도메인 객체로, 그리고 한 번은 데이터 전송 개체입니다.

이것 복제 비용은 막대한 비용이 있습니다, 따라서 아키텍처는이 분리로부터 큰 이익을 얻어야합니다.

다른 팁

DTOS는 반포 방지가 아닙니다. 와이어를 가로 질러 일부 데이터를 전송하는 경우 (예 : Ajax 호출의 웹 페이지로) 대상이 사용할 데이터 만 보내면 대역폭을 절약해야합니다. 또한 프레젠테이션 계층이 데이터를 기본 비즈니스 객체와 약간 다른 형식으로 갖는 것이 편리합니다.

나는 이것이 Java 지향적 인 질문이라는 것을 알고 있지만, .NET 언어에서 익명 유형, 직렬화 및 LINQ에서는 DTO가 비행 중에 구성 될 수 있도록하여 사용의 설정과 오버 헤드가 줄어 듭니다.

EJB 3.0의 반포 란 DTO 말 :

EJB 3.0 이전의 EJB 사양에서 엔티티 빈의 중량 특성으로 인해 데이터 전송 객체 (DTO)와 같은 설계 패턴을 사용했습니다. DTOS는 가벼운 물체가되었으며 (처음에는 엔티티 콩이었을 것임), 계층을 가로 질러 데이터를 보내는 데 사용되었습니다 ... 이제 EJB 3.0 사양은 엔티티 빈 모델을 평범한 오래된 Java 객체 (POJO)와 동일하게 만듭니다. 이 새로운 Pojo 모델을 사용하면 더 이상 각 엔티티 또는 엔티티 세트에 대한 DTO를 만들 필요가 없습니다 ... 계층에 걸쳐 EJB 3.0 엔티티를 보내려면 java.io.serialiazable을 구현하십시오.

나는 DTO가 그 자체로 반포 스테인이라고 생각하지 않지만 DTOS의 사용과 관련된 반포 스가 있습니다. Bill Dudney는 DTO 폭발을 예로 말합니다.

http://www.softwaresummit.com/2003/speakers/dudneyj2eeantipatterns.pdf

여기에 언급 된 DTO의 여러 학대도 있습니다.

http://anirudhvyas.com/root/2008/04/19/abuses-of-dto-pattern-in-java-world/

그것들은 3 개의 계층 시스템 (일반적으로 EJB를 기술로 사용)으로 인해 계층간에 데이터를 전달하는 수단으로 인해 시작되었습니다. Spring과 같은 프레임 워크를 기반으로하는 대부분의 현대 Java 시스템은 Pojos를 단일 계층에서 도메인 객체 (종종 JPA 등으로 주석을 달)로 사용하여 대체 단순화 된보기를 취합니다 ... 여기서 DTOS의 사용은 불필요합니다.

OO Purists는 객체가 실제 도메인 객체 대신 데이터 테이블 표현이되기 때문에 DTO가 반포 핀이라고 말합니다.

일부는 DTO가 가능한 남용으로 인해 반란 방지라고 생각합니다. 그들은 종종 존재하지 않아야 할 때 종종 사용됩니다.

이 기사 일부 학대를 모호하게 묘사합니다.

분산 시스템을 구축하는 경우 DTO는 확실히 반 패턴이 아닙니다. 모든 사람이 그런 의미로 발전하는 것은 아니지만, 예를 들어, 열린 소셜 앱이 모두 JavaScript를 실행하는 경우.

다양한 데이터를 API에 게시합니다. 그런 다음 이것은 어떤 형태의 객체, 일반적으로 DTO/요청 객체로 삼각화됩니다. 그런 다음 모델 객체로 변환되기 전에 입력 된 데이터가 올바른지 확인하기 위해 검증 될 수 있습니다.

내 생각에, 그것은 잘못 사용 되었기 때문에 반란 방지로 여겨집니다. 분산 시스템을 구축하지 않으면 필요하지 않을 가능성이 없습니다.

DTO는 모든 도메인 객체에 관련 객체를 간절히로드 할 때 반포 반대가 아닌 필수가되고 반포가 아닙니다.

DTO를 만들지 않으면 비즈니스 계층에서 클라이언트/웹 계층으로 불필요한 전송 객체가 발생합니다.

이 경우 오버 헤드를 제한하려면 DTO를 전송하십시오.

a의 의도 데이터 전송 객체 다른 소스에서 데이터를 저장 한 다음 데이터베이스로 전송하는 것입니다 (또는 원격 외관) 한 번에.

하지만, DTO 패턴은 단일 책임 원칙, DTO는 데이터를 저장할뿐만 아니라 데이터베이스/페이스레이션으로 데이터를 전송하기 때문에.

데이터 객체를 비즈니스 객체와 분리해야 할 필요성은 아마도 반란이 아닙니다. 데이터베이스 계층을 분리하십시오 그래도.

DTOS 대신 집계 및 리포지토리 패턴을 사용해야합니다.골재) 및 데이터 전송 (저장소).

객체 그룹을 전송하려면 사용할 수 있습니다. 작업 단위 패턴, 저장소 세트와 거래 컨텍스트를 보유하고 있습니다. 트랜잭션 내에서 각 객체를 골재로 전송하기 위해.

질문은 "왜"가 아니라 "언제".

확실히 그것은입니다 사용 결과 만 비용이 더 높은 경우 반포 방지 - 런타임 또는 유지 보수. 데이터베이스 엔티티 클래스와 동일한 수백 개의 DTO를 가진 프로젝트에서 작업했습니다. 단일 필드를 추가 할 때마다 4 번 -DTO, 엔티티, DTO에서 도메인 클래스 또는 엔터티로 변환, 역전 변환으로 4 번을 추가하기 위해 광고를 추가 할 때마다 ... 일부 장소와 데이터를 잊어 버렸습니다. 일관성 없는.

이것의 도메인 클래스의 다른 표현이 실제로 필요할 때 패턴 방지되지 않음 - 더 평평하고, 더 풍부하고, 더 좁으며 ...

개인적으로 나는 도메인 클래스로 시작하여 올바른 장소에 올바른 체크인으로 전달합니다. 매핑, 데이터베이스, JSON 또는 XML과 같은 직렬화 형식으로 "헬퍼"클래스를 주석에 넣거나 추가 할 수 있습니다 ... 필요하다고 느끼면 항상 클래스를 2로 나눌 수 있습니다.

그것은 당신의 관점에 관한 것입니다 - 나는 도메인 객체를 서로로 만든 여러 객체 대신 다양한 역할을하는 단일 객체로 보는 것을 선호합니다. 객체가 가진 유일한 역할이 데이터를 전송하는 것인 경우 DTO입니다.

나는 사람들이 모든 원격 개체를 DTO로 구현한다면 사람들이 반포 스가 될 수 있다고 생각합니다. DTO는 단지 일련의 속성 일 뿐이며 큰 객체가있는 경우 필요하지 않거나 사용하지 않더라도 항상 모든 속성을 전송합니다. 후자의 경우 프록시 패턴을 사용하는 것이 선호됩니다.

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