728x90
이전 글에서 기본적인 MapStruct 라이브러리를 사용하는 방법을 알아봤다. 기본 사용법에서 더 나아가서 더 복잡한 로직을 구현할 수 있는 어노테이션도 알아보자!
@AfterMapping
@AfterMapping 어노테이션은 대상 타입의 객체가 매핑된 후 추가적인 커스텀 로직을 실행하고 싶을 때 사용된다. 이 어노테이션은 매핑 과정이 끝난 직후에 호출되므로, 매핑되지 않은 필드를 수동으로 설정할 수 있다.
@Named
@Named 어노테이션은 특정 매핑 메서드에 이름을 부여하여, 매핑 대상 필드에서 이 메서드를 지정하여 사용하고자 할 때 적용된다. 이를 통해 복잡한 매핑 로직이나, 다양한 상황에 따른 매핑 로직을 구현할 수 있다.
어노테이션 사용 예시 코드
Entity (Question.java)
@Getter
@Setter
public class Question {
private Long id;
private String content;
private boolean isSecret;
private Long userId;
}
DTO (QuestionDTO.java)
@Getter
@Setter
public class QuestionDTO {
private Long questionId;
private String questionContent;
private boolean viewableByCurrentUser;
}
Mapper (Converter Interface)
이제 @Mapper(componentModel = "spring")를 사용하면서, @Named, expression, 그리고 ignore를 포함한 매퍼 인터페이스를 만들어보자.
import org.mapstruct.AfterMapping;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;
import org.mapstruct.Named;
import org.mapstruct.factory.Mappers;
@Mapper(componentModel = "spring")
public interface QuestionMapper {
@Mapping(target = "questionId", source = "id")
@Mapping(target = "questionContent", expression = "java(convertSecretContent(question.getContent(), question.isSecret(), question.getUserId(), true, 1L))")
@Mapping(target = "viewableByCurrentUser", ignore = true)
QuestionDTO questionToQuestionDTO(Question question);
@Named("convertSecretContent")
default String convertSecretContent(String content, boolean isSecret, Long userId, boolean isLoginUser, Long userKey) {
if (isSecret && (!isLoginUser || !userId.equals(userKey))) {
return "비밀 글입니다.";
}
return content;
}
}
- @Mapper(componentModel = "spring"): 이 옵션을 사용하면, MapStruct는 Spring 빈으로 등록될 수 있는 매퍼 구현체를 생성한다. 이렇게 되면, 매퍼를 자동으로 주입받아 사용할 수 있다.
- @Named: 특정 매핑 로직에 이름을 부여하고, expression 내에서 이 이름을 참조하여 사용할 수 있다. 이는 복잡한 매핑 로직을 재사용할 때 유용하다.
- expression: expression은 Java 표현식을 사용하여 매핑 로직을 직접 정의할 때 사용된다. 이 예제에서는 convertSecretContent 메서드를 호출하여 비밀 글 처리 로직을 구현한다. expression을 사용하면 매우 특정한 매핑 요구 사항에도 유연하게 대응할 수 있다.
- ignore = true: 특정 필드의 매핑을 무시하고 싶을 때 사용된다. 이 예제에서는 viewableByCurrentUser 필드가 무시되며, 이는 매핑 과정에서 해당 필드를 설정하지 않겠다는 의미이다. 경우에 따라 매핑되지 않아야 할 필드가 있을 수 있으므로, 이 옵션을 통해 유연하게 대응 가능하다.
이런 식으로 MapStruct를 사용하면 복잡한 객체 매핑 요구 사항도 세밀하게 제어할 수 있다.
'Spring > Spring Boot' 카테고리의 다른 글
동시성 이슈 해결을 위한 Redis Lock (0) | 2024.06.10 |
---|---|
Redis에서 @RedisHash, @Id, @Indexed의 쓰임새 (0) | 2024.06.10 |
객체 간 매핑을 도와주는 MapStruct 라이브러리(1) - 기본 어노테이션 (0) | 2024.04.02 |
Lombok의 @Builder 어노테이션으로 객체 생성 (0) | 2024.04.02 |
RequestDto에서 MultipartFile 필드 사용 방법: 객체 바인딩 방법부터 테스트 코드까지 (3) | 2024.01.13 |