자바 개발을 하다 보면 데이터 모델 간 변환을 흔히 겪는다. 특히 서비스 계층에서는 다양한 객체들 사이의 변환 작업이 필수적인데, 이러한 작업을 간편하게 해주는 도구 중 하나인 ModelMapper
에 대해 기록하고자 한다
자바 객체 간의 자동 매핑을 지원하는 라이브러리로, 복잡한 변환 로직 없이 소스 객체의 필드 값을 대상 객체의 필드에 자동으로 복사해준다.
최신 버전 조회: mvnrepository.com
dependency (maven 기준)
<dependency>
<groupId>org.modelmapper</groupId>
<artifactId>modelmapper</artifactId>
<version>3.2.0</version>
</dependency>
ModelMapper의 사용을 위해서는 매칭 전략
을 설정해서 선언해야 한다
매칭 전략의 종류
매칭 전략 | 설명 |
---|---|
STANDARD | 소스 객체의 필드 이름과 대상 객체의 필드 이름이 완전히 일치할 필요는 없으며, 부분적으로 일치하는 경우에도 매핑을 시도. 이 전략은 이름의 유사성을 기반으로 매핑을 수행 |
STRICT | 엄격한 매칭 전략으로, 소스 객체와 대상 객체 간에 필드 이름이 정확히 일치해야 매핑 수행 |
LOOSE | 매핑을 수행할 수 있는 구조적 유사성이 있을 경우 매핑을 시도. ex) 소스 객체의 필드 이름이 userName이고 대상 객체의 필드 이름이 user_name인 경우에도 매핑 |
private final ModelMapper modelMapper;
public UserServiceImpl(UserRepository userRepository, JwtUtil jwtUtil, PasswordEncoder passwordEncoder) {
// ...
this.modelMapper = new ModelMapper(); // 선언
this.modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); // STRICT 매칭 전략 설정
}
@Override
@Transactional
public UserLoginRes userLogin(UserLoginInput loginInfo) {
User user = userRepository.findByUsername(loginInfo.getUserName());
if (user == null) {
return new UserLoginRes(ResponseCode.NOT_FOUND.getCode(), ResponseCode.NOT_FOUND.getMessage("사용자"), null);
}
if (!passwordEncoder.matches(loginInfo.getPassword(), user.getPassword())) {
return new UserLoginRes(
ResponseCode.BAD_REQUEST.getCode(),
ResponseCode.BAD_REQUEST.getMessage("유효하지 않은 비밀번호입니다"), null);
}
// ModelMapper의 사용
UserLogin userLogin = modelMapper.map(user, UserLogin.class);
userLogin.setAccessToken(jwtUtil.generateAccessToken(user.getUsername(), user.getRole()));
userLogin.setRefreshToken(jwtUtil.generateRefreshToken(user.getUsername()));
return new UserLoginRes(ResponseCode.RETRIEVED.getCode(),
ResponseCode.RETRIEVED.getMessage("로그인 정보"),
userLogin);
}
저도 한번 써보고 싶네요!