왜 데이터 전송 객체 (DTO)가 안티 패턴입니까?
최근에 사람들 은 DTO ( 데이터 전송 개체 )가 안티 패턴 이라고 말합니다 .
왜? 대안은 무엇입니까?
일부 프로젝트에는 모든 데이터가 두 번 있습니다. 도메인 개체로 한 번, 데이터 전송 개체로 한 번
이 복제에는 엄청난 비용 이 들기 때문에 아키텍처는 이러한 분리로부터 큰 이점을 얻을 수 있어야합니다.
DTO는 안티 패턴이 아닙니다. 유선으로 일부 데이터를 전송할 때 (예 : Ajax 호출의 웹 페이지로) 대상이 사용할 데이터 만 전송하여 대역폭을 절약해야합니다. 또한 프리젠 테이션 계층이 데이터를 기본 비즈니스 오브젝트와 약간 다른 형식으로 갖는 것이 편리한 경우가 종종 있습니다.
나는 이것이 Java 지향 질문이라는 것을 알고 있지만 .NET 언어에서는 익명 유형, 직렬화 및 LINQ를 통해 DTO를 즉시 구성 할 수 있으므로 DTO를 사용하여 설정 및 오버 헤드를 줄일 수 있습니다.
EJB 3.0의 안티 패턴 DTO는 다음과 같이 말합니다.
EJB 3.0 이전의 EJB 사양에서 Entity Beans의 무거운 특성으로 인해 DTO (Data Transfer Objects)와 같은 디자인 패턴이 사용되었습니다. DTO는 티어를 통해 데이터를 전송하는 데 사용되는 경량 오브젝트 (처음에는 엔티티 Bean이어야 했음)가되었습니다. 이제 EJB 3.0 스펙은 엔티티 Bean 모델을 POJO (Plain old Java Object)와 동일하게 만듭니다. 이 새로운 POJO 모델을 사용하면 더 이상 각 엔티티 또는 엔티티 세트에 대해 DTO를 작성할 필요가 없습니다. 계층 전체에 EJB 3.0 엔티티를 보내려면 java.io.Serialiazable을 구현하십시오.
DTO는 반 패턴 그 자체가 아니라고 생각하지만 DTO 사용과 관련된 반 패턴이 있습니다. 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 시스템은 POJO를 단일 계층에서 도메인 오브젝트 (종종 JPA 등으로 주석이 달린 등)를 사용하여 대체 단순화 된보기를 취합니다. 여기서 DTO를 사용할 필요는 없습니다.
OO 순수 주의자들은 객체가 실제 도메인 객체 대신 데이터 테이블 표현이되기 때문에 DTO가 반 패턴이라고 말한다.
일부는 남용 가능성이 있기 때문에 DTO를 반 패턴으로 간주합니다. 필요하지 않거나 필요하지 않을 때 자주 사용됩니다.
이 기사 는 일부 학대를 모호하게 설명합니다.
분산 시스템을 구축하는 경우 DTO는 반 패턴이 아닙니다. 모든 사람이 그런 의미로 발전하는 것은 아니지만 Open Social 앱 (예를 들어)이 모두 JavaScript로 실행되는 경우입니다.
API에 많은 양의 데이터를 게시합니다. 그런 다음 일부 형태의 객체, 일반적으로 DTO / 요청 객체로 역 직렬화됩니다. 그런 다음 모델 개체로 변환하기 전에 입력 한 데이터가 올바른지 확인하기 위해 유효성을 검사 할 수 있습니다.
제 생각에는 잘못 사용되어 반 패턴으로 간주됩니다. 분산 시스템을 구축하지 않으면 필요하지 않을 가능성이 있습니다.
모든 도메인 개체가 연결된 개체를 EAGERly로로드하면 DTO는 필수 요소가되고 안티 패턴이 아닙니다.
DTO를 만들지 않으면 비즈니스 계층에서 클라이언트 / 웹 계층으로 불필요한 개체가 전송됩니다.
이 경우 오버 헤드를 제한하려면 DTO를 전송하십시오.
데이터 전송 객체 의 목적은 다른 소스의 데이터를 저장 한 다음 한 번에 데이터베이스 (또는 Remote Facade ) 로 전송하는 것 입니다.
그러나 DTO 패턴은 단일 책임 원칙을 위반합니다 . DTO는 데이터를 저장할뿐만 아니라 데이터를 데이터베이스 / 외부로 전송하기 때문입니다.
어쨌든 데이터베이스 계층 을 분리 해야 할 필요가 있기 때문에 비즈니스 오브젝트와 데이터 오브젝트를 분리 할 필요는 반 패턴이 아닙니다 .
DTO 대신 개체 컬렉션 ( Aggregate )과 데이터 전송 ( Repository ) 을 분리하는 집계 및 리포지토리 패턴을 사용해야합니다 .
오브젝트 그룹을 전송하려면 저장소 세트와 트랜잭션 컨텍스트를 보유하는 작업 단위 패턴을 사용할 수 있습니다 . 트랜잭션 내에서 집계의 각 오브젝트를 별도로 전송하기 위해.
질문은 "why"가 아니라 " when " 이어야합니다 .
확실히 사용의 결과가 런타임 또는 유지 관리 비용이 높을 때 안티 패턴 입니다. 데이터베이스 엔터티 클래스와 동일한 수백 개의 DTO가있는 프로젝트를 작업했습니다. 단일 필드를 추가 할 때마다 DTO, 엔터티, DTO에서 도메인 클래스 또는 엔터티로의 변환, 역 변환 등의 ID를 4 회 추가하도록 광고합니다. ... 일부 장소 및 데이터를 잊어 버렸습니다. 일관성이 없습니다.
더 평평하고 더 풍부하고 더 좁은 도메인 클래스의 다른 표현이 정말로 필요할 때 안티 패턴 이 아닙니다 .
개인적으로 도메인 클래스로 시작하여 올바른 장소에서 적절한 확인을 통해 전달합니다. JSON 또는 XML과 같은 직렬화 형식에 매핑, 데이터베이스, 매핑을 만들기 위해 "도우미"클래스에 주석을 달거나 추가 할 수 있습니다. 필요하다고 생각되면 클래스를 항상 2로 나눌 수 있습니다.
그것은 당신의 관점에 관한 것입니다-도메인 객체를 서로 생성 된 여러 객체 대신 다양한 역할을하는 단일 객체로 보는 것을 선호합니다. 개체의 유일한 역할이 데이터를 전송하는 것이라면 DTO입니다.
사람들은 모든 원격 객체를 DTO로 구현하면 반 패턴이 될 수 있다고 생각합니다. DTO는 단지 속성 집합 일 뿐이며 큰 개체가있는 경우 모든 속성을 필요하지 않거나 사용하지 않아도 항상 모든 속성을 전송합니다. 후자의 경우 프록시 패턴을 사용하는 것이 좋습니다.
참고 URL : https://stackoverflow.com/questions/1440952/why-are-data-transfer-objects-dtos-an-anti-pattern
'Programing' 카테고리의 다른 글
C ++에서 적절한 스택 및 힙 사용? (0) | 2020.07.12 |
---|---|
선택에서 텍스트를 바꾸려면 어떻게합니까? (0) | 2020.07.12 |
URL에서 호스트 도메인을 가져 오시겠습니까? (0) | 2020.07.12 |
AngularJS ng-include는 $ scope로 전달되지 않으면 뷰를 포함하지 않습니다. (0) | 2020.07.12 |
널 문자열을 연결하는 것이 유효하지만“null.ToString ()”을 호출하지 않는 이유는 무엇입니까? (0) | 2020.07.12 |