본문 바로가기

백엔드/닷넷

데이터 트랜스퍼 옵젝트 (DTO)

반응형

디티오는 각 레이어 사이에 데이터를 운반하는 컨테이너로 반환되는 에이피아이 정보를 가공하는 기능을 합니다. 디티오를 사용하여 옵젝트 구조를 변경하거나 특정 데이터를 제외 또는 수정이 가능한데요. 디티오를 생성하는 방법을 보겠습니다.

프로젝트 구성

 

관계형 데이터 불러오기 (참조 데이터 포함) - 지네릭 레포지토리 패턴

엔티티프레임워크를 사용하여 관계형 테이블에서 참조하는 데이터를 포함하여 데이터를 불러오는 방법을 보겠습니다. 구현하기 애플리케이션 생성 .NET web-API 생성하기 개발도구 설치하기 .NET

jin-co.tistory.com

객체구조 바꾸기

에이피아이 폴더에 디티오폴더를 생성하고

디티오 클래스를 생성합니다

가공할 엔티티 속성들을 추가합니다. 

엔티티 원본
가공된 엔티티

컨트롤러로 이동하여 개별아이템을 가져오는 메서드에 생성한 디티오와 원본 데이터를 맵핑하고 매핑된 데이터를 반환하도록 업데이트합니다.

▶ 개별아이템

▶ 아이템리스트

실행

작업이 완료되면 API 폴더로 이동하여

cd /API

아래 명령어로 앱을 실행합니다.

dotnet watch

가공 전 반환되는 데이터
가공 후 반환되는 데이터


※ 익스텐션 사용하기

데이터 가공을 쉽게 해주는 익스텐션을 사용해서 가공하는 것도 가능한데요. 누겟갤러리에서 아래 익스텐션을 에이피아이 폴더에 설치합니다

AutoMapper.Extensions.Microsoft.DependencyInject

에이피아이 폴더 내에 익스텐션을 사용할 맵퍼 클래스를 생성하고

아래 코드와 함께 컨스트럭터를 추가합니다

public Mapper()
{
    CreateMap<Item, ItemDTO>();
}

주의할 점은 자동으로 매핑이 되기 위해서는 속성의 타입과 이름이 일치해야 하는데 아래와 같이 하나가 다른 경우 옵션설정을 통해 따로 지정을 해 주어야 원하는 데이터가 반환됩니다

public Mapper()
{
    CreateMap<Item, ItemDTO>()
    .ForMember(d => d.ItemTarget, o => o.MapFrom(s => s.ItemTarget.Name))
    .ForMember(d => d.ItemType, o => o.MapFrom(s => s.ItemType.Name));
}

서비스 설정

Program.cs 파일로 이동하여 아래와 같이 서비스를 추가합니다

builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());

컨트롤러 업데이트

컨트롤러 클래스로 이동하여 익스텐션에서 제공하는 IMapper 인터페이스를 인젝션 하고

인젝션 한 맵퍼를 각 메서드에 기존 코드와 대체합니다


이미지 경로 수정하기

개발환경과 글로벌환경에서 동적으로 경로를 변경하기 위해 appsettings.Development.json을 열고 로컬 URL을 추가합니다

컨트롤러에 'IConfiguration' 인터페이스를 주입하고

아래와 같이 'appsettings.Development.json'에 설정한 경로를 반환하는 이미지 경로에 추가해 줍니다


※ 이미지 경로 수정하기 (맵퍼 익스텐션 활용)

개발환경과 글로벌환경에서 동적으로 경로를 변경하기 위해 appsettings.Development.json을 열고 로컬 URL을 추가합니다

이미지경로를 수정할 클래스를 생성하고

IValueResolver 인터페이스를 추가합니다. 이때, 인터페이스 타입에 원본 개체, 변환할 개체, 타입 순으로 넣습니다

아래와 같이 인터페이스를 구현하고 컨스트럭터를 추가합니다

구현된 메서드에 아래 코드를 추가합니다. '["URL"]'은 appsettings.Development.json에 추가한 URL을 호출합니다

if (!string.IsNullOrEmpty(source.ImageURL))
{
    return _config["URL"] + source.ImageURL;
}
return null;

맵퍼클래스로 이동, 아래처럼 유알엘 맵퍼를 옵션을 추가합니다

.ForMember(d => d.ItemType, o => o.MapFrom<URLMapper>());


이상으로 디티오에 대해서 알아보았습니다

 

728x90
반응형