https://mvnrepository.com/artifact/org.modelmapper/modelmapper
ModelMapper란?
ModelMapper는 객체 간 매핑(객체 변환)을 간편하게 처리할 수 있는 Java 라이브러리입니다. 주로 DTO(Data Transfer Object)와 Entity 간의 변환에 사용되며, 이를 통해 코드를 간결하고 효율적으로 작성할 수 있습니다.
왜 ModelMapper가 필요한가?
- DTO와 Entity의 변환은 반복적이고 귀찮은 작업이 될 수 있습니다.
- 수동 변환 시 코드가 복잡하고 가독성이 떨어질 수 있습니다.
ModelMapper의 특징
- 자동 매핑
- 객체의 필드명이 동일하면 자동으로 매핑해줍니다.
- 예: DTO의 name 필드 → Entity의 name 필드
- 유연한 커스터마이징
- 필드명이 다르거나 복잡한 규칙이 필요한 경우 커스터마이징이 가능합니다.
- 매핑 조건, 규칙을 코드로 정의할 수 있습니다.
- 컬렉션 및 중첩 객체 매핑
- List와 같은 컬렉션 타입이나 중첩된 객체도 매핑할 수 있습니다.
- 예: List<UserDTO> → List<User> 자동 변환 가능
- 단방향 및 양방향 매핑
- DTO → Entity 또는 Entity → DTO 양방향 매핑을 지원합니다.
- 타입 세이프티(Type Safety)
- map() 메소드가 제네릭을 지원하므로 타입 안정성을 보장합니다.
ModelMapper의 주요 사용법
의존성 추가
implementation 'org.modelmapper:modelmapper:3.2.0'
1. 기본 설정
ModelMapper를 스프링 빈으로 등록합니다.
import org.modelmapper.ModelMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean
public ModelMapper modelMapper() {
return new ModelMapper();
}
}
2. DTO ↔ Entity 매핑
DTO와 Entity 사이에 필드명이 동일한 경우 자동 매핑이 작동합니다.
User Entity
@Entity
public class User {
private Long id;
private String name;
private String email;
// Getters and Setters
}
UserDTO
public class UserDTO {
private String name;
private String email;
// Getters and Setters
}
Service 클래스에서 변환
import org.modelmapper.ModelMapper;
@Service
public class UserService {
private final ModelMapper modelMapper;
public UserService(ModelMapper modelMapper) {
this.modelMapper = modelMapper;
}
public UserDTO convertToDTO(User user) {
return modelMapper.map(user, UserDTO.class);
}
public User convertToEntity(UserDTO userDTO) {
return modelMapper.map(userDTO, User.class);
}
}
3. 필드명이 다를 경우 매핑 (커스터마이징)
필드명이 다를 경우 명시적으로 매핑 규칙을 설정합니다.
User Entity
public class User {
private String fullName;
private String email;
// Getters and Setters
}
UserDTO
public class UserDTO {
private String name; // Entity의 fullName 필드에 매핑
private String email;
// Getters and Setters
}
커스터마이징 매핑 규칙 설정
public UserDTO convertToDTO(User user) {
ModelMapper modelMapper = new ModelMapper();
modelMapper.typeMap(User.class, UserDTO.class)
.addMapping(User::getFullName, UserDTO::setName);
return modelMapper.map(user, UserDTO.class);
}
4. 컬렉션 및 중첩 객체 매핑
List 매핑 예제
List<User> users = userRepository.findAll();
List<UserDTO> userDTOs = users.stream()
.map(user -> modelMapper.map(user, UserDTO.class))
.collect(Collectors.toList());
중첩 객체 매핑 예제
public class Address {
private String city;
private String street;
}
public class User {
private String name;
private Address address;
}
public class UserDTO {
private String name;
private String city; // Address의 city 필드에 매핑
}
ModelMapper modelMapper = new ModelMapper();
modelMapper.typeMap(User.class, UserDTO.class)
.addMappings(mapper -> mapper.map(src -> src.getAddress().getCity(), UserDTO::setCity));
5. 양방향 매핑
DTO → Entity와 Entity → DTO를 양방향으로 변환하는 경우 ModelMapper를 반복적으로 사용할 수 있습니다.
User user = new User();
user.setName("홍길동");
UserDTO userDTO = modelMapper.map(user, UserDTO.class);
User mappedUser = modelMapper.map(userDTO, User.class);
ModelMapper와 MapStruct 비교
ModelMapper와 MapStruct는 객체 매핑에 자주 사용되는 라이브러리입니다.
비교 항목 | ModelMapper | MapStruct |
매핑 방식 | 런타임에 리플렉션 사용 | 컴파일 타임에 코드를 생성 |
성능 | 상대적으로 느림 | 상대적으로 빠름 |
커스터마이징 | 유연하고 쉽지만 약간 복잡함 | 명시적 코드 작성이 필요함 |
설정 필요 여부 | 기본 설정으로 자동 매핑 가능 | 명시적 설정이 필요함 |
학습 곡선 | 상대적으로 낮음 | 상대적으로 높음 |
ModelMapper 활용 팁
- 소규모 프로젝트나 DTO 변환이 단순한 경우 ModelMapper를 사용하면 빠르게 매핑을 구현할 수 있습니다.
- 성능이 중요한 경우나 대규모 프로젝트에서는 MapStruct가 더 적합할 수 있습니다.
- 복잡한 변환 규칙이 필요한 경우 TypeMap을 사용하여 매핑 규칙을 세부적으로 설정하세요.
'Spring' 카테고리의 다른 글
Spring Data JPA - JPA Query Methods (1) | 2025.01.16 |
---|---|
Spring MVC 아키텍처 계층 구조 + Entity와 DTO를 변환하는 이유 (0) | 2025.01.16 |
Spring Data JPA 개요 (0) | 2025.01.15 |
JPA - JPQL (Java Persistence Query Language) (0) | 2025.01.15 |
JPA - 연관관계 매핑 (0) | 2025.01.15 |