Axs Document
  • AXS Framework
  • 1. Common structures
    • 의존성 관계 설정 - Dependency Injection
    • 캐싱 - Caching
    • 로깅 - Logging
    • 세션 - Session
    • 다중 테넌트 - Multi Tenancy
    • 모듈 시스템 - Module System
    • 객체 매핑 - Object To Object Mapping
    • 메일 연동 - Mail System
  • 2. Domain Layer
    • 엔티티 - Entities
    • 저장소 - Repositories
    • 도메인 서비스 - Domain Services
    • 작업 단위 - Unit Of Work
  • 3. Application Layer
    • 애플리케이션 컨트롤러 - Application Controller
    • DTO - Data Transfer Objects
    • DTO 객체의 유효성 체크 - Validating Data Transfer Objects
    • 인증 - Authorization
    • 감사 로그 - Audit Logging
    • 엔티티 기록 - Entity History
  • 4. Object Relational Mapping
    • EntityFramework 통합
    • Dapper 통합
  • 5. Background Services
    • 백그라운드 작업과 워커
  • 6. Presentation Layer
    • 에러 핸들링
Powered by GitBook
On this page
  1. 3. Application Layer

DTO - Data Transfer Objects

Previous애플리케이션 컨트롤러 - Application ControllerNextDTO 객체의 유효성 체크 - Validating Data Transfer Objects

Last updated 1 year ago

Data Transfer Objects

설명

데이터 전송 객체는 애플리케이션 계층과 프리젠테이션 계층간에 데이터를 전송하는 데 사용됩니다.

프레젠테이션 계층은 DTO (데이터 전송 개체)를 사용하여 응용 프로그램 서비스() 메서드를 호출합니다. 그런 다음 응용 프로그램 서비스는 이러한 도메인 개체를 사용하여 특정 비즈니스 논리를 수행 한 다음 마지막으로 DTO를 프레젠테이션 계층으로 반환합니다. 따라서 프레젠테이션 계층은 도메인 계층과 완전히 분리됩니다. 이상적으로 계층화 된 응용 프로그램에서 프레젠테이션 계층은 도메인 개체 (, or ...)와 함께 작동하지 않습니다.

DTO의 필요

처음에 각 application controller 메서드에 대한 DTO 클래스를 만드는 것은 다음과 같이 볼 수 있습니다.

도메인 계층의 추상화

DTO는 프레젠테이션 계층에서 도메인 개체를 추상화하는 효율적인 방법을 제공합니다. 프레젠테이션 계층을 완전히 변경하려면 기존 응용 프로그램 및 도메인 계층을 계속 사용할 수 있습니다. 또는 프레젠테이션 레이어를 변경하지 않고도 도메인 레이어를 다시 작성하고 데이터베이스 스키마, 엔티티 및 ORM 프레임 워크를 완전히 변경할 수 있습니다. 물론 이는 애플리케이션 컨트롤러의 계약 (메서드 서명 및 DTO)이 변경되지 않는 한 유지됩니다.

데이터 숨김

Id, Name, EmailAddress 및 Password 속성이 있는 엔티티가 있다고 가정합니다. VitaAppController의 GetAllVitas() 메서드가 List<Vita>를 반환하면 화면에 표시하지 않더라도 누구나 모든 사용자의 암호를 볼 수 있습니다. 이때 DTO를 통해 필요하지 않은 데이터를 숨길 수 있습니다.

DTO 규칙 & 유효성 검사

Axs는 DTO를 강력하게 지원합니다. 기존 클래스, 인터페이스를 제공하고 DTO 이름 지정 및 사용 규칙을 표준화합니다.

예제

public class Vita : Entity
{
    public virtual string Name { get; set; }
    public virtual string EmailAddress { get; set; }
    public virtual string Password { get; set; }
}
    public interface IVitaAppController : IAppController
    {
        SearchVitaResult SearchVita(SearchVitaDto input);
    }

Axs는 입력 / 출력 매개 변수를 MethodNameDto 및 MethodNameResult으로 명명하고 모든 애플리케이션 컨트롤러 메서드에 대해 별도의 입력 및 출력 DTO를 정의 할 것을 제안합니다. 메서드가 하나의 매개 변수만 사용하고 반환하더라도 DTO 클래스를 만드는 것이 좋습니다.

public class SearchVitaDto
{
    [StringLength(40, MinimumLength = 1)]
    public string SearchedName { get; set; }
}

public class SearchVitaResult
{
    public List<VitaDto> Vita { get; set; }
}

public class VitaDto : EntityDto
{
    public string Name { get; set; }
    public string EmailAddress { get; set; }
}

Axs는 메서드를 실행하기 전에 입력을 자동으로 검증합니다. ASP.NET MVC의 모델 유효성 검사와 비슷하지만 응용 프로그램 서비스는 컨트롤러가 아니라 일반 오래된 C# 클래스입니다. Axs는 입력된 객체의 값에 대해서 자동으로 확인합니다.

EntityDto는 대부분의 엔터티에 공통적이므로 Id 속성을 선언하는 간단한 클래스입니다.

보시다시피 VitaDto는 프레젠테이션 레이어에 필요하지 않기 때문에 Password 속성을 포함하지 않습니다. 사람들의 암호를 프레젠테이션 레이어로 보내는 것은 위험 할 수 있습니다.

계속 진행하기 전에 IVitaAppController를 구현해 보겠습니다 :

public class VitaAppController : IVitaAppController
{
    private readonly IVitaRepository _vitaRepository;

    public PersonAppController(IVitaRepository vitaRepository)
    {
        _vitaRepository = vitaRepository;
    }

    public SearchVitaResult SearchVita(SearchVitaDto input)
    {
        // 사용자 정보 가져오기
        var vitaEntityList = _vitaRepository.GetAllList(vita => vita.Name.Contains(input.SearchedName));

        // DTO로 변환
        var vitaDtoList = vitaEntityList
            .Select(vita => new VitaDto
                                {
                                    Id = person.Id,
                                    Name = person.Name,
                                    EmailAddress = person.EmailAddress
                                }).ToList();

        return new SearchVitaResult { Vita = vitaDtoList };
    }
}

여기서 우리는 데이터베이스에서 엔티티를 가져 와서 DTO로 변환 한 다음 출력을 반환합니다.

확인

Default Dto 샘플 코드

Entity 클래스에 대응하는 Dto 객체

[AutoMap(typeof(Sample))]
public class SampleDto : FullAuditedEntityDto<int>
{
    public int Age { get; set; }

    public string Name { get; set; } = string.Empty;
}

Search Dto 샘플 코드

검색에 필요한 Dto

[AutoMap(typeof(Sample))]
public class GetSampleAllDto : PagedResultRequestDto
{
    public int Age { get; set; }

    public string? Name { get; set; }
}

Insert Dto 샘플 코드

데이터 추가 Dto

[AutoMap(typeof(Sample))]
public class CreateSampleDto : EntityDto<int>
{
    public int Age { get; set; }

    public string? Name { get; set; }
}

Update Dto 샘플 코드

[AutoMap(typeof(Sample))]
public class UpdateSampleDto : EntityDto<int>
{
    public int Age { get; set; }

    public string? Name { get; set; }
}

Delete Dto 샘플 코드

[AutoMap(typeof(Sample))]
public class DeleteSampleDto : EntityDto<int>
{
    
}

위와 같은 코드를 사용해서 도메인 서비스에서 사용하는 Entity클래스를 Dto 객체를 사용해서 도메인 밖으로 나오도록 하는 패턴을 지향해야 합니다.

여기에 좋은 예가 있습니다. 이름으로 사람을 검색 한 다음 사람 목록을 반환하는 데 사용되는 응용 프로그램 서비스 방법을 개발하고 싶다고 가정 해 보겠습니다. 이 경우 아래와 같이 Vita 엔터티()가 있을 수 있습니다 :

그런 다음 애플리케이션 컨트롤러()에 대한 인터페이스를 정의합니다 :

entity
application controller
application controller
Repositories
Entities
Alt text