Spring-JSP

[Spring-JSP] ModelMapper란? 사용법

Jeong Jeon
반응형

Java를 쓰면서 여러가지 상황에서 많이 쓸 수 있는 라이브러리인것 같아 정리 해 놓으려고 한다.

 

ModelMapper란?

어떤 Object에 있는 필드값들을 자동으로 원하는 Object로 Mapping시켜준다.

쉽게 말해, 보통 우리는 getter()/setter()를 통해 원하는 input과 output이 다를때 output Object에 input필드값들중 원하는 필드들을 하나씩 넣어주는 과정을 한번씩은 꼭 겪었을것이다. 하지만 20개중 17개만 옮겨서 깔끔하게 사용하고 싶을때, 우리는 일일이 getter/setter를 작성 해야한다.

이러한 작업들이 사실상 굉장히 귀찮고, 시간도 소요되며, 필드값을 놓칠 가능성도 있다.

 

이런 단점들을 한방에 사라지게 하는 라이브러리가 ModelMapper이다.!!!! 귀차니즘을 종식시킨다.!

 

1). pom.xml

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

디펜던시를 추가해준다.

 

2). CustomModelMapper

@Configuration
public class CustomModelMapper{

    private final ModelMapper modelMapper = new ModelMapper();

    @Bean
    public ModelMapper strictMapper() {
        // 매핑 전략 설정
        modelMapper.getConfiguration()
                .setMatchingStrategy(MatchingStrategies.STRICT);
        return modelMapper;
    }

    @Bean
    public ModelMapper standardMapper() {
    	// 매핑 전략 설정
    	modelMapper.getConfiguration()
    			.setMatchingStrategy(MatchingStrategies.STANDARD);
    	return modelMapper;
    }

    @Bean
    public ModelMapper looseMapper() {
    	// 매핑 전략 설정
    	modelMapper.getConfiguration()
    			.setMatchingStrategy(MatchingStrategies.LOOSE);
    	return modelMapper;
    }

}

컨테이너가 구동할때 Model 인스턴스를 하나 생성할 수 있도록 해주고, Bean으로 등록해 주었다.

추가적으로 원하는 mapper 설정에 따라 메소드를 만들어 사용할 수 있도록 설정할 수 있다.

본인은 전략기준으로 메소드들을 만들어 놓았다.

 

위의 코드는 전체 source에서 destination으로 옮길 수 있는것들을 옮기는 방식이었다면, 원하는 필드만 매핑 시키는 방법이 있다.

 

우선 원하는 매핑설정을 해준다.

@Bean
public ModelMapper testMapper() {
	modelMapper.getConfiguration()
				.setMatchingStrategy(MatchingStrategies.STRICT);
	modelMapper.createTypeMap(Test.class, TestDTO.class)
				.addMapping(Test::getName, TestDTO::setName);
	return modelMapper;
}

test객체를 Vo로 보자. 그럼 Test에서 name만 mapping하여 TestDTO 객체를 생성하는 코드이다.

TestDTO testDTO = testMapper.map(test, TestDTO.class);

 

 

3). 사용처

//DI
@Autowired
CustomModelMapper customModelMapper;
    
//사용부분
ArrayList<AfterVo> afterVoList = new ArrayList<AfterVo>();
ModelMapper modelMapper = customModelMapper.strictMapper();
for(BeforeVo v : BeforeVoList) {
	afterVoList.add(modelMapper.map(v, BeforeVo.class));
}

만들어둔 model을 가져와서 사용만하면된다.

 

예를들어, BeforeVo에는 id, name, address, phone 4가지 필드를 가질수 있게 되어있고, AfterVo에는 id,name 2가지만 가지고 있다고 보자.

 

이때 BeforeVo의 id, name만 AfterVo에 맞게 매핑시킨다.

 

전략종류

매핑 전략에는 세가지종류가 있다.

MatchingStrategies.STANDARD 지능적으로 매핑 해준다.
MatchingStrategies.STRICT 정확히 일치하는 필드만 매핑 해준다
MatchingStrategies.LOOSE 느슨하게 매핑 해준다

Standard

source 속성을 destination 속성과 지능적으로 일치시킬 수 있으므로, 모든 destination 속성이 일치하고 모든 source 속성 이름에 토큰이 하나 이상 일치해야함

  • 토큰을 어떤 순서로도 일치시킬 수 있다
  • 모든 destination 속성들이 매치 되어야 한다.
  • 모든 source 속성은 최소 하나 이상의 이름이 매치가 되어야 한다.

Strict

source의 속성과 destination 속성의 이름이 정확히 일치 할때만 매핑 해준다.

정확하게 필드명과 형식이 일치 할때만 매핑 되기 바랄때 사용하면 좋겠다.

 

Loose

계층 구조의 마지막 destination 속성만 일치하도록하여 source 속성을 destination 속성에 일치시킬 수 있다

  • 토큰을 어떤 순서로도 일치시킬 수 있다
  • 마지막 detination 속성 이름은 모든 토큰이 일치해야 한다.
  • 마지막 source 속성 이름에는 일치하는 토큰이 하나 이상 있어야 한다.

 

Tokenizer 설정

source의 필드명과 destination의 필드명이 다를 경우사용 => source : carmel-case / destination : under_score

modelMapper.getConfiguration()
           .setSourceNameTokenizer(NameTokenizers.CAMEL_CASE)
           .setDestinationNameTokenizer(NameTokenizers.UNDERSCORE);

 

매핑 설정

model에 필드명이 다르고, 원하는 source의 필드 => destination 필드  로 매핑 시키고싶을때 사용할 수 있다.

아래 코드는 예를 들어, Test 에서 name과 id 필드를 TestDTO에서 userName과 accountId로 매핑 하고 싶을때 사용한 경우로 보면 된다.

modelMapper.createTypeMap(Test.class, TestDTO.class)
			.addMapping(Test::getName, TestDTO::setUserName)
            .addMapping(Test::getId, TestDTO::setAccountId)
            

 

특정필드 SKIP

TypeMap으로 설정할 수 있다.

typeMap.addMappings(mapping -> {
  mapping.skip(TestDTO::setId); //Destination ::setField
});

 

Null 필드 SKIP

setSkipNullEnabled라는 메소드로 쉽게 Null 필드는 생략할 수 있다.

modelMapper.getConfiguration().setSkipNullEnabled(true);

 

Java는 진짜 어마어마하게 무서운 언어인것 같다...!

 

오늘도 화이팅!

반응형