ObjectMapping 라이브러리 비교

2024. 1. 24. 11:44Web/JAVA

JSON to DTO, Entity to DTO 으로 각 객체가 Mapping이 필요할 때가 많습니다.

필드가 적을 경우에는 직접 생성자를 통해서 해줄수 도 있겠지만 필드가 많을경우 굉장히 번거로운 작업이 될 경우가 많습니다.

 

그래서 보통 ObjectMapping 라이브러리를 사용하는데, 

각 ObjectMapping 라이브러리를 비교해보고, 적합한 상황에 맞춰 사용하는것이 좋을거 같아 글을 적습니다.

 

1. ObjectMapper

첫번째로 가장 흔하고 자주 사용하는  ObjectMapper입니다.

ObjectMapper는 Jackson 라이브러리의 일부로 제공되며, 주로 JSON-Object 변환을 수행하는 데 사용합니다.
spring-boot-starter-web 에 포함되어있기 때문에, 일반적인 spring web application 프로젝트에서는 따로 라이브러리를 추가할 필요가 없습니다.

 

Target 객체에 Getter 만 있어도 정상적으로 값을 Mapping 할 수 있습니다.

https://jenkov.com/tutorials/java-json/jackson-objectmapper.html#how-jackson-objectmapper-matches-json-fields-to-java-fields

 

Jackson ObjectMapper

The <em>Jackson ObjectMapper</em> can read JSON into Java objects and write Java objects to JSON. This Jackson ObjectMapper tutorial explains how to use the Jackson ObjectMapper class.

jenkov.com

 

2. ModelMapper

ModelMapper는 객체 간의 Mapping을 수행하는데 사용되는 라이브러리로, 필드 이름이 동일하면 자동으로 Mapping을 수행합니다.

기본 생성자를 필요로 하기 때문의 Lombok의 @NoArgsContructor을 객체에 선언하여 사용하여야 합니다.

 

@Setter가 없을 경우 오류가 발생하지는 않지만, 기본 생성자인 초기화 된 객체를 반환합니다.

 

3. MapStruct

MapStruct는 코드 생성 기반 Mapping 라이브러리로, 인터페이스에 Mapping 규격을 정의하고, @Mapping 어노테이션을 

사용하여 복잡한 필드 간의 Mapping 규칙을 정의할 수 있습니다.

 

MapStruct는 컴파일 시점에 최적화된 Implement 된 클래스를 생성하게되어, 해당 클래스를 살펴보면 생성자로 사용되는 어노테이션에 따라 Mapping 구현이 달라집니다.

 

때문에, MapStruct는 위 라이브러리와 다르게 @Setter가 존재하지 않더라고, Builder나 AllArgsContructor 를 사용해 매핑을 합니다.

 

정리

  기본 생성자만 있을경우 Setter만 존재 Builder 만 존재
ObjectMapper Error Success Error
ModelMapper Success(기본 객체 반환) Success Error
MapStruct Success(기본 객체 반환) Success Success

기본적으로 필드 set 만 가능하다면 동작합니다.(@Setter 혹은 pulic field)

  • ObjectMapper : 기본 제공이므로 단순 JSON 데이터 처리에 유용
  • ModelMapper : 간단한 객체 간의 매핑
  • MapStruct : 개별 mapper 생성해주는게 귀찮으나 복잡한 매핑도 가능

초기 개발할 때는 Setter을 무분별하게 사용하는 실수를 저질렀지만,

최근에는 개발할 때 최대한 Setter은 지양하고, 생성자나 Builder를 주로 사용하기 때문에 MapStruct를 사용했습니다.

MapStruct 사용방법은 추후 작성하도록 하겠습니다.