programing

Data Transfer Object(DTO; 데이터 전송 객체)가 안티 패턴인 이유는 무엇입니까?

goodsources 2022. 10. 20. 21:22
반응형

Data Transfer Object(DTO; 데이터 전송 객체)가 안티 패턴인 이유는 무엇입니까?

데이터 전송 객체(DTO)는 안티패턴이라고 하는 을 최근에 들은 적이 있습니다.

왜요? 대안이 뭐죠?

일부 프로젝트에는 모든 데이터가 두 번 있습니다.한 번은 도메인 개체로, 한 번은 데이터 전송 개체로 사용됩니다.

복제에는 막대한 비용이 들기 때문에 아키텍처는 가치 있는 분리를 통해 큰 이점을 얻을 필요가 있습니다.

DTO는 안티패턴이 아닙니다유선을 개입시켜 데이터를 송신하는 경우(예를 들면, Ajax 콜의 Web 페이지에), 행선지가 사용하는 데이터만을 송신하는 것으로, 대역폭을 절약할 필요가 있습니다.또한 종종 프레젠테이션 계층은 데이터를 네이티브 비즈니스 개체와 약간 다른 형식으로 갖는 것이 편리합니다.

이게 자바 지향적인 질문인 건 알지만,그럼요.NET 언어 어나니머스 타입, 시리얼화 및 LINQ를 사용하면 DTO를 즉시 구축할 수 있으므로 DTO 사용 설정과 오버헤드를 줄일 수 있습니다.

「EJB 3.0 의 DTO an AntiPattern」(원래의 링크에서는, 현재 오프 라인이 되어 있습니다).

EJB 3.0 이전의 EJB 사양에서 엔티티 빈의 중량 특성은 데이터 전송 객체(DTO)와 같은 설계 패턴을 사용하는 결과를 낳았습니다.DTO는 데이터 전송에 사용되는 경량 객체(애초에 엔티티 콩 자체여야 함)가 되었습니다.이제 EJB 3.0 규격은 엔티티 빈 모델을 POJO(Plain Old Java Object)와 동일하게 만듭니다.이 새로운 POJO 모델을 사용하면 각 엔티티 또는 엔티티 세트에 대해 더 이상 DTO를 작성할 필요가 없습니다.계층 전반에 걸쳐 EJB 3.0 엔티티를 전송하려면 java.io을 구현하십시오.Serialiazable

OO 순수주의자들은 개체가 실제 도메인 개체가 아닌 데이터 테이블 표현이 되기 때문에 DTO는 안티 패턴이라고 말할 것입니다.

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를 사용할 필요는 없습니다.

일부에서는 DTO가 악용될 수 있기 때문에 DTO를 안티 패턴으로 간주합니다.사용할 필요가 없을 때 자주 사용됩니다.

글은 일부 악용을 애매하게 묘사하고 있다.

분산 시스템을 구축하고 있다면 DTO는 확실히 안티 패턴이 아닙니다.모든 사람이 그런 식으로 발전하는 것은 아니지만, (예를 들어) Open Social 앱이 모두 JavaScript에서 실행되고 있다면.

API에 데이터 로드를 게시합니다.그런 다음 어떤 형식의 개체(일반적으로 DTO/Request 개체)로 역직렬화됩니다.그러면 모델 개체로 변환되기 전에 입력된 데이터가 올바른지 확인할 수 있습니다.

제 생각에, 그것은 잘못 사용되었기 때문에 안티 패턴으로 보입니다.분산형 시스템을 구축하지 않으면 필요하지 않을 수 있습니다.

모든 도메인 오브젝트가 관련 오브젝트를 빠르게 로드하는 경우 DTO는 필수적이며 안티 패턴은 아닙니다.

DTO를 작성하지 않으면 비즈니스 계층에서 클라이언트/웹 계층으로 불필요한 개체를 전송할 수 있습니다.

이 경우의 오버헤드를 제한하려면 , DTO 를 전송 합니다.

문제는 '왜'가 아니라 '언제'여야 한다.

사용 결과만 고비용(실행 시간 또는 유지 보수)일 경우 확실히 안티패턴이 됩니다.데이터베이스 엔티티 클래스와 동일한 수백 개의 DTO를 가진 프로젝트를 수행했습니다.ID를 DTO, 엔티티, DTO에서 도메인 클래스 또는 엔티티로 변환, 역변환 등 4번 추가하기 위해 단일 필드를 추가할 때마다 추가합니다.일부 장소를 잊어버리고 데이터가 일관되지 않게 되었습니다.

도메인 클래스의 다른 표현을 정말로 필요로 할 때는 안티패턴이 아닙니다.더 평평하게, 더 풍부하게, 더 좁게, 더 좁게...

개인적으로는 도메인 클래스에서 시작하여 적절한 장소에서 적절한 체크와 함께 전달합니다.일부 "도움말" 클래스에 주석을 달거나 추가하여 데이터베이스에 매핑하거나 JSON이나 XML과 같은 직렬화 형식에 매핑할 수 있습니다.필요하다면 언제든지 반을 둘로 나눌 수 있어요.

이것은 당신의 관점에 관한 것입니다.저는 도메인 오브젝트를 여러 오브젝트 간에 생성된 여러 오브젝트보다 하나의 오브젝트로 보는 것이 더 좋습니다.오브젝트의 역할이 데이터 전송뿐이라면 DTO입니다.

모든 리모트 오브젝트를 DTO로 구현하면 안티패턴이 될 수 있다고 생각합니다.DTO는 단순히 속성 세트일 뿐이므로 큰 오브젝트를 가지고 있으면 반드시 모든 속성을 전송하거나 사용하지 않아도 됩니다.후자의 경우 프록시 패턴을 사용하는 것이 좋습니다.

데이터 전송 객체의 목적은 서로 다른 소스의 데이터를 저장한 후 데이터베이스(또는 원격 파사드)로 한 번에 전송하는 것입니다.

그러나 DTO 패턴은 데이터저장할 뿐만 아니라 데이터베이스/패실리티 간에 데이터를 전송하기 때문에 단일 책임 원칙에 위배됩니다.

데이터 오브젝트와 비즈니스 오브젝트를 분리할 필요는 없습니다.데이터 레이어를 분리할 필요가 있을 가능성이 높기 때문입니다.

DTO 대신 객체 수집(집약)과 데이터 전송(리포지토리)을 구분하는 Aggregate 및 Repository Patterns를 사용해야 합니다.

오브젝트 그룹을 전송하려면 일련의 Repository와 트랜잭션콘텍스트를 유지하는 Unit Of Work 패턴을 사용합니다.트랜잭션 내에서 집약 내의 각 오브젝트를 개별적으로 전송하려면 , 이 패턴을 사용합니다.

언급URL : https://stackoverflow.com/questions/1440952/why-are-data-transfer-objects-dtos-an-anti-pattern

반응형