흔히 Java Instace 간 필드를 주입할 때에는 Setter 를 사용합니다.

 

Member member = new Member();
member.setName("이름");

Member newMember = new Member();
// member 의 name 필드를 newMember 에 set
newMember.setName(member.getName());

그러나 시스템이 거대해지고 DTO, Entity 들이 많아지면서 우리는 이런 방법으로 일일이 매핑해주는 것이 어려워졌습니다.

그럴 시간에 치킨 한마리를 더 사먹는 것이 이득입니다.

 

이런 불편 사항을 해결해주고자 자바 진영에도 많은 유틸 라이브러리가 나와 있습니다.

오늘은 이 라이브러리에 대해 간단히 알아보려고 합니다.


  • ObjectMapper
  • BeanUtils
  • ModelMapper (별도 의존성 주입 필요)

ObjectMapper  

ObjectMapper는 자바 객체의 Field 값과 Json 의 Property 사이 값을 Mapping 시켜줄 때 사용할 수 있는 라이브러리이다.

RESTful API 는 반환 타입을 Json 으로 return 하는 경우가 많다.

이럴 때 ObjectMapper 를 사용해서 자바 객체를 Json으로 변환 후 반환할 수 있다.

스프링에서 많이 사용하는 @RequestBody, @ResponseBody 어노테이션은 Java 와 Json 간에 변환을 해주는데 이 때 사용되는 라이브러리가 바로 ObjectMapper이다.

 

 

BeanUtils

서로 다른 두 Java 객체 사이에 필드값을 복사하기 위해서 사용할 수 있는 라이브러리다.

예를 들어 다음과 같이 복사할 수 있다.

Member member = new Member();
member.setName("이름");

Member newMember = new Member();
// member 의 필드가 newMember 로 복사된다.
BeanUtils.copyProperties(member , newMember);

복사해야할 필드가 많으면 많을 수록 이는 효율적인 코드가 된다.

그러나 한가지 아쉬운 점은 이는 getter, setter 를 기반으로 필드를 복사한다는 점이다.

보통 Entity에는 무결성을 위해서 setter 메소드를 만들지 않는데

이 말은 즉슨 Entity 에서 DTO 로 값을 복사할 때는 문제가 되지 않지만 반대의 경우에는 문제가 됨을 의미한다.

 

 

ModelMapper

ModelMapper 또한 BeanUtil 처럼 Java 객체 사이에 필드 값을 복사하기 위해서 사용한다.
기본적으로는 getter, setter 기반으로 필드를 주입해주나, 설정을 바꾸면 Reflection 기반으로 필드를 주입해준다.
즉 getter, setter 없이도 값이 필드만 정의되어 있으면 값을 복사해준다는 말이다.
해당 설정은 다음과 같다.

ModelMapper modelMapper = new ModelMapper();
modelMapper.getConfiguration().setFieldAccessLevel(Configuration.AccessLevel.PRIVATE).setFieldMatchingEnabled(true).setMatchingStrategy(MatchingStrategies.LOOSE);