[MapStruct] 03. 심화 사용법

2025. 4. 7. 20:47·공부/Java

이제 기본적인 MapStruct 사용법을 익혔으니, 좀더 심화적으로 사용할 수 있는 방법들을 소개하려 합니다.

 

1. 필드명 지정

DTO 간의 전환에서 각 필드명이 꼭 동일하다는 보장은 없습니다. MapStruct 에서는 소스 필드와 타켓 필드를 각각 지정해 줄 수 있습니다.

@Mapper
public interface UserMapper {
	UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);

	User toEntity(UserDto userDto);

	@Mapping(target = "id", source = "address.id")
	UserDto toDto(User user);
}

 

위와 같은 식으로 source 필드와 target 필드를 각각 주입해 줄 수 있습니다.

또한, 소스에서 중복된 필드가 있을 때 어떤 소스를 선택하면 될지 등을 정의할 수 있습니다.

 

2. 필드 제외

자동으로 매핑되지 않도록 ignore 옵션을 지정하여 특정 필드를 제외할 수도 있습니다.

@Mapper
public interface UserMapper {
	UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);

	User toEntity(UserDto userDto);

  @Mapping(target = "id", ignore = true)
	UserDto toDto(User user);
}

 

3. 필드 평면화

아래와 같이 타겟 객체에서 객체 형태로 매핑을 받는 것이 아니라, 객체의 내용을 풀어서 받는 경우도 있을 것 입니다.

이런 경우, target에 This 옵션을 통해 평면화하여 매핑하도록 지정해 줄 수 있습니다.

public class User {
	private Long id;
	private String email;
	private String name;
	private Integer age;
	private String location;
	private String detail;
}

public class UserDto {
	private Long id;
	private String email;
	private String name;
	private Integer age;
	private AddressDto address;
}
@Mapper
public interface UserMapper {
	UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);

	@Mapping(target = ".", source = "userDto.address")
	User toEntity(UserDto userDto);
}

 

즉, 평면화(flattening) 한다는 의미로 source 객체 내부의 필드를 펼쳐서 타켓 객체에 직접 매핑해준다는 의미로 사용할 수 있습니다.

 

4. 기본값 지정

값이 없을 때의 기본값을 지정하기 위하여 defaultValue 옵션을 사용하여 지정할 수 있고,

값이 있을 때 일정한 값을 지정하기 위하여 constant 옵션도 사용하여 지정할 수 있습니다.

@Mapper
public interface UserMapper {
	UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);

	@Mapping(target = ".", source = "userDto.address")
	@Mapping(target = "useYn", constant = "true")
	@Mapping(target = "id", defaultValue = "1L")
	User toEntity(UserDto userDto);
}

 

5. 로직 적용

DTO 간의 전환을 수행하다보면, 단순히 필드에 매핑하는 것이 아니라 특정한 로직을 통해 도출된 값을 필드에 적용해야 하는 경우가 생기게 됩니다.

아래의 예시를 살펴봅니다.

public class UserDto {
	private Long id;
	private String email;
	private String name;
	private Integer age;
	private AddressDto address;
	private boolean isAdult;
}

 

UserDto의 isAdult 는 age가 19세 이상인지 판별하기 위한 필드입니다. 해당 필드에 값을 적용하기 위한 비즈니스 로직을 설정해야하는데, MapStruct에서도 이러한 로직을 적용할 수 있습니다.

 

먼저 인터페이스에 해당 필드의 값을 도출하는 로직을 수행하는 default 메서드를 생성합니다.

default boolean determineIsAdult(User user) {
    return user.getAge() >= 19;
}

 

그 다음, expression 옵션을 통해 타겟 필드에 적용할 메서드를 지정하여 줍니다.

@Mapping(target = "isAdult", expression = "java(determineIsAdult(user))")
UserDto toDto(User user);

 

또는, 다른 패키지에 있는 메서드나 생성자 등도 지정해줄 수 있습니다.

@Mapper
public interface SourceTargetMapper {

    SourceTargetMapper INSTANCE = Mappers.getMapper( SourceTargetMapper.class );

    @Mapping(target = "timeAndFormat", expression = "java( new org.sample.TimeAndFormat( s.getTime(), s.getFormat() ) )")
    Target sourceToTarget(Source s);
}

 

저작자표시 비영리 변경금지 (새창열림)

'공부 > Java' 카테고리의 다른 글

[MapStruct] 02. 기본 사용법  (0) 2025.04.07
[MapStruct] 01. MapStruct란 무엇인가?  (0) 2025.04.07
[프랙티컬 모던 자바] 02. 인터페이스  (4) 2024.11.12
'공부/Java' 카테고리의 다른 글
  • [MapStruct] 02. 기본 사용법
  • [MapStruct] 01. MapStruct란 무엇인가?
  • [프랙티컬 모던 자바] 02. 인터페이스
뚝딱뚝딱2
뚝딱뚝딱2
  • 뚝딱뚝딱2
    개발도상국
    뚝딱뚝딱2
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 공부
        • Java
        • Spring Boot
        • LORA
      • Web
        • 인스타 클론 코딩
        • GPT 응답 API 서버
        • Spring Boot 예외 처리
        • 코테 준비용 서비스 만들기
      • DevOps
        • 쿠버네티스
        • 서버 만들기
      • 코딩테스트
        • 알고리즘
      • 교육
        • 스파르타코딩클럽 - 내일배움단
        • 혼자 공부하는 컴퓨터 구조 운영체제
      • 잡다한것
  • 블로그 메뉴

    • 홈
  • 링크

    • GITHUB
  • 공지사항

  • 인기 글

  • 태그

    예외
    MSA
    Entity
    REST API
    쿠버네티스
    OpenAI API
    chat GPT
    mapstruct
    Java
    react
    인스타그램
    오블완
    스프링 부트
    스프링부트
    spring boot
    리액트
    클론코딩
    티스토리챌린지
    클러스터
    백준
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
뚝딱뚝딱2
[MapStruct] 03. 심화 사용법
상단으로

티스토리툴바