SlideShare a Scribd company logo
MapStruct
소스 : https://github.com/hyomee/JAVABASIC
Content
1. pom.xml 설정
2. 동일 이름 매핑
3. Spring과 CDI ( Contexts and Dependency Injection )
4. 다른 이름 매핑
5. 여러 객체를 하나로
6. 리스트 객체
7. 자식 매핑
8. 기존 인스턴스 객체 update
9. 타입 매핑, 기본값, NULL, 표현식
10. 매핑 전. 후 처리 및 Collection Mapping
11. 정책
소스 : https://github.com/hyomee/JAVABASIC
1. 기본
- <dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.4.0.Final</version>
</dependency>
MapStruct는 java Bean 간의 매핑을 구현을 단순화하는 코드 생성기
Interface를 생성 한 후 컴파일을 하면 자동으로 구현채를 생성 함.
- mapstruct-processor 구성
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.3.1.Final</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
@Mapper
public interface SimpleSourceToTargetMapper {
SimpleSourceToTargetMapper SIMPLE_SOURCE_TO_TARGET_MAPPER = Mappers.getMapper(SimpleSourceToTargetMapper.class);
SimpleTargetDTO sourceDTOToTargetDTO(SimpleSourceDTO simpleSourceDTO);
SimpleSourceDTO targetDTOToSoreceDTO(SimpleTargetDTO simpleTargetDTO);
}
@Generated(
value = "org.mapstruct.ap.MappingProcessor“)
@Component
public class SimpleSourceToTargetMapperImpl implements SimpleSourceToTargetMapper {
@Override
public SimpleTargetDTO sourceDTOToTargetDTO(SimpleSourceDTO simpleSourceDTO) {
if ( simpleSourceDTO == null ) {
return null;
}
SimpleTargetDTO simpleTargetDTO = new SimpleTargetDTO();
simpleTargetDTO.setCustNo( simpleSourceDTO.getCustNo() );
simpleTargetDTO.setCustNm( simpleSourceDTO.getCustNm() );
return simpleTargetDTO;
}
@Override
public SimpleSourceDTO targetDTOToSoreceDTO(SimpleTargetDTO simpleTargetDTO) {
if ( simpleTargetDTO == null ) {
return null;
}
SimpleSourceDTO simpleSourceDTO = new SimpleSourceDTO();
simpleSourceDTO.setCustNo( simpleTargetDTO.getCustNo() );
simpleSourceDTO.setCustNm( simpleTargetDTO.getCustNm() );
return simpleSourceDTO;
}
}
mvn clean install ( compile )
2. 동일 이름 매핑
@Mapper
public interface SimpleSourceToTargetMapper {
SimpleSourceToTargetMapper SIMPLE_SOURCE_TO_TARGET_MAPPER = Mappers.getMapper(SimpleSourceToTargetMapper.class);
SimpleTargetDTO sourceDTOToTargetDTO(SimpleSourceDTO simpleSourceDTO);
}
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2021-01-04T22:33:37+0900",
comments = "version: 1.4.1.Final, compiler: javac, environment: Java 11.0.2 (Oracle Corporation)"
)
@Component
public class SimpleSourceToTargetMapperImpl implements SimpleSourceToTargetMapper {
@Override
public SimpleTargetDTO sourceDTOToTargetDTO(SimpleSourceDTO simpleSourceDTO) {
if ( simpleSourceDTO == null ) {
return null;
}
SimpleTargetDTO simpleTargetDTO = new SimpleTargetDTO();
simpleTargetDTO.setCustNo( simpleSourceDTO.getCustNo() );
simpleTargetDTO.setCustNm( simpleSourceDTO.getCustNm() );
return simpleTargetDTO;
}}
mvn clean install ( compile )
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor(staticName = "of")
public class SimpleSourceDTO {
private String custNo;
private String custNm;
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor(staticName = "of")
public class SimpleTargetDTO {
private String custNo;
private String custNm;
}
@Test
void contextLoads() {
SimpleSourceDTO simpleSourceDTO = SimpleSourceDTO.of("홍길동", "A0001");
SimpleTargetDTO simpleTargetDTO = SimpleSourceToTargetMapper.SIMPLE_SOURCE_TO_TARGET_MAPPER.sourceDTOToTargetDTO(simpleSourceDTO);
assertEquals(simpleSourceDTO.getCustNm(), simpleTargetDTO.getCustNm());
assertEquals(simpleSourceDTO.getCustNo(), simpleTargetDTO.getCustNo());
}
매핑
3. Spring과 CDI
- Spring 사용 :: @Mapper(componentModel = "spring")
- Spring 미사용 :: @Mapper(componentModel = " cdi ")
MapStruct 의존성 주입
프로그램 스레드 이름 : main :: Start
프로그램 스레드 이름 : main :: End
프로그램 스레드 이름 : threadB :: add ...
프로그램 스레드 이름 : threadA :: add ...
프로그램 스레드 이름 : ThreadC :: add ...
프로그램 스레드 이름 : ThreadC :: 20 까지의 합은 : 210
프로그램 스레드 이름 : threadB :: 20 까지의 합은 : 210
프로그램 스레드 이름 : threadA :: 20 까지의 합은 : 210
프로그램 스레드 이름 : main :: Start
프로그램 스레드 이름 : main :: End
프로그램 스레드 이름 : threadE :: add ...
프로그램 스레드 이름 : threadD :: add ...
프로그램 스레드 이름 : threadD :: 20 까지의 합은 : 210
프로그램 스레드 이름 : threadE :: 20 까지의 합은 : 210
@Mapper(componentModel = "spring")
public interface SimpleToTargetInjection {
SimpleTargetDTO sourceToTarget(SimpleSourceDTO simpleSourceDTO);
SimpleSourceDTO targetToSorece(SimpleTargetDTO simpleTargetDTO);
}
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2021-01-04T23:21:52+0900",
comments = "version: 1.4.1.Final, compiler: javac, environment: Java 11.0.2 (Oracle Corporation)"
)
@Component
public class SimpleToTargetInjectionImpl implements SimpleToTargetInjection {
@Override
public SimpleTargetDTO sourceToTarget(SimpleSourceDTO simpleSourceDTO) {
if ( simpleSourceDTO == null ) {
return null;
}
SimpleTargetDTO simpleTargetDTO = new SimpleTargetDTO();
simpleTargetDTO.setCustNo( simpleSourceDTO.getCustNo() );
simpleTargetDTO.setCustNm( simpleSourceDTO.getCustNm() );
return simpleTargetDTO;
}
……….
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor(staticName = "of")
public class SimpleSourceDTO {
private String custNo;
private String custNm;
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor(staticName = "of")
public class SimpleTargetDTO {
private String custNo;
private String custNm;
}
@Autowired
private SimpleToTargetInjection simpleToTargetInjection ;
@Test
void contextLoads() {
SimpleSourceDTO simpleSourceDTO = SimpleSourceDTO.of("홍길동", "A0001");
SimpleTargetDTO simpleTargetDTO = simpleToTargetInjection.sourceToTarget(simpleSourceDTO);
assertEquals(simpleSourceDTO.getCustNm(), simpleTargetDTO.getCustNm());
assertEquals(simpleSourceDTO.getCustNo(), simpleTargetDTO.getCustNo());
}
4. 다른 동일 이름 매핑
mvn clean install ( compile )
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor(staticName = "of")
public class SimpleSourceDTO {
private String custNo;
private String custNm;
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor(staticName = "of")
public class SimpleDifferentTargetDTO {
private String custNumber;
private String custNm;
private String ages;
}
@Mapper(componentModel = "spring")
public interface DiffrentMapStruct {
@Mappings({
@Mapping(target="custNumber", source = "custNo")
})
SimpleDifferentTargetDTO simpleToDifferent(SimpleSourceDTO simpleSourceDTO);
} 매핑
@Autowired
private DiffrentMapStruct diffrentMapStruct ;
@Test
void contextLoads() {
SimpleSourceDTO simpleSourceDTO = SimpleSourceDTO.of("홍길동", "A0001");
SimpleDifferentTargetDTO simpleDifferentTargetDTO = diffrentMapStruct.simpleToDifferent(simpleSourceDTO);
assertEquals(simpleSourceDTO.getCustNm(), simpleDifferentTargetDTO.getCustNm());
assertEquals(simpleSourceDTO.getCustNo(), simpleDifferentTargetDTO.getCustNumber());
}
@Generated(
value = "org.mapstruct.ap.MappingProcessor"
)
@Component
public class DiffrentMapStructImpl implements DiffrentMapStruct {
@Override
public SimpleDifferentTargetDTO simpleToDifferent(SimpleSourceDTO simpleSourceDTO) {
if ( simpleSourceDTO == null ) {
return null;
}
SimpleDifferentTargetDTO simpleDifferentTargetDTO = new SimpleDifferentTargetDTO();
simpleDifferentTargetDTO.setCustNumber( simpleSourceDTO.getCustNo() );
simpleDifferentTargetDTO.setCustNm( simpleSourceDTO.getCustNm() );
return simpleDifferentTargetDTO;
}
}
5. 여러 객체를 하나로
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor(staticName = "of")
public class UserDTO {
private String userNo;
private String userNm;
private String ages;
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor(staticName = "of")
public class AddressDTO {
private String userNo;
private String postNo;
private String address;
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor(staticName = "of")
public class UserAddressDTO {
private String userNo;
private String userNm;
private String nai;
private String address;
}
@Mapper(componentModel = "spring")
public interface Composer {
@Mapping(target = "nai", source = "userDTO.ages")
@Mapping(target = "userNo", source = "userDTO.userNo")
UserAddressDTO toUserAddress(UserDTO userDTO, AddressDTO
addressDTO);
}
@Generated(
value = "org.mapstruct.ap.MappingProcessor"
)
@Component
public class ComposerImpl implements Composer {
@Override
public UserAddressDTO toUserAddress(UserDTO userDTO, AddressDTO addressDTO) {
if ( userDTO == null && addressDTO == null ) {
return null;
}
UserAddressDTO userAddressDTO = new UserAddressDTO();
if ( userDTO != null ) {
userAddressDTO.setNai( userDTO.getAges() );
userAddressDTO.setUserNo( userDTO.getUserNo() );
userAddressDTO.setUserNm( userDTO.getUserNm() );
}
if ( addressDTO != null ) {
userAddressDTO.setAddress( addressDTO.getAddress() );
}
return userAddressDTO;
}
}
** 같은 이름을 재외 한 다른 이름의 필드를 @Mapping을 사용해서 정의
source는 객체.필드를 사용 하여 정확히 표시 함
=> 표시 하지 않으면 빌드 오류 발생
6. 리스트 객체
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor(staticName = "of")
public class UserAddDTO {
private String userNo;
private String userNm;
private String ages;
private List<AddressDTO> addressDTOList;
private List<MemberDTO> memberDTOList;
} @Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor(staticName = "of")
public class MemberDTO {
private String userNo;
private String memberNo;
private String memberNm;
private String ages;
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor(staticName = "of")
public class AddressDTO {
private String userNo;
private String postNo;
private String address;
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor(staticName = "of")
public class TargetUserAddDTO {
private String userNo;
private String userNm;
private String ages;
private List<AddressDTO> addressDTOS;
private List<MemberDTO> memberDTOList;
}
@Mapper(componentModel = "spring")
public interface usertToTarget {
@Mapping(target="addressDTOS", source = "addressDTOList")
TargetUserAddDTO toDto(UserAddDTO userAddDTO);
}
@Generated(
value = "org.mapstruct.ap.MappingProcessor")
@Component
public class usertToTargetImpl implements usertToTarget {
@Override
public TargetUserAddDTO toDto(UserAddDTO userAddDTO) {
if ( userAddDTO == null ) {
return null;
}
TargetUserAddDTO targetUserAddDTO = new TargetUserAddDTO();
List<AddressDTO> list = userAddDTO.getAddressDTOList();
if ( list != null ) {
targetUserAddDTO.setAddressDTOS( new ArrayList<AddressDTO>( list ) );
}
targetUserAddDTO.setUserNo( userAddDTO.getUserNo() );
targetUserAddDTO.setUserNm( userAddDTO.getUserNm() );
targetUserAddDTO.setAges( userAddDTO.getAges() );
List<MemberDTO> list1 = userAddDTO.getMemberDTOList();
if ( list1 != null ) {
targetUserAddDTO.setMemberDTOList( new ArrayList<MemberDTO>( list1 ) );
}
return targetUserAddDTO;
}
}
동일이름 자동 매핑
다른 이름
7. 자식 매핑
@Generated(
value = "org.mapstruct.ap.MappingProcessor")
@Component
public class UserParentMapperImpl implements UserParentMapper {
@Autowired
private AddressChildMapper addressChildMapper;
@Override
public UserParentDTO toDto(UserParent userParent) {
if ( userParent == null ) {
return null;
}
UserParentDTO userParentDTO = new UserParentDTO();
userParentDTO.setAddressChildDTOList( addressChildListToAddressChildDTOList( userParent.getAddressChildList() ) );
userParentDTO.setUserNo( userParent.getUserNo() );
userParentDTO.setUserNm( userParent.getUserNm() );
return userParentDTO;
}
protected List<AddressChildDTO> addressChildListToAddressChildDTOList(List<AddressChild> list) {
if ( list == null ) {
return null;
}
List<AddressChildDTO> list1 = new ArrayList<AddressChildDTO>( list.size() );
for ( AddressChild addressChild : list ) {
list1.add( addressChildMapper.toDto( addressChild ) );
}
return list1;
}
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor(staticName = "of")
public class AddressChild {
private String userNo;
private String adderssNo;
private String address;
}
public class UserParent {
private String userNo;
private String userNm;
private List<AddressChild> addressChildList;
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor(staticName = "of")
public class UserParentDTO {
private String userNo;
private String userNm;
private List<AddressChildDTO>
addressChildDTOList;
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor(staticName = "of")
public class AddressChildDTO {
private String userNo;
private String adderssNo;
private String address;
}
@Mapper(componentModel = "spring", uses = {AddressChildMapper.class})
public interface UserParentMapper {
@Mapping(target = "addressChildDTOList", source = "userParent.addressChildList")
UserParentDTO toDto(UserParent userParent);
}
8. 기존 인스턴스 update
@Generated(
value = "org.mapstruct.ap.MappingProcessor")
@Component
public class UserParentMapperImpl implements UserParentMapper {
@Autowired
private AddressChildMapper addressChildMapper;
@Override
public void updateUserParentDto(UserParent userParent, UserParentDTO userParentDTO) {
if ( userParent == null ) {
return;
}
if ( userParentDTO.getAddressChildDTOList() != null ) {
List<AddressChildDTO> list = addressChildListToAddressChildDTOList( userParent.getAddressChildList() );
if ( list != null ) {
userParentDTO.getAddressChildDTOList().clear();
userParentDTO.getAddressChildDTOList().addAll( list );
}
else {
userParentDTO.setAddressChildDTOList( null );
}
}
else {
List<AddressChildDTO> list = addressChildListToAddressChildDTOList( userParent.getAddressChildList() );
if ( list != null ) {
userParentDTO.setAddressChildDTOList( list );
}
}
userParentDTO.setUserNo( userParent.getUserNo() );
userParentDTO.setUserNm( userParent.getUserNm() );
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor(staticName = "of")
public class AddressChild {
private String userNo;
private String adderssNo;
private String address;
}
public class UserParent {
private String userNo;
private String userNm;
private List<AddressChild> addressChildList;
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor(staticName = "of")
public class UserParentDTO {
private String userNo;
private String userNm;
private List<AddressChildDTO>
addressChildDTOList;
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor(staticName = "of")
public class AddressChildDTO {
private String userNo;
private String adderssNo;
private String address;
}
@Mapper(componentModel = "spring", uses = {AddressChildMapper.class})
public interface UserParentMapper {
@Mapping(target = "addressChildDTOList", source = "userParent.addressChildList")
void updateUserParentDto(UserParent userParent,
@MappingTarget UserParentDTO userParentDTO);
}
9. 타입 매핑, 기본값, NULL, 표현식
@Mapper(componentModel = "string",
// ERROR, IGNORE, WARN 정책
unmappedTargetPolicy = ReportingPolicy.ERROR,
// Source가 null이거나 혹은 Source의 특정 필드가 null인 경우
nullValueMappingStrategy = NullValueMappingStrategy.RETURN_NULL,
imports = {LocalDateTime.class, UUID.class})
public interface DataTypeMap {
@Mapping(target="id", constant = "-1L")
@Mapping(target="userId", expression = "java(UUID.randomUUID().toString())")
@Mapping(target="userNm", source = "userNm", defaultValue = "이름")
@Mapping(target="birthday", source = "birthday", dateFormat = "dd-MM-yyyy HH:mm:ss")
@Mapping(target="pay", source = "pay", numberFormat = "$#.00")
@Mapping(target="currentDate", source = "currentDate",
defaultExpression = "java(LocalDateTime.now())")
// 특정 필드는 매핑되지 않길 원한다면 @Mapping 어노테이션에 ignore = true 속성
@Mapping(target="desc", source = "desc", ignore = true)
UserTypeDTO toDto(UserType userType);
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor(staticName = "of")
public class UserType {
private long id;
private String userId;
private String userNm;
private Date birthday;
private String pay;
private LocalDateTime currentDate;
private String desc;
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor(staticName = "of")
public class UserTypeDTO {
private long id;
private String userId ; // defaultExpression
private String userNm;
private String birthday; // dateFormat
private long pay; // numberFormat
private LocalDateTime currentDate;
private String desc;
}
@Generated(
value = "org.mapstruct.ap.MappingProcessor"
)
public class DataTypeMapImpl implements DataTypeMap {
@Override
public UserTypeDTO toDto(UserType userType) {
if ( userType == null ) {
return null;
}
UserTypeDTO userTypeDTO = new UserTypeDTO();
if ( userType.getUserNm() != null ) {
userTypeDTO.setUserNm( userType.getUserNm() );
}
else {
userTypeDTO.setUserNm( "이름" );
}
if ( userType.getBirthday() != null ) {
userTypeDTO.setBirthday( new SimpleDateFormat( "dd-MM-yyyy HH:mm:ss" ).format( userType.getBirthday() ) );
}
try {
if ( userType.getPay() != null ) {
userTypeDTO.setPay( new DecimalFormat( "$#.00" ).parse( userType.getPay() ).longValue() );
}
}
catch ( ParseException e ) {
throw new RuntimeException( e );
}
if ( userType.getCurrentDate() != null ) {
userTypeDTO.setCurrentDate( userType.getCurrentDate() );
}
else {
userTypeDTO.setCurrentDate( LocalDateTime.now() );
}
userTypeDTO.setId( -1L );
userTypeDTO.setUserId( UUID.randomUUID().toString() );
return userTypeDTO;
}
}
10. 매핑 전. 후 처리 및 Collection Mapping
@Mapper(uses = {PatientMapper.class}, componentModel = "spring")
public abstract class DoctorCustomMapper {
@BeforeMapping
protected void validate(Doctor doctor) {
if(doctor.getPatientList() == null){
doctor.setPatientList(new ArrayList<>());
}
}
@AfterMapping
protected void updateResult(@MappingTarget DoctorDto doctorDto) {
doctorDto.setName(doctorDto.getName().toUpperCase());
doctorDto.setDegree(doctorDto.getDegree().toUpperCase());
doctorDto.setSpecialization(doctorDto.getSpecialization().toUpperCase());
}
@Mapping(source = "doctor.patientList", target = "patientDtoList")
@Mapping(source = "doctor.specialty", target = "specialization")
public abstract DoctorDto toDoctorDto(Doctor doctor);
}
https://www.baeldung.com/java-mapstruct-mapping-collections
@Mapper
public interface EmployeeMapper {
List<EmployeeDTO> map(List<Employee> employees);
}
@Mapper
public interface EmployeeMapper {
Set<EmployeeDTO> map(Set<Employee> employees);
}
11. 정책
정책 값 설명
unmappedSourcePolicy
IGNORE(default),
WARN,
ERROR
Source의 필드가 Target에 매핑되지 않을 때 정책이다.
예, ERROR로 설정하면 매핑 시 Source.aField가 사용되지 않는다면 컴파일 오류가 발생시킨다.
unmappedTargetPolicy
IGNORE,
WARN(default),
ERROR
Target의 필드가 매핑되지 않을 때 정책이다.
예, ERROR로 설정하면 매핑 시 Target.aField에 값이 매핑되지 않는다면 컴파일 오류가 발생시킨다.
typeConversionPolicy
IGNORE(default),
WARN,
ERROR
타입 변환 시 유실이 발생할 수 있을 때 정책이다.
예, ERROR로 설정하면 long에서 int로 값을 넘길 때 값에 유실이 발생할 수 있다. 이런 경우에 컴파일 오류를 발생
시킨다.
전략 값 설명
nullValueMappingStrategy
RETURN_NULL(default),
RETURN_DEFAULT
Source가 null일 때 정책이다.
nullValuePropertyMappingStrategy
SET_TO_NULL(default),
SET_TO_DEFAULT,
IGNORE
Source의 필드가 null일 때 정책이다.
www.iabacus.co.kr
Tel. 82-2-2109-5400
Fax. 82-2-6442-5409
THANKS

More Related Content

DOC
12. stl örnekler
PDF
The Browser Environment - A Systems Programmer's Perspective
PDF
The Browser Environment - A Systems Programmer's Perspective [sinatra edition]
DOCX
PathOfMostResistance
PDF
Go for the paranoid network programmer, 3rd edition
PDF
5. Ввод-вывод, доступ к файловой системе
PDF
Apache Commons - Don\'t re-invent the wheel
ODP
Scala 2 + 2 > 4
12. stl örnekler
The Browser Environment - A Systems Programmer's Perspective
The Browser Environment - A Systems Programmer's Perspective [sinatra edition]
PathOfMostResistance
Go for the paranoid network programmer, 3rd edition
5. Ввод-вывод, доступ к файловой системе
Apache Commons - Don\'t re-invent the wheel
Scala 2 + 2 > 4

What's hot (18)

PDF
Design Patterns in PHP5
PPTX
Twitter Author Prediction from Tweets using Bayesian Network
PDF
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6
KEY
Sbaw091006
PDF
Python client api
DOCX
PDF
JEEConf 2017 - Having fun with Javassist
KEY
Gae icc fall2011
PDF
Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)
PDF
Google Guava for cleaner code
PPTX
What’s new in C# 6
PDF
Catch a spider monkey
PDF
GeeCON 2017 - TestContainers. Integration testing without the hassle
PDF
Python Performance 101
PDF
Kotlin Generation
PDF
Java File
PDF
Being functional in PHP (DPC 2016)
PDF
Session 40 : SAGA Overview and Introduction
Design Patterns in PHP5
Twitter Author Prediction from Tweets using Bayesian Network
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6
Sbaw091006
Python client api
JEEConf 2017 - Having fun with Javassist
Gae icc fall2011
Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)
Google Guava for cleaner code
What’s new in C# 6
Catch a spider monkey
GeeCON 2017 - TestContainers. Integration testing without the hassle
Python Performance 101
Kotlin Generation
Java File
Being functional in PHP (DPC 2016)
Session 40 : SAGA Overview and Introduction
Ad

Similar to Map struct (20)

KEY
CouchDB on Android
PDF
Multilingualism makes better programmers
PDF
Having Fun with Play
PDF
From Legacy to Hexagonal (An Unexpected Android Journey)
KEY
Android workshop
PDF
Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-
PDF
mobl
PDF
My way to clean android - Android day salamanca edition
PDF
The 2016 Android Developer Toolbox [MOBILIZATION]
PDF
Overview of Android Infrastructure
PDF
Overview of Android Infrastructure
ODP
Non Conventional Android Programming En
ODP
Non Conventional Android Programming (English)
PPTX
ExSchema
KEY
Paris js extensions
PDF
Powerful persistence layer with Google Guice & MyBatis
PDF
PPT
Play!ng with scala
PPT
Android - Api & Debugging in Android
PDF
Webinar: Building Your First App with MongoDB and Java
CouchDB on Android
Multilingualism makes better programmers
Having Fun with Play
From Legacy to Hexagonal (An Unexpected Android Journey)
Android workshop
Grails 1.2 探検隊 -新たな聖杯をもとめて・・・-
mobl
My way to clean android - Android day salamanca edition
The 2016 Android Developer Toolbox [MOBILIZATION]
Overview of Android Infrastructure
Overview of Android Infrastructure
Non Conventional Android Programming En
Non Conventional Android Programming (English)
ExSchema
Paris js extensions
Powerful persistence layer with Google Guice & MyBatis
Play!ng with scala
Android - Api & Debugging in Android
Webinar: Building Your First App with MongoDB and Java
Ad

More from Hyosang Hong (20)

PDF
MSA_기초자료.pdf
PDF
Java 변수자료형
PDF
Java 연산자
PDF
Java lambda
PDF
Java inner class
PDF
Java generic
PDF
Java 기초
PDF
Java extends
PDF
Java 제어
PDF
Java collection
PDF
Java class
PDF
Spring 교육 자료
PDF
Map struct
PDF
Kafka 자료 v0.1
PDF
Jpa 쿼리 포함 자료
PDF
Java 이해하기 쉬운 코드 20210405
PDF
Java 유지보수 가능한 개발 원칙
PDF
PDF
Java stream v0.1
PDF
Spring 교육 자료
MSA_기초자료.pdf
Java 변수자료형
Java 연산자
Java lambda
Java inner class
Java generic
Java 기초
Java extends
Java 제어
Java collection
Java class
Spring 교육 자료
Map struct
Kafka 자료 v0.1
Jpa 쿼리 포함 자료
Java 이해하기 쉬운 코드 20210405
Java 유지보수 가능한 개발 원칙
Java stream v0.1
Spring 교육 자료

Recently uploaded (20)

PDF
VCE English Exam - Section C Student Revision Booklet
PPTX
PPH.pptx obstetrics and gynecology in nursing
PDF
TR - Agricultural Crops Production NC III.pdf
PPTX
Institutional Correction lecture only . . .
PDF
Saundersa Comprehensive Review for the NCLEX-RN Examination.pdf
PDF
Basic Mud Logging Guide for educational purpose
PPTX
GDM (1) (1).pptx small presentation for students
PDF
FourierSeries-QuestionsWithAnswers(Part-A).pdf
PDF
01-Introduction-to-Information-Management.pdf
PDF
Classroom Observation Tools for Teachers
PPTX
Cell Types and Its function , kingdom of life
PDF
Anesthesia in Laparoscopic Surgery in India
PPTX
school management -TNTEU- B.Ed., Semester II Unit 1.pptx
PDF
Module 4: Burden of Disease Tutorial Slides S2 2025
PPTX
IMMUNITY IMMUNITY refers to protection against infection, and the immune syst...
PDF
BÀI TẬP BỔ TRỢ 4 KỸ NĂNG TIẾNG ANH 9 GLOBAL SUCCESS - CẢ NĂM - BÁM SÁT FORM Đ...
PPTX
Pharmacology of Heart Failure /Pharmacotherapy of CHF
PDF
2.FourierTransform-ShortQuestionswithAnswers.pdf
PPTX
Final Presentation General Medicine 03-08-2024.pptx
PDF
ANTIBIOTICS.pptx.pdf………………… xxxxxxxxxxxxx
VCE English Exam - Section C Student Revision Booklet
PPH.pptx obstetrics and gynecology in nursing
TR - Agricultural Crops Production NC III.pdf
Institutional Correction lecture only . . .
Saundersa Comprehensive Review for the NCLEX-RN Examination.pdf
Basic Mud Logging Guide for educational purpose
GDM (1) (1).pptx small presentation for students
FourierSeries-QuestionsWithAnswers(Part-A).pdf
01-Introduction-to-Information-Management.pdf
Classroom Observation Tools for Teachers
Cell Types and Its function , kingdom of life
Anesthesia in Laparoscopic Surgery in India
school management -TNTEU- B.Ed., Semester II Unit 1.pptx
Module 4: Burden of Disease Tutorial Slides S2 2025
IMMUNITY IMMUNITY refers to protection against infection, and the immune syst...
BÀI TẬP BỔ TRỢ 4 KỸ NĂNG TIẾNG ANH 9 GLOBAL SUCCESS - CẢ NĂM - BÁM SÁT FORM Đ...
Pharmacology of Heart Failure /Pharmacotherapy of CHF
2.FourierTransform-ShortQuestionswithAnswers.pdf
Final Presentation General Medicine 03-08-2024.pptx
ANTIBIOTICS.pptx.pdf………………… xxxxxxxxxxxxx

Map struct

  • 2. Content 1. pom.xml 설정 2. 동일 이름 매핑 3. Spring과 CDI ( Contexts and Dependency Injection ) 4. 다른 이름 매핑 5. 여러 객체를 하나로 6. 리스트 객체 7. 자식 매핑 8. 기존 인스턴스 객체 update 9. 타입 매핑, 기본값, NULL, 표현식 10. 매핑 전. 후 처리 및 Collection Mapping 11. 정책 소스 : https://github.com/hyomee/JAVABASIC
  • 3. 1. 기본 - <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.4.0.Final</version> </dependency> MapStruct는 java Bean 간의 매핑을 구현을 단순화하는 코드 생성기 Interface를 생성 한 후 컴파일을 하면 자동으로 구현채를 생성 함. - mapstruct-processor 구성 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <configuration> <source>1.8</source> <target>1.8</target> <annotationProcessorPaths> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.3.1.Final</version> </path> </annotationProcessorPaths> </configuration> </plugin> @Mapper public interface SimpleSourceToTargetMapper { SimpleSourceToTargetMapper SIMPLE_SOURCE_TO_TARGET_MAPPER = Mappers.getMapper(SimpleSourceToTargetMapper.class); SimpleTargetDTO sourceDTOToTargetDTO(SimpleSourceDTO simpleSourceDTO); SimpleSourceDTO targetDTOToSoreceDTO(SimpleTargetDTO simpleTargetDTO); } @Generated( value = "org.mapstruct.ap.MappingProcessor“) @Component public class SimpleSourceToTargetMapperImpl implements SimpleSourceToTargetMapper { @Override public SimpleTargetDTO sourceDTOToTargetDTO(SimpleSourceDTO simpleSourceDTO) { if ( simpleSourceDTO == null ) { return null; } SimpleTargetDTO simpleTargetDTO = new SimpleTargetDTO(); simpleTargetDTO.setCustNo( simpleSourceDTO.getCustNo() ); simpleTargetDTO.setCustNm( simpleSourceDTO.getCustNm() ); return simpleTargetDTO; } @Override public SimpleSourceDTO targetDTOToSoreceDTO(SimpleTargetDTO simpleTargetDTO) { if ( simpleTargetDTO == null ) { return null; } SimpleSourceDTO simpleSourceDTO = new SimpleSourceDTO(); simpleSourceDTO.setCustNo( simpleTargetDTO.getCustNo() ); simpleSourceDTO.setCustNm( simpleTargetDTO.getCustNm() ); return simpleSourceDTO; } } mvn clean install ( compile )
  • 4. 2. 동일 이름 매핑 @Mapper public interface SimpleSourceToTargetMapper { SimpleSourceToTargetMapper SIMPLE_SOURCE_TO_TARGET_MAPPER = Mappers.getMapper(SimpleSourceToTargetMapper.class); SimpleTargetDTO sourceDTOToTargetDTO(SimpleSourceDTO simpleSourceDTO); } @Generated( value = "org.mapstruct.ap.MappingProcessor", date = "2021-01-04T22:33:37+0900", comments = "version: 1.4.1.Final, compiler: javac, environment: Java 11.0.2 (Oracle Corporation)" ) @Component public class SimpleSourceToTargetMapperImpl implements SimpleSourceToTargetMapper { @Override public SimpleTargetDTO sourceDTOToTargetDTO(SimpleSourceDTO simpleSourceDTO) { if ( simpleSourceDTO == null ) { return null; } SimpleTargetDTO simpleTargetDTO = new SimpleTargetDTO(); simpleTargetDTO.setCustNo( simpleSourceDTO.getCustNo() ); simpleTargetDTO.setCustNm( simpleSourceDTO.getCustNm() ); return simpleTargetDTO; }} mvn clean install ( compile ) @Getter @Setter @NoArgsConstructor @AllArgsConstructor(staticName = "of") public class SimpleSourceDTO { private String custNo; private String custNm; } @Getter @Setter @NoArgsConstructor @AllArgsConstructor(staticName = "of") public class SimpleTargetDTO { private String custNo; private String custNm; } @Test void contextLoads() { SimpleSourceDTO simpleSourceDTO = SimpleSourceDTO.of("홍길동", "A0001"); SimpleTargetDTO simpleTargetDTO = SimpleSourceToTargetMapper.SIMPLE_SOURCE_TO_TARGET_MAPPER.sourceDTOToTargetDTO(simpleSourceDTO); assertEquals(simpleSourceDTO.getCustNm(), simpleTargetDTO.getCustNm()); assertEquals(simpleSourceDTO.getCustNo(), simpleTargetDTO.getCustNo()); } 매핑
  • 5. 3. Spring과 CDI - Spring 사용 :: @Mapper(componentModel = "spring") - Spring 미사용 :: @Mapper(componentModel = " cdi ") MapStruct 의존성 주입 프로그램 스레드 이름 : main :: Start 프로그램 스레드 이름 : main :: End 프로그램 스레드 이름 : threadB :: add ... 프로그램 스레드 이름 : threadA :: add ... 프로그램 스레드 이름 : ThreadC :: add ... 프로그램 스레드 이름 : ThreadC :: 20 까지의 합은 : 210 프로그램 스레드 이름 : threadB :: 20 까지의 합은 : 210 프로그램 스레드 이름 : threadA :: 20 까지의 합은 : 210 프로그램 스레드 이름 : main :: Start 프로그램 스레드 이름 : main :: End 프로그램 스레드 이름 : threadE :: add ... 프로그램 스레드 이름 : threadD :: add ... 프로그램 스레드 이름 : threadD :: 20 까지의 합은 : 210 프로그램 스레드 이름 : threadE :: 20 까지의 합은 : 210 @Mapper(componentModel = "spring") public interface SimpleToTargetInjection { SimpleTargetDTO sourceToTarget(SimpleSourceDTO simpleSourceDTO); SimpleSourceDTO targetToSorece(SimpleTargetDTO simpleTargetDTO); } @Generated( value = "org.mapstruct.ap.MappingProcessor", date = "2021-01-04T23:21:52+0900", comments = "version: 1.4.1.Final, compiler: javac, environment: Java 11.0.2 (Oracle Corporation)" ) @Component public class SimpleToTargetInjectionImpl implements SimpleToTargetInjection { @Override public SimpleTargetDTO sourceToTarget(SimpleSourceDTO simpleSourceDTO) { if ( simpleSourceDTO == null ) { return null; } SimpleTargetDTO simpleTargetDTO = new SimpleTargetDTO(); simpleTargetDTO.setCustNo( simpleSourceDTO.getCustNo() ); simpleTargetDTO.setCustNm( simpleSourceDTO.getCustNm() ); return simpleTargetDTO; } ………. } @Getter @Setter @NoArgsConstructor @AllArgsConstructor(staticName = "of") public class SimpleSourceDTO { private String custNo; private String custNm; } @Getter @Setter @NoArgsConstructor @AllArgsConstructor(staticName = "of") public class SimpleTargetDTO { private String custNo; private String custNm; } @Autowired private SimpleToTargetInjection simpleToTargetInjection ; @Test void contextLoads() { SimpleSourceDTO simpleSourceDTO = SimpleSourceDTO.of("홍길동", "A0001"); SimpleTargetDTO simpleTargetDTO = simpleToTargetInjection.sourceToTarget(simpleSourceDTO); assertEquals(simpleSourceDTO.getCustNm(), simpleTargetDTO.getCustNm()); assertEquals(simpleSourceDTO.getCustNo(), simpleTargetDTO.getCustNo()); }
  • 6. 4. 다른 동일 이름 매핑 mvn clean install ( compile ) @Getter @Setter @NoArgsConstructor @AllArgsConstructor(staticName = "of") public class SimpleSourceDTO { private String custNo; private String custNm; } @Getter @Setter @NoArgsConstructor @AllArgsConstructor(staticName = "of") public class SimpleDifferentTargetDTO { private String custNumber; private String custNm; private String ages; } @Mapper(componentModel = "spring") public interface DiffrentMapStruct { @Mappings({ @Mapping(target="custNumber", source = "custNo") }) SimpleDifferentTargetDTO simpleToDifferent(SimpleSourceDTO simpleSourceDTO); } 매핑 @Autowired private DiffrentMapStruct diffrentMapStruct ; @Test void contextLoads() { SimpleSourceDTO simpleSourceDTO = SimpleSourceDTO.of("홍길동", "A0001"); SimpleDifferentTargetDTO simpleDifferentTargetDTO = diffrentMapStruct.simpleToDifferent(simpleSourceDTO); assertEquals(simpleSourceDTO.getCustNm(), simpleDifferentTargetDTO.getCustNm()); assertEquals(simpleSourceDTO.getCustNo(), simpleDifferentTargetDTO.getCustNumber()); } @Generated( value = "org.mapstruct.ap.MappingProcessor" ) @Component public class DiffrentMapStructImpl implements DiffrentMapStruct { @Override public SimpleDifferentTargetDTO simpleToDifferent(SimpleSourceDTO simpleSourceDTO) { if ( simpleSourceDTO == null ) { return null; } SimpleDifferentTargetDTO simpleDifferentTargetDTO = new SimpleDifferentTargetDTO(); simpleDifferentTargetDTO.setCustNumber( simpleSourceDTO.getCustNo() ); simpleDifferentTargetDTO.setCustNm( simpleSourceDTO.getCustNm() ); return simpleDifferentTargetDTO; } }
  • 7. 5. 여러 객체를 하나로 @Getter @Setter @NoArgsConstructor @AllArgsConstructor(staticName = "of") public class UserDTO { private String userNo; private String userNm; private String ages; } @Getter @Setter @NoArgsConstructor @AllArgsConstructor(staticName = "of") public class AddressDTO { private String userNo; private String postNo; private String address; } @Getter @Setter @NoArgsConstructor @AllArgsConstructor(staticName = "of") public class UserAddressDTO { private String userNo; private String userNm; private String nai; private String address; } @Mapper(componentModel = "spring") public interface Composer { @Mapping(target = "nai", source = "userDTO.ages") @Mapping(target = "userNo", source = "userDTO.userNo") UserAddressDTO toUserAddress(UserDTO userDTO, AddressDTO addressDTO); } @Generated( value = "org.mapstruct.ap.MappingProcessor" ) @Component public class ComposerImpl implements Composer { @Override public UserAddressDTO toUserAddress(UserDTO userDTO, AddressDTO addressDTO) { if ( userDTO == null && addressDTO == null ) { return null; } UserAddressDTO userAddressDTO = new UserAddressDTO(); if ( userDTO != null ) { userAddressDTO.setNai( userDTO.getAges() ); userAddressDTO.setUserNo( userDTO.getUserNo() ); userAddressDTO.setUserNm( userDTO.getUserNm() ); } if ( addressDTO != null ) { userAddressDTO.setAddress( addressDTO.getAddress() ); } return userAddressDTO; } } ** 같은 이름을 재외 한 다른 이름의 필드를 @Mapping을 사용해서 정의 source는 객체.필드를 사용 하여 정확히 표시 함 => 표시 하지 않으면 빌드 오류 발생
  • 8. 6. 리스트 객체 @Getter @Setter @NoArgsConstructor @AllArgsConstructor(staticName = "of") public class UserAddDTO { private String userNo; private String userNm; private String ages; private List<AddressDTO> addressDTOList; private List<MemberDTO> memberDTOList; } @Getter @Setter @NoArgsConstructor @AllArgsConstructor(staticName = "of") public class MemberDTO { private String userNo; private String memberNo; private String memberNm; private String ages; } @Getter @Setter @NoArgsConstructor @AllArgsConstructor(staticName = "of") public class AddressDTO { private String userNo; private String postNo; private String address; } @Getter @Setter @NoArgsConstructor @AllArgsConstructor(staticName = "of") public class TargetUserAddDTO { private String userNo; private String userNm; private String ages; private List<AddressDTO> addressDTOS; private List<MemberDTO> memberDTOList; } @Mapper(componentModel = "spring") public interface usertToTarget { @Mapping(target="addressDTOS", source = "addressDTOList") TargetUserAddDTO toDto(UserAddDTO userAddDTO); } @Generated( value = "org.mapstruct.ap.MappingProcessor") @Component public class usertToTargetImpl implements usertToTarget { @Override public TargetUserAddDTO toDto(UserAddDTO userAddDTO) { if ( userAddDTO == null ) { return null; } TargetUserAddDTO targetUserAddDTO = new TargetUserAddDTO(); List<AddressDTO> list = userAddDTO.getAddressDTOList(); if ( list != null ) { targetUserAddDTO.setAddressDTOS( new ArrayList<AddressDTO>( list ) ); } targetUserAddDTO.setUserNo( userAddDTO.getUserNo() ); targetUserAddDTO.setUserNm( userAddDTO.getUserNm() ); targetUserAddDTO.setAges( userAddDTO.getAges() ); List<MemberDTO> list1 = userAddDTO.getMemberDTOList(); if ( list1 != null ) { targetUserAddDTO.setMemberDTOList( new ArrayList<MemberDTO>( list1 ) ); } return targetUserAddDTO; } } 동일이름 자동 매핑 다른 이름
  • 9. 7. 자식 매핑 @Generated( value = "org.mapstruct.ap.MappingProcessor") @Component public class UserParentMapperImpl implements UserParentMapper { @Autowired private AddressChildMapper addressChildMapper; @Override public UserParentDTO toDto(UserParent userParent) { if ( userParent == null ) { return null; } UserParentDTO userParentDTO = new UserParentDTO(); userParentDTO.setAddressChildDTOList( addressChildListToAddressChildDTOList( userParent.getAddressChildList() ) ); userParentDTO.setUserNo( userParent.getUserNo() ); userParentDTO.setUserNm( userParent.getUserNm() ); return userParentDTO; } protected List<AddressChildDTO> addressChildListToAddressChildDTOList(List<AddressChild> list) { if ( list == null ) { return null; } List<AddressChildDTO> list1 = new ArrayList<AddressChildDTO>( list.size() ); for ( AddressChild addressChild : list ) { list1.add( addressChildMapper.toDto( addressChild ) ); } return list1; } } @Getter @Setter @NoArgsConstructor @AllArgsConstructor(staticName = "of") public class AddressChild { private String userNo; private String adderssNo; private String address; } public class UserParent { private String userNo; private String userNm; private List<AddressChild> addressChildList; } @Getter @Setter @NoArgsConstructor @AllArgsConstructor(staticName = "of") public class UserParentDTO { private String userNo; private String userNm; private List<AddressChildDTO> addressChildDTOList; } @Getter @Setter @NoArgsConstructor @AllArgsConstructor(staticName = "of") public class AddressChildDTO { private String userNo; private String adderssNo; private String address; } @Mapper(componentModel = "spring", uses = {AddressChildMapper.class}) public interface UserParentMapper { @Mapping(target = "addressChildDTOList", source = "userParent.addressChildList") UserParentDTO toDto(UserParent userParent); }
  • 10. 8. 기존 인스턴스 update @Generated( value = "org.mapstruct.ap.MappingProcessor") @Component public class UserParentMapperImpl implements UserParentMapper { @Autowired private AddressChildMapper addressChildMapper; @Override public void updateUserParentDto(UserParent userParent, UserParentDTO userParentDTO) { if ( userParent == null ) { return; } if ( userParentDTO.getAddressChildDTOList() != null ) { List<AddressChildDTO> list = addressChildListToAddressChildDTOList( userParent.getAddressChildList() ); if ( list != null ) { userParentDTO.getAddressChildDTOList().clear(); userParentDTO.getAddressChildDTOList().addAll( list ); } else { userParentDTO.setAddressChildDTOList( null ); } } else { List<AddressChildDTO> list = addressChildListToAddressChildDTOList( userParent.getAddressChildList() ); if ( list != null ) { userParentDTO.setAddressChildDTOList( list ); } } userParentDTO.setUserNo( userParent.getUserNo() ); userParentDTO.setUserNm( userParent.getUserNm() ); } @Getter @Setter @NoArgsConstructor @AllArgsConstructor(staticName = "of") public class AddressChild { private String userNo; private String adderssNo; private String address; } public class UserParent { private String userNo; private String userNm; private List<AddressChild> addressChildList; } @Getter @Setter @NoArgsConstructor @AllArgsConstructor(staticName = "of") public class UserParentDTO { private String userNo; private String userNm; private List<AddressChildDTO> addressChildDTOList; } @Getter @Setter @NoArgsConstructor @AllArgsConstructor(staticName = "of") public class AddressChildDTO { private String userNo; private String adderssNo; private String address; } @Mapper(componentModel = "spring", uses = {AddressChildMapper.class}) public interface UserParentMapper { @Mapping(target = "addressChildDTOList", source = "userParent.addressChildList") void updateUserParentDto(UserParent userParent, @MappingTarget UserParentDTO userParentDTO); }
  • 11. 9. 타입 매핑, 기본값, NULL, 표현식 @Mapper(componentModel = "string", // ERROR, IGNORE, WARN 정책 unmappedTargetPolicy = ReportingPolicy.ERROR, // Source가 null이거나 혹은 Source의 특정 필드가 null인 경우 nullValueMappingStrategy = NullValueMappingStrategy.RETURN_NULL, imports = {LocalDateTime.class, UUID.class}) public interface DataTypeMap { @Mapping(target="id", constant = "-1L") @Mapping(target="userId", expression = "java(UUID.randomUUID().toString())") @Mapping(target="userNm", source = "userNm", defaultValue = "이름") @Mapping(target="birthday", source = "birthday", dateFormat = "dd-MM-yyyy HH:mm:ss") @Mapping(target="pay", source = "pay", numberFormat = "$#.00") @Mapping(target="currentDate", source = "currentDate", defaultExpression = "java(LocalDateTime.now())") // 특정 필드는 매핑되지 않길 원한다면 @Mapping 어노테이션에 ignore = true 속성 @Mapping(target="desc", source = "desc", ignore = true) UserTypeDTO toDto(UserType userType); } @Getter @Setter @NoArgsConstructor @AllArgsConstructor(staticName = "of") public class UserType { private long id; private String userId; private String userNm; private Date birthday; private String pay; private LocalDateTime currentDate; private String desc; } @Getter @Setter @NoArgsConstructor @AllArgsConstructor(staticName = "of") public class UserTypeDTO { private long id; private String userId ; // defaultExpression private String userNm; private String birthday; // dateFormat private long pay; // numberFormat private LocalDateTime currentDate; private String desc; } @Generated( value = "org.mapstruct.ap.MappingProcessor" ) public class DataTypeMapImpl implements DataTypeMap { @Override public UserTypeDTO toDto(UserType userType) { if ( userType == null ) { return null; } UserTypeDTO userTypeDTO = new UserTypeDTO(); if ( userType.getUserNm() != null ) { userTypeDTO.setUserNm( userType.getUserNm() ); } else { userTypeDTO.setUserNm( "이름" ); } if ( userType.getBirthday() != null ) { userTypeDTO.setBirthday( new SimpleDateFormat( "dd-MM-yyyy HH:mm:ss" ).format( userType.getBirthday() ) ); } try { if ( userType.getPay() != null ) { userTypeDTO.setPay( new DecimalFormat( "$#.00" ).parse( userType.getPay() ).longValue() ); } } catch ( ParseException e ) { throw new RuntimeException( e ); } if ( userType.getCurrentDate() != null ) { userTypeDTO.setCurrentDate( userType.getCurrentDate() ); } else { userTypeDTO.setCurrentDate( LocalDateTime.now() ); } userTypeDTO.setId( -1L ); userTypeDTO.setUserId( UUID.randomUUID().toString() ); return userTypeDTO; } }
  • 12. 10. 매핑 전. 후 처리 및 Collection Mapping @Mapper(uses = {PatientMapper.class}, componentModel = "spring") public abstract class DoctorCustomMapper { @BeforeMapping protected void validate(Doctor doctor) { if(doctor.getPatientList() == null){ doctor.setPatientList(new ArrayList<>()); } } @AfterMapping protected void updateResult(@MappingTarget DoctorDto doctorDto) { doctorDto.setName(doctorDto.getName().toUpperCase()); doctorDto.setDegree(doctorDto.getDegree().toUpperCase()); doctorDto.setSpecialization(doctorDto.getSpecialization().toUpperCase()); } @Mapping(source = "doctor.patientList", target = "patientDtoList") @Mapping(source = "doctor.specialty", target = "specialization") public abstract DoctorDto toDoctorDto(Doctor doctor); } https://www.baeldung.com/java-mapstruct-mapping-collections @Mapper public interface EmployeeMapper { List<EmployeeDTO> map(List<Employee> employees); } @Mapper public interface EmployeeMapper { Set<EmployeeDTO> map(Set<Employee> employees); }
  • 13. 11. 정책 정책 값 설명 unmappedSourcePolicy IGNORE(default), WARN, ERROR Source의 필드가 Target에 매핑되지 않을 때 정책이다. 예, ERROR로 설정하면 매핑 시 Source.aField가 사용되지 않는다면 컴파일 오류가 발생시킨다. unmappedTargetPolicy IGNORE, WARN(default), ERROR Target의 필드가 매핑되지 않을 때 정책이다. 예, ERROR로 설정하면 매핑 시 Target.aField에 값이 매핑되지 않는다면 컴파일 오류가 발생시킨다. typeConversionPolicy IGNORE(default), WARN, ERROR 타입 변환 시 유실이 발생할 수 있을 때 정책이다. 예, ERROR로 설정하면 long에서 int로 값을 넘길 때 값에 유실이 발생할 수 있다. 이런 경우에 컴파일 오류를 발생 시킨다. 전략 값 설명 nullValueMappingStrategy RETURN_NULL(default), RETURN_DEFAULT Source가 null일 때 정책이다. nullValuePropertyMappingStrategy SET_TO_NULL(default), SET_TO_DEFAULT, IGNORE Source의 필드가 null일 때 정책이다.