티스토리 뷰
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가 없어서 mapping 작업이 되지 않는다
null 검사를 하고 return을 할 뿐이어서 아무 작용을 하지 않는 코드다
이 updateFromDto 메서드 때문에 setter를 열어야 하나 고민이 됐는데 사실 고민할 필요가 없는 문제였던 것 같다
Setter를 사용하지 않는 이유를 생각해보면 혹시 모를 외부 변화를 막는 게 핵심인데 나는 혼자 진행하는 프로젝트이기도 하고
만약 mapstruct를 사용하는 협업 시에는 product code 전체에서 개발자가 setterXX를 사용하지 않으면 그만이다
아래 좌측은 직접 작성한 수정을 위한 코드이고 우측은 mapper 구현체에서 만들어진 코드이다
선택은 각자의 몫이고 나는 setter를 열어두고 사용하지 않기로 결정했다
아래는 단순히 하나의 예일뿐이고 프로젝트가 커지면서 생기는 domain 수만큼 수정을 위한 코드를 작성해야 한다
mapstruct는 이를 간단하게 인터페이스를 만들면 끝나게끔 도와준다
이 녀석 참 똘똘하다
'Spring > Spring Framework' 카테고리의 다른 글
[Test] 기묘한 병렬 테스트 (0) | 2021.12.06 |
---|---|
[Test] JPA DataIntegrityViolationException 발생 테스트 복구 (0) | 2021.11.19 |
[MapStruct] DTO 안의 DTO (0) | 2021.10.07 |
[Test] 깨지는 테스트 어떻게 복구할까? (3) | 2021.09.24 |
[AOP] 소요 시간 측정 AOP class level에 적용하기 (0) | 2021.09.09 |