ModelMapper란?
ModelMapper은 서로 다른 두 오브젝트의 필드들을 매핑시켜주는 클래스로 도메인 오브젝트를 통신용 DTO 오브젝트로 만들어 줄 때 유용하게 사용된다.
source 오브젝트의 필드값들 중 원하는 필드들을 destination 오브젝트에 매핑해주는 과정을 자동으로 수행해주기 때문에, 매핑 코드를 일일이 getter/setter 메소드에 작성하는 귀찮은 작업을 할 필요가 사라진다. ModelMapper은 기본 매핑 정책을 가지고 있기 때문에 map() 메소드를 통해 간단히 매핑을 수행해도 되고, 여러분들이 원한다면 정책을 바꾸거나 커스터마이징을 할 수도 있다.
예를 들어, 아래 예시를 보자. Order 클래스는 Customer, Address 타입의 필드를 가지고 있다.
// Assume getters and setters on each class
class Order {
Customer customer;
Address billingAddress;
}
class Customer {
Name name;
}
class Name {
String firstName;
String lastName;
}
class Address {
String street;
String city;
}
그리고 Order 오브젝트의 필드값들을 매핑시켜줄 OrderDTO 클래스다.
// Assume getters and setters
class OrderDTO {
String customerFirstName;
String customerLastName;
String billingStreet;
String billingCity;
}
ModelMapper의 map() 메소드를 통해 ModelMapper의 특정 매핑 정책대로 필드값들을 매핑시켜줄 수 있다.
ModelMapper은 Bean으로 등록해서 사용해도 된다.
ModelMapper modelMapper = new ModelMapper();
OrderDTO orderDTO = modelMapper.map(order, OrderDTO.class);
[테스트 코드]
assertEquals(order.getCustomer().getName().getFirstName(), orderDTO.getCustomerFirstName());
assertEquals(order.getCustomer().getName().getLastName(), orderDTO.getCustomerLastName());
assertEquals(order.getBillingAddress().getStreet(), orderDTO.getBillingStreet());
assertEquals(order.getBillingAddress().getCity(), orderDTO.getBillingCity());
여기서 필자는 궁금했다. 두 필드의 이름이 다른데 어떻게 성공적으로 매핑이 가능할까?
기본 매핑 정책인 MatchingStrategies.STANDARD은 필드 이름을 쪼갠 토큰들을 어떤 순서로든 매칭시킬 수 있기 때문이다. OrderDTO의 billingStreet 필드는 필드 이름이 billing, street으로 쪼개져서 토큰이 되기 때문에 Order의 street 필드와 매핑이 될 수 있는 것이다.
각 정책의 구체적인 정보와 상세 설정은 아래에 첨부한 포스팅들에서 잘 설명되어 있기 때문에 ModelMapper의 설명은 이쯤에서 마치겠다.
ModelMapper 학습에 도움이 되는 자료
- 공식 문서
https://javadoc.io/doc/org.modelmapper/modelmapper/2.3.0/org/modelmapper/ModelMapper.html
- 아래 포스팅에서는 ModelMapper의 각종 매칭 전략과 토큰에 대해 깊이 이해할 수 있었음
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=kbh3983&logNo=220988245343
- 아래 포스팅에서는 ModelMapper의 폭넓은 사용 예시를 통해 전반적인 개념을 이해하는 데 도움이 되었음
https://devwithpug.github.io/java/java-modelmapper/
'Spring Series > Spring Framework' 카테고리의 다른 글
[Spring] MockMvc 테스트 (0) | 2022.12.20 |
---|---|
[Spring] @Enable 어노테이션을 이용한 설정 모듈화 (0) | 2022.10.28 |
[Spring] 캐시 추상화 (0) | 2022.10.27 |
[Spring] Spring의 Task와 Scheduling (0) | 2022.10.25 |
[Spring] 리모팅과 EJB (0) | 2022.10.25 |
댓글