티스토리 뷰

Java

MapStruct란?

Jodu 2021. 8. 1. 19:40
반응형

개요

Spring을 사용을 하든 안하든 우리는 프로그램을 만들어가면서 Entity → Dto, Dto → Entity 변환을 많이 사용하게 되는데 다음과 같은 행위를 객체 Mapping이라 한다.

이러한 객체 Mapping 행위를 손쉽게 할 수 있도록 이미 많은 객체 Mapping라이브러리가 존재하며, 종류는 Jackson의 ObjectMapper, ObjectUtils, JMapper등 여러개가 존재한다.

그렇다면 이 많은 것들 중에서 어떤 것을 써야할까?? 개발의 편의성을 고려한다면 ObjectMapper, ObjectUtils등 별도의 설정이나 코딩이 없는 것을 사용하는게 편할 것이다. 하지만 다음 링크를 보면 알 수 있듯이 MapStruct와 JMapper 두개의 퍼포먼스가 빠른 것을 확인 할 수 있다. 해당 글을 읽게 되는 사람들의 99프로가 서버 개발자일 거고 서버 개발자는 서버의 리소스를 효율적으로 사용해야 한다.

그래서 이번 글에서는 MapStruct에 대해서 간략하게 알아보는 내용을 준비 했다.

MapStruct란?

공식문서에서는 다음과 같이 MapStruct를 소개하고 있다.

MapStruct는 타입에 안전한 Bean 맵핑 클래스를 생성하기 위한 자바 annotation processing이라고 설명하고 있다. 즉 Lombok, QueryDSL처럼 빌드나 컴파일을 통해 맵핑 클래스를 만들어주는 라이브러리라고 생각하면 되겠다.

Annotation Processing Tool(APT) apt는 어노테이션 처리를 위한 명령라인 유틸이다. apt는 reflective API와 프로그램 주석 처리를 위한 지원 인프라가 포함되어있다. 여기서 reflective API들은 빌드 타임, 소스 기반, 프로그램 구조의 읽기 전용 뷰를 제공한다.

APT 동작과정

  1. 새로운 소스 코드 및 기타 파일을 생성할 수 잇는 주석 프로세서를 실행
  2. 원본 파일과 생성된 소스 파일을 모두 컴파일

우리가 흔히 아는 QueryDSL, JPA, Lomobk 라이브러리가 APT에 의해 동작하게 되는 라이브러리이다. 해당 링크를 보면 어떻게 APT를 사용하는지 알 수 있다.

동작 방식

MapStruct는 ObjectMapper와 ObjectUtils처럼 그냥 단순하게 객체 Mapping을 해주지 않는다. 기본적으로 매핑에 필요한 매핑 방법을 선언하는 맵퍼 인터페이스를 정의해줘야한다.

맵퍼 인터페이스를 정의하면 컴파일하는 동안 MapStruct는 이 인터페이스의 구현을 생성하고, 이 구현체 내용에 맵핑에 관련된 로직이 생성되어 있어 객체 맵핑이 발생되는 것이다.

MapStruct에 의해 구현 된 구현체의 내부를 보게 되면 setter를 이용해서 객체 맵핑을 하는 것을 볼 수 있는데 이 내용은 추후 정리에서 상세하게 확인해보도록 하자.

여기서 MapSturct가 빠른 이유를 알 수 있다. ObjectMapper나 ObjectUtils는 내부에서 맵핑 대상이 되는 클래스에 리플렉션을 사용해서 객체 맵핑을 진행하는데, 이 리플렉션이 엄청나게 퍼포먼스가 떨어지는 기능이다. 하지만 MapStruct는 내부 구현체에서 setter를 이용해서 객체를 맵핑하기 때문에 퍼포먼스가 좋은 것이다.

MapStruct를 사용하면 얻는 이점

공식 문서에서는 3가지 이점을 들고 있다.

  1. 리플렉션 대신 일반 메서드 호출을 사용하여 빠른 실행
  2. 컴파일 타임 유형 안정성 : 서로 매핑되는 개체와 속성만 매핑 할 수 있다. 이 말은 주문 엔터티를 고객 DTO 등에 실수로 맵핑하는 실수를 방지 해준다는 뜻인데, 그 이유는 맵퍼 인터페이스에 정의 한 방식으로만 맵핑이 진행 되기 때문이다.
  3. 다음과 같은 경우 빌드 시 오류 보고서 지우기
    1. 매핑이 불완전함
    2. 매핑이 올바르지 않음

정리

MapStruct가 무엇이며 annotation processing에 의해 구현체까지 만들어진다는 것과 왜 성능이 좋은지에 대해서 간랸하게 알아보았다.

다음 정리에서는 MapStruct를 설정하는 방법 및 사용법에 대해서 정리해보자.

참고 링크

https://mapstruct.org/documentation/stable/reference/pdf/mapstruct-reference-guide.pdf

https://www.baeldung.com/java-performance-mapping-frameworks

https://www.baeldung.com/java-annotation-processing-builder

반응형

'Java' 카테고리의 다른 글

HttpServletRequest의 getInputStream 사용시 주의 사항  (0) 2019.03.28
FFMPEG Wrapper Library 사용법  (4) 2018.05.04
구글 주스와 MyBatis의 연동  (0) 2017.09.23
구글 주스 사용기[1]  (0) 2017.08.27
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함