Programming/SpringBoot

[Spring] ModelMapper MapStruct

owls 2024. 7. 2. 13:41
728x90

Object Mapping

Controller, Service, Repository 등 레이어 간 데이터를 주고 받을 때 하나의 객체를 타입이다른 객체로 형변환하는 일이 빈번하게 발생한다. ( DTO와 Entity간 형변환 과정)

이런 작업을 개발자가 모두 직접하게 되면 발생하는 문제점이 있다.

  • 반복적이고 코드 중복이 발생
  • 실수하기 쉽다
  • 필드 추가, 수정, 삭제가 일어날 경우 변환하는 로직에 대해 수정이 필요하다
  • 비즈니스 로직에 섞이게 되면 코드가 복잡해진다
  • 결국 생산성이 떨어진다.

Object Mapping라이브러리는 이런 문제를 해결해주는 도구이다. 

 

ModelMapper, MapStruct

Object Mapping을 위한 Model Mapper와  MapStruct라이브러리가 있다. 

  • MapStruct는 컴파일 시점에서 어노테이션을 읽어 구현체를 만들어내기 때문에 리플렉션이 발생하지 않는다. ( ModelMapper는 Mapping이 일어날 때 리플렉션이 발생)
  • MapStruct의 처리속도가 10^(-5)m/s로 압도적으로 빠르다.(ModelMapper는 0.002m/s)
  • MapStruct는 컴파일 시 오류를 확인할 수 있다.
  • MapStruct는 디버깅이 쉽다
  • MapStruct는 생성된 매핑 코드를 눈으로 직접 확인할 수 있다.

ModelMapper는 리플렉션에 의해 의존하기 때문에 MapStruct보다 더 느리다.

 

리플렉션

객체를 통해 클래스의 정보를 분석해 내는 프로그래밍 기법.

구체적인 클래스 타입을 알지 못해도 컴파일된 바이트 코드를 통해 역으로 클래스의 정보를 알아내어 클래스를 사용하게 할 수 있다.

리플렉션 기법을 통해 객체의 타입을 모르는 상태에서 객체의 메서드를 호출할 수 있다. 즉 동적 바인딩이 되지 않던 자바에서 리플렉션이라는 프로그래밍 기법을 통해 동적 바인딩을 제공하는 것이다.

 

ModelMapper는 자바 리플렉션을 통해 런타임에 온갖 처리를 수행한다.

MapStruct는 컴파일타임에 미리 준비해 둔 동작을 런타임에 실행하면 된다.

 

MapStruct는 더 빠르고, 코드를 미리 생성하며, 더 읽기 쉬운 코드를 제공한다.

MapStruct를 구성하여 매핑되지 않은 대상 속성을 확인하고, 발견되면 빌드를 실패시킬 수 있다.

 

이렇게 MapStruct는 많은 장점을 가지고 있기에 MapStruct사용을 권장한다.

 

적용하기

1. 의존성 추가

// https://mvnrepository.com/artifact/org.mapstruct/mapstruct
	implementation 'org.mapstruct:mapstruct:1.5.5.Final'
	annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final'
	annotationProcessor 'org.projectlombok:lombok-mapstruct-binding:0.2.0'

● implementation 'org.mapstruct:mapstruct:1.5.5.Final'

MapStruct사용을 위한 의존성 라이브러리

 

● annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final'

의존성 목록에 반드시 Annotation Processor를 추가해야 한다.

MapStruct는 각 데이터 매퍼(데이터 변환 인터페이스)의 클래스를 생성해 두어야 하기 때문이다.


● annotationProcessor 'org.projectlombok:lombok-mapstruct-binding:0.2.0'

롬북에서 MapStruct와 충돌을 없애기 위한 어노테이션 프로세서를 제공한다.

이것을 사용하지 않으면 롬북 Annotaion Processor와 호출 순서 등에서 충돌이 있다.

 

참고

 

https://dev-splin.github.io/spring/Spring-ModelMapper,MapStruct/

 

 

 

 

 

 

728x90