DTO - Data Transfer Objects
Last updated
Last updated
Data Transfer Objects
데이터 전송 객체는 애플리케이션 계층과 프리젠테이션 계층간에 데이터를 전송하는 데 사용됩니다.
프레젠테이션 계층은 DTO (데이터 전송 개체)를 사용하여 응용 프로그램 서비스(application controller) 메서드를 호출합니다. 그런 다음 응용 프로그램 서비스는 이러한 도메인 개체를 사용하여 특정 비즈니스 논리를 수행 한 다음 마지막으로 DTO를 프레젠테이션 계층으로 반환합니다. 따라서 프레젠테이션 계층은 도메인 계층과 완전히 분리됩니다. 이상적으로 계층화 된 응용 프로그램에서 프레젠테이션 계층은 도메인 개체 (Repositories, or Entities...)와 함께 작동하지 않습니다.
처음에 각 application controller 메서드에 대한 DTO 클래스를 만드는 것은 다음과 같이 볼 수 있습니다.
도메인 계층의 추상화
DTO는 프레젠테이션 계층에서 도메인 개체를 추상화하는 효율적인 방법을 제공합니다. 프레젠테이션 계층을 완전히 변경하려면 기존 응용 프로그램 및 도메인 계층을 계속 사용할 수 있습니다. 또는 프레젠테이션 레이어를 변경하지 않고도 도메인 레이어를 다시 작성하고 데이터베이스 스키마, 엔티티 및 ORM 프레임 워크를 완전히 변경할 수 있습니다. 물론 이는 애플리케이션 컨트롤러의 계약 (메서드 서명 및 DTO)이 변경되지 않는 한 유지됩니다.
데이터 숨김
Id, Name, EmailAddress 및 Password 속성이 있는 엔티티가 있다고 가정합니다. VitaAppController의 GetAllVitas() 메서드가 List<Vita>를 반환하면 화면에 표시하지 않더라도 누구나 모든 사용자의 암호를 볼 수 있습니다. 이때 DTO를 통해 필요하지 않은 데이터를 숨길 수 있습니다.
Axs는 DTO를 강력하게 지원합니다. 기존 클래스, 인터페이스를 제공하고 DTO 이름 지정 및 사용 규칙을 표준화합니다.
예제
여기에 좋은 예가 있습니다. 이름으로 사람을 검색 한 다음 사람 목록을 반환하는 데 사용되는 응용 프로그램 서비스 방법을 개발하고 싶다고 가정 해 보겠습니다. 이 경우 아래와 같이 Vita 엔터티(entity)가 있을 수 있습니다 :
그런 다음 애플리케이션 컨트롤러(application controller)에 대한 인터페이스를 정의합니다 :
Axs는 입력 / 출력 매개 변수를 MethodNameDto 및 MethodNameResult으로 명명하고 모든 애플리케이션 컨트롤러 메서드에 대해 별도의 입력 및 출력 DTO를 정의 할 것을 제안합니다. 메서드가 하나의 매개 변수만 사용하고 반환하더라도 DTO 클래스를 만드는 것이 좋습니다.
Axs는 메서드를 실행하기 전에 입력을 자동으로 검증합니다. ASP.NET MVC의 모델 유효성 검사와 비슷하지만 응용 프로그램 서비스는 컨트롤러가 아니라 일반 오래된 C# 클래스입니다. Axs는 입력된 객체의 값에 대해서 자동으로 확인합니다.
EntityDto는 대부분의 엔터티에 공통적이므로 Id 속성을 선언하는 간단한 클래스입니다.
보시다시피 VitaDto는 프레젠테이션 레이어에 필요하지 않기 때문에 Password 속성을 포함하지 않습니다. 사람들의 암호를 프레젠테이션 레이어로 보내는 것은 위험 할 수 있습니다.
계속 진행하기 전에 IVitaAppController를 구현해 보겠습니다 :
여기서 우리는 데이터베이스에서 엔티티를 가져 와서 DTO로 변환 한 다음 출력을 반환합니다.
Default Dto 샘플 코드
Entity 클래스에 대응하는 Dto 객체
Search Dto 샘플 코드
검색에 필요한 Dto
Insert Dto 샘플 코드
데이터 추가 Dto
Update Dto 샘플 코드
Delete Dto 샘플 코드
위와 같은 코드를 사용해서 도메인 서비스에서 사용하는 Entity클래스를 Dto 객체를 사용해서 도메인 밖으로 나오도록 하는 패턴을 지향해야 합니다.