-
MapStruct 의 다양한 사용에 대해 알아보자Server/Spring Boot 2025. 4. 16. 13:08728x90반응형
🚀 MapStruct 고급 매핑 예제
이번엔 MapStruct를 좀 더 깊이 있게 사용하는 예제들을 소개합니다.
List 매핑
,@AfterMapping
,@Named
,@InheritInverseConfiguration
등 실제 프로젝트에서도 매우 유용한 기능들이에요.
1️⃣ List 매핑
컬렉션 타입도 자동 매핑 가능합니다.
// 단일 DTO 매핑 메서드 UserDto toDto(User user); // 리스트 매핑 List<UserDto> toDtoList(List<User> users);
단, 단일 객체 매핑 메서드가 정의되어 있어야 리스트 매핑도 동작합니다.
---
2️⃣ @AfterMapping - 매핑 후 추가 작업 처리
매핑이 완료된 후 후처리를 하고 싶을 경우
@AfterMapping
을 사용합니다.@Mapper(componentModel = "spring") public interface UserMapper { UserDto toDto(User user); @AfterMapping default void setCustomFields(@MappingTarget UserDto dto, User user) { dto.setUsername(dto.getUsername().toUpperCase()); } }
@MappingTarget
: 결과 객체를 참조합니다.- 위 예시에서는 매핑된 결과 중
username
필드를 대문자로 수정합니다.
---
3️⃣ @Named - 재사용 가능한 매핑 정의
@Named
는 재사용 가능한 변환 메서드를 만들고,qualifiedByName
으로 명시적으로 사용할 때 유용합니다.@Mapper(componentModel = "spring") public interface UserMapper { @Mapping(source = "email", target = "email", qualifiedByName = "maskEmail") UserDto toDto(User user); @Named("maskEmail") static String maskEmail(String email) { if (email == null || !email.contains("@")) return email; return "***@" + email.substring(email.indexOf("@") + 1); } }
포인트: 민감 정보를 가릴 때, 포맷을 바꿀 때 유용하게 사용됩니다.
---
4️⃣ @InheritInverseConfiguration - 양방향 매핑 간소화
@InheritInverseConfiguration
은 기존 매핑 설정을 반대로 재사용할 수 있게 해줍니다.@Mapper(componentModel = "spring") public interface UserMapper { @Mapping(source = "name", target = "username") UserDto toDto(User user); @InheritInverseConfiguration User toEntity(UserDto dto); }
장점: 중복되는
@Mapping
을 줄이고, 실수를 방지할 수 있어요.---
5️⃣ 여러 기능을 조합한 예제
@Mapper(componentModel = "spring") public interface UserMapper { @Mapping(source = "name", target = "username") @Mapping(source = "email", target = "email", qualifiedByName = "maskEmail") UserDto toDto(User user); @InheritInverseConfiguration @Mapping(target = "id", ignore = true) User toEntity(UserDto dto); List<UserDto> toDtoList(List<User> users); @Named("maskEmail") static String maskEmail(String email) { if (email == null || !email.contains("@")) return email; return "***@" + email.substring(email.indexOf("@") + 1); } @AfterMapping default void afterMapping(@MappingTarget UserDto dto, User user) { dto.setUsername(dto.getUsername().toUpperCase()); } }
---
🧠 마무리 정리
- List 매핑은 단일 매핑 메서드가 있을 때 자동 지원됨
- @AfterMapping은 후처리 로직 작성에 유용
- @Named +
qualifiedByName
은 커스텀 메서드 재사용 시 필수 - @InheritInverseConfiguration은 양방향 매핑을 편리하게 관리
이렇게 MapStruct의 기능을 적절히 조합하면, 반복 코드를 줄이면서도 확장성과 가독성을 높일 수 있습니다 😎
728x90반응형'Server > Spring Boot' 카테고리의 다른 글
[Springboot] 스레드와 프로세스를 구분해보자! (0) 2025.04.18 💡 Java Spring에서 자주 사용하는 ObjectMapper (1) 2025.04.17 MapStruct 의 @Mapping 사용 방법을 알아보자! (1) 2025.04.16 MapStruct 의 @Mapper 사용에 대해 알아보자! (0) 2025.04.16 [Springboot] 엔티티와 DTO 간 변환시 MapStruct 사용해야 하는 이유? (0) 2025.04.16