Object Mapping 에 활용되는 라이브러리에 대해 알아보자.
Spring 프레임워크로 개발할 때, DB 와 연동해서 데이터를 가져와서 Controller 의 API 결과로 내보내기 위해서는 Entity 와 DTO 간 Object Mapping 이 이뤄져야 한다.
메소드를 활용해서 Entity <-> DTO 간 변환 메소드를 작성할 경우 대체로 코드의 가독성이 떨어지고 유지보수 하기 어려운 코드들이 생성된다. (DTO, Entity 에 필드가 추가되는 경우에 변경 사항을 모두 반영해야 되는 번거로움이 생긴다)
메소드를 일일이 작성하는 것보다는 Object Mapping 시 오픈소스 라이브러리를 활용하는 것이 유지보수 면에서 도움이 된다.
크게 Object Mapping 에 사용되는 라이브러리는 2가지가 있다.
- ModelMapper
- MapStruct
성능 면에서는 MapStruct 가 ModelMapper 와 비교하여 월등히 빠른 편이다.
이에 대한 이유로는 MapStruct 는 컴파일 타임에 Object 간 Mapping 되는 코드가 만들어져서 ModelMapper와 달리 런타임 시 reflection 과정을 거치지 않기 때문이다.
아래 링크에서 mapping framework 간 퍼포먼스를 설명하는 내용이 포함되어 있다.
https://www.baeldung.com/java-performance-mapping-frameworks
Performance of Java Mapping Frameworks | Baeldung
MapStruct comes out on top, followed by JMapper as a close second. The other libraries follow far behind: Orika, ModelMapper, and Dozer.
www.baeldung.com
다만, MapStruct 경우에는 lombok 과 함께 사용할 경우 유의해야 한다.
build.gradle 에서 mapstruct, lombok 순서를 잘못 설정할 경우 build 과정에서 cannot find symbol 에러가 발생한다.
(대체로 구글링을 했을 때, maven 에 대한 정보들은 많이 나오나 gradle 에 대한 정보는 많이 없는 거 같아서 아래와 같이 기재합니다)
gradle.properties
mapstruct.version=1.5.2.Final
lombok.version=1.18.22
lombok.mapstruct.binding.version=0.2.0
build.gradle
- mapstruct 뒤에 lombok 이 있어야 에러가 발생하지 않습니다
...
dependencies {
...
implementation "org.mapstruct:mapstruct:${project. 'mapstruct.version'}", "org.projectlombok:lombok:${project. 'lombok.version'}"
annotationProcessor "org.mapstruct:mapstruct-processor:${project. 'mapstruct.version'}", "org.projectlombok:lombok:${project. 'lombok.version'}", "org.projectlombok:lombok-mapstruct-binding:${project. 'lombok.mapstruct.binding.version'}"
...
}
...
다음 장에서 modelmapper 와 mapstruct 를 활용할 때 성능 차이를 비교하는 post 를 올리고자 합니다.