ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] ModelMapper MapStruct
    Programming/SpringBoot 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

    댓글

© 2022. code-space ALL RIGHTS RESERVED.