-
[Spring] ModelMapper MapStructProgramming/SpringBoot 2024. 7. 2. 13:41728x90
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'Programming > SpringBoot' 카테고리의 다른 글
[SpringBoot] OOME, hprof 덤프 파일, 메모리 디버깅 (0) 2024.07.31 [SpringBoot] batchUpdate()를 활용한 bulkInsert (0) 2024.07.30 [Spring] Transaction (0) 2024.06.20 [Spring] Spring에서 JSON 파라미터를 Java객체로 받기 (0) 2024.05.27 [Spring] Content-Type 'application/octet-stream' is not supported (0) 2024.05.27