티스토리 뷰

Springboot 프로젝트를 진행할 때 지루한 entity -> dto 변환 작업을 쉽게 도와줄 수 있는 mapping library들이 있다

대표적으로 model mapper, mapstruct, okari가 존재하는데 나는 성능 상의 이유로 mapstruct를 사용했다

mapping library의 성능 비교 글은 구글링을 하면 쉽게 찾을 수 있다

mapstruct는 롬복처럼 컴파일 시점에 annotation-processor에 의해 변환되기 때문에 성능이 가장 우수하다

다른 mapping library들은 런타임 시점에 리플렉션을 통해 매핑하기 때문에 성능에 부하가 올 수 있다

 

사용법은 okari는 성능이 가장 안 좋다고 하여 사용해본 적이 없어서 패스하고,

mapstruct보다 model mapper가 사용법은 쉬운 것 같은데 성능을 생각한다면 mapstruct를 쓰는 게 맞는 것 같다

게다가 mapstruct도 GenericMapper라는 인터페이스를 생성하고 이를 상속해서 사용하면 되기 때문에 어려울 건 없다

요렇게만 GenericMapper를 작성해두고 상속 받아 변환시킬 Dto, Entity를 지정하고 Custom mapper를 작성하면 된다

이 5줄의 코드로 Entity <-> Dto 간 변환, List 형태로의 변환, update까지 할 수 있다

@Mapper 어노테이션은 필수다 이게 있어야 spring에서 bean으로 인식한다

 

 

 

mapstruct의 더욱 자세한 설명은 공식 문서를 참조하자

 

MapStruct 1.4.2.Final Reference Guide

If set to true, MapStruct in which MapStruct logs its major decisions. Note, at the moment of writing in Maven, also showWarnings needs to be added due to a problem in the maven-compiler-plugin configuration.

mapstruct.org

 

 

오늘은 그 중 updateFromDto와 관련한 에러를 정리해보려 한다

아래는 공식 문서에 있는 update 관련한 내용이다

이미 존재하는 entity를 업데이트까지 시켜주는 친절한 메서드다

 

대부분이 알고 있듯 Entity는 보통 @Setter를 열어두지 않는다

혹시 모를 외부 변화를 사전에 차단하기 위함이다

개인적으로 changeXXX() 등의 네이밍을 사용하여 setXX을 대신해 사용하곤 한다

여기서 주의할 점은 mapstruct의 updateFromDto는 setter를 사용하여 mapping 한다

이 점을 몰랐을 때는 당연히 Entity의 Setter를 막아두고 Builder 패턴을 사용해 인스턴스를 만들었는데

테스트 코드를 작성하며 update가 안 되는 것을 알았고 mapstruct가 만들어준 mapper 구현체를 찾아가 봤다

 

setter를 열어두지 않으면 만나게 될 mapperImpl의 update 코드

 

 

setter가 없어서 mapping 작업이 되지 않는다

null 검사를 하고 return을 할 뿐이어서 아무 작용을 하지 않는 코드다

이 updateFromDto 메서드 때문에 setter를 열어야 하나 고민이 됐는데 사실 고민할 필요가 없는 문제였던 것 같다

Setter를 사용하지 않는 이유를 생각해보면 혹시 모를 외부 변화를 막는 게 핵심인데 나는 혼자 진행하는 프로젝트이기도 하고

만약 mapstruct를 사용하는 협업 시에는 product code 전체에서 개발자가 setterXX를 사용하지 않으면 그만이다

 

 

아래 좌측은 직접 작성한 수정을 위한 코드이고 우측은 mapper 구현체에서 만들어진 코드이다

선택은 각자의 몫이고 나는 setter를 열어두고 사용하지 않기로 결정했다

아래는 단순히 하나의 예일뿐이고 프로젝트가 커지면서 생기는 domain 수만큼 수정을 위한 코드를 작성해야 한다 

mapstruct는 이를 간단하게 인터페이스를 만들면 끝나게끔 도와준다

이 녀석 참 똘똘하다

 

(좌) 직접 작성한 코드, (우) setter를 열고 mapstruct가 작성해준 코드

댓글
링크
글 보관함
«   2024/05   »
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 31
Total
Today
Yesterday