본문 바로가기
IT/Spring

ModelMapper

by sgoho01 2021. 6. 21.

ModelMapper

서로 다른 객체로의 필드값을 자동으로 맵핑해주는 라이브러리

로직 실행 후 Entity를 가져온 후 Entity의 모든 데이터를 리턴해주기 보다 필요한 데이터들만 리턴해주기 위해 View Dto를 만들어 리턴을 해준다.

이때, 기존 Entity에서 새로 만든 Dto 객체에게 필드값을 전달하기 위해서 getter/setter를 이용하거나 builder 패턴을 이용하여 Dto 객체를 만들어서 전달할 수 있는데, 필드가 많아지는 경우에는 코드량도 많아지고 반복적인 작업량도 늘어나게 된다.

이때 ModelMapper를 이용하면 간단하게 Dto 객체를 만들어 전달 할 수 있다.

 

 

사용

ModelMapper를 사용하기 위해 의존성을 주입받는다.

<dependency>
    <groupId>org.modelmapper</groupId>
    <artifactId>modelmapper</artifactId>
    <version>2.3.8</version>
</dependency>

 

사용할 때 마다 객체생성하여 사용해도 무방하지만, 전역으로 사용될 수 있으므로 Bean으로 등록하여 사용한다.

@Configuration
public class AppConfig{

    @Bean
    public ModelMapper modelMapper() {
        ModelMapper modelMapper = new ModelMapper();
        modelMapper.getConfiguration()
            .setMatchingStrategy(MatchingStrategies.STRICT)
            .setSkipNullEnabled(true)
            .setFieldMatchingEnabled(true)
            .setFieldAccessLevel(org.modelmapper.config.Configuration.AccessLevel.PRIVATE)
            ;
        return modelMapper;
    }
}

setMatchingStrategy : MatchingStrategies.STRICT를 사용하게 되면

기존 객체와 대상 객체의 필드명과 타입이 일치해야 맵핑을 시켜주도록 설정할 수 있습니다.

setSkipNullEnabled : null인 필드는 스킵

setFieldMatchingEnabled, setFieldAccessLevel : private 인 필드도 맵핑

 

 

public class UserEntity {
    private int id;
    private String name;
    private String addr;
    private String gender;
    private int age;
}

...

public class UserDto {
    private String name;
    private String addr;
}

...

-> 기존
UserDto userDto = new UserDto();
userDto.setName(userEntity.getName());
userDto.setAddr(userEntity.getAddr());

-> modelmapper 사용
UserDto userDto = modelmapper.map(userEntity, UserDto.class);

getter/setter , builder 패턴을 이용하여 객체를 맵핑할 때에는

필드수가 많아지면 코드량도 많아지게 되지만

modelmapper를 이용한다면 간단하게 객체간 맵핑을 할 수 있다.

'IT > Spring' 카테고리의 다른 글

Spring Security (Springboot + thymeleaf)  (0) 2020.05.22
Spring AOP - 어노테이션 만들기  (0) 2019.11.28
설정파일 YAML  (0) 2019.04.30
메이븐 (Maven)  (0) 2019.04.30
에러 처리 (ControllerAdvice)  (0) 2019.04.29

댓글