Mapper 클래스 구현 방법에 대한 고찰

sith-call.dev·2023년 4월 18일
0

스프링

목록 보기
3/3

MapStruct 도입에 대한 고찰

문제 상황

  • Mapper 클래스를 직접 만들기가 수고로움
  • 코드를 통해 Mapper 클래스의 생성을 자동화 할 수 없을까?

가능한 방법

직접 Mapper Class를 작성하기

장점

  1. 순수한 자바 코드이기 때문에 외부 라이브러리를 가져와서 발생할 수 있는 기타 여러 가지 문제들로부터 자유로움

단점

  1. 직접 손으로 코드를 작성해야 하기에 휴먼 에러가 발생할 수 있음
  2. 일종의 하드코딩이기 때문에 모듈 간의 결합도가 높아질 수 있음

MapStruct

장점

  1. 컴파일 시에 Mapper 클래스의 로직이 생성되기 때문에 어노테이션 등을 이용하여 간단하게 Mapper 클래스를 생성할 수 있다. 즉, 생산성을 높일 수 있다

단점

  1. 상수는 매핑 시키지 못한다
  2. Lombok과 충돌할 수 있다.

ModelMapper

장점

  1. 간결하게 Mapper 클래스를 구현할 수 있다.
  2. Lombok과 충돌할 여지가 없다

단점

  1. 런타임 시간에 리플렉션하여 로직을 생성하기 때문에 오버헤드가 많아질 수 있음.
    1. 컴파일 시간에 생성되는 코드는 컴파일러에 의해서 최적화가 가능함. 그러나 런타임 시에 생성된 코드는 최적화 되어 있지 않음
  2. 바이트 코드 생성 방식이기에 디버깅이 어렵다. 컴파일 시간에 코드의 오류를 잡아내지 못한다는 소리.
  3. 일반적으로 Setter를 사용한다
    1. 아무래도 Setter는 다이렉트로 필드값을 수정시킬 수 있는 메서드이다 보니 다른 방법에 비해서 데이터가 변경될 위험이 상대적으로 높음.

성능 비교

선택 기준

첫번째로 ModelMapper는 런타임 시에 코드를 생성한다는 점에서 우선순위에서 배제하기로 생각함. 왜냐하면 런타임 시 생성되는 코드는 에러를 잡기 정말 힘들기 때문임. 해당 코드를 디버깅 하기 위해선 무조건 프로그램을 실행한 뒤에 종단점을 잡아야 하는데, 스프링 프로젝트에서 위와 같은 방식으로 에러를 찾기란 어렵다고 판단했음.

그렇다면 Manual과 MapStruct 사이에서 선택을 해야 함. 스스로 간단하게 예측해보자면, Mapping할 클래스의 수나 크기가 작다면 Manual이 더 유리할 것이라고 생각했다. 왜냐하면, 알고리즘 문제를 풀어봐도 느낄 수 있듯이, 크기가 작다면 그냥 직접 메뉴얼로 만드는게 비용이 적게 들기 때문이다. 그러나 정확한 근거를 찾고 싶었다. 

도와줘 Chat GPT


요약하자면, 프로젝트의 속성에 따라 갈린다고 한다. 내가 예측한 대로 크기가 크고, 복잡한 프로젝트에서 MapStruct가 적합하다고 한다. 그리고 크고 복잡하다는 판단의 정량적인 기준은 제시할 수 없다고 한다. 아마도 크고 복잡한 프로젝트라는 것은 내가 상상할 수 있는 수준은 아닐 듯 하다. 그래서 내가 만드는 프로젝트는 작고 귀엽기 때문에 Manual 방식으로 구현하기로 결정!

참고자료

1. https://lob-dev.tistory.com/entry/%EA%B0%9D%EC%B2%B4-%EB%B3%80%ED%99%98%ED%95%98%EA%B8%B0-%EC%9E%90%EB%B0%94-%EC%BD%94%EB%93%9C-%EB%A7%A4%ED%95%91-vs-MapStruct-vs-ModelMapper

 [객체 변환하기. 자바 코드 매핑 vs MapStruct vs ModelMapper?

해당 글은 MapStruct Library를 실무에서 사용하기 이전에 학습했던 예제와 장, 단점을 옮겨온 글입니다. (2022-10-26 수정 Benchmark 게시물 링크 추가) 현재 저는 약간의 수고로움을 감수하며 Java Code 기반

lob-dev.tistory.com](https://lob-dev.tistory.com/entry/%EA%B0%9D%EC%B2%B4-%EB%B3%80%ED%99%98%ED%95%98%EA%B8%B0-%EC%9E%90%EB%B0%94-%EC%BD%94%EB%93%9C-%EB%A7%A4%ED%95%91-vs-MapStruct-vs-ModelMapper)

2. https://github.com/arey/java-object-mapper-benchmark

profile
lim (time → ∞) Life(time) = LOVE

0개의 댓글