Model Mapper

youngkyu MIn·2024년 1월 5일

Model Mapper

Model Mapper는 객체 간의 데이터를 매핑하기 위해 사용되는 도구다. 이는 주로 DTO(Data Transfer Object)와 Entity 객체 간의 데이터를 변환할 때 유용하다. Model Mapper는 반복적인 매핑 코드를 줄여주고, 객체 간의 매핑을 더 깔끔하고 효율적으로 만들어 준다.

의존성 추가

dependencies {

    implementation 'org.modelmapper:modelmapper:버전'
    
}

SpringBoot Bean

@Configuration
public class ModelMapperConfig {

    @Bean
    public ModelMapper modelMapper() {
        return new ModelMapper();
    }
}

Model Mapper 인스턴스


@Autowired
private ModelMapper modelMapper;

public EntityClass convertToEntity(DTOClass dto) {
    return modelMapper.map(dto, EntityClass.class);
}

public DTOClass convertToDTO(EntityClass entity) {
    return modelMapper.map(entity, DTOClass.class);
}

필드 이름 일치

Model Mapper는 기본적으로 이름이 같은 필드끼리 매핑한다. 따라서 DTO와 Entity 간의 필드 이름이 일치해야 한다.

복잡한 매핑

복잡한 매핑 룰이 필요한 경우, Model Mapper는 맞춤 설정을 제공한다. 예를 들어, 특정 필드만 매핑하거나, 특정 방식으로 매핑하는 등의 설정이 가능하다.


기본 생성자

ModelMapper를 사용할 때 Entity 클래스와 DTO 클래스에 기본 생성자(인자가 없는 생성자)가 필요하다. 이는 ModelMapper가 객체를 매핑할 때 객체의 인스턴스를 만들기 위해 기본 생성자를 사용하기 때문이다.

인스턴스 생성: ModelMapper는 먼저 대상 클래스의 인스턴스를 생성한 다음, 소스 객체의 필드 값을 해당 인스턴스의 필드로 복사한다. 이 과정에서 기본 생성자를 사용하여 대상 클래스의 인스턴스를 생성한다.

리플렉션: Java의 리플렉션 API를 통해 클래스의 인스턴스를 생성할 때 기본적으로 기본 생성자를 사용한다. ModelMapper도 이 메커니즘을 활용한다.


DTO class 의 필드 > Entity class 의 필드 ?

의문이 생겼다... 예를들어

public DTOClass convertToDTO(EntityClass entity) {
    return modelMapper.map(entity, DTOClass.class);
}

entity 를 DTO class 로 매핑하고자 한다.

앞서 말했듯이 modelMapper 는 필드의 이름을 기준으로 매핑을 해준다.

그렇다면 DTO class 의 필드가 entity class 의 필드보다 많다면?

예시다.

public class User {
    private Long id;
    private String name;
    private String email;
    
    ...
}

public class Address {
    private Long id;
    private Long userId;
    private String city;
    private String street;
    
    ...
}


public class UserDetailsDTO {
    private String name;
    private String email;
    private String city;
    private String street;
    
    ...
    
}
@Autowired
private ModelMapper modelMapper;

public UserDetailsDTO toUserDetailsDTO(User user, Address address) {
    UserDetailsDTO userDetailsDTO = modelMapper.map(user, UserDetailsDTO.class);
    modelMapper.map(address, userDetailsDTO); // UserDetailsDTO에 Address 정보를 추가로 매핑

    return userDetailsDTO;
}
model.Mapper.map(user, UserDetailsDto.class); 

까지는 UserDetailsDto 필드의 city 와 street 은 null 이다. ( 혹은 기본 값을 가질 것이다.)


위 처럼 두가지 entity 를 조합하는 DTO class 의 생성에도 modelMapper 를 활용할 수 있다.

profile
한 줄 소개

0개의 댓글