1. Mapstruct 라이브러리
DTO 와 Entity간 변환을 쉽게 해주는 라이브러리다.
[1] [보통 사용자의 입력값을 PO(Parameter Object)로 받아와서 DTO로 변환한다. 그리고 DTO의 값들을 Entity에 하나씩 넣어준 뒤 DB에서 Entity를 save 또는 update 하는 방식을 사용한다. 이 과정에서 DTO를 Entity로 바꿀 때, 또는 반대로 Entity를 기반으로 DTO로 바꿀 때 사용한다.]
필드값이 100개인 Entity의 100개 필드값을 DTO를 통해서 하나씩 전달해줄려면, Entity.setXxx(DTO.getXxx) 등으로 100개의 항목을 작성해줘야할 수도 있다. 그런데 Mapstruct의 @Mapper 방식을 사용하면 한줄만으로 이런 작업을 끝낼 수도 있다.
실제 사용 시에는 Entity에서 정의한 필드명과 DTO에서 정의한 필드명이 같아야 한다. 다르다면, Mapper 클래스 위에 @Mapeer(source="source.xxx", target="xxx")라는 식으로 필드명이 바껴서 매핑되어야 함을 명기해주어야 한다.
Mapstruct가 아니라 ModelMapper도 있는데, ModelMapper는 리플렉션을 발생시켜서 처리량이나 속도가 Mapstruct에 비해 뒤떨어진다고 한다.
2. DTO와 Entity 중 검증의 주체가 되는 부분
[1]의 과정에서, 사용자의 입력값을 검증해야하는 부분은 DTO이다. Entity는 본래, DB layer로서 DB와 통신하는 역할을 담당한다. 참조 2에 따르면, Validation 역할까지 담당하면 과도한 측면이 있고, API별로 유효성 검증을 할 수 없어 유연한 검증이 불가능하다. CRUD 중, 어떤 객체를 Create 할때와 Update 할때는 사용되는 필드명도 다를뿐더러 검증 방식도 다를 수 있기 때문이다.
클라이언트의 입력값인 PO -> Controller에서 Mapper로 DTO로 변경 -> Service에서 DTO값들을 검증 -> DTO의 값들을 Mapper로 Entity로 매핑(set)
링크
1. Mapstruct 라이브러리
https://huisam.tistory.com/entry/mapStruct
2. DTO Entity 검증 주체
'Programming-[Backend] > SpringBoot' 카테고리의 다른 글
[TIL][링크] messageSource application.yml 설정 옵션 (0) | 2021.12.07 |
---|---|
[TIL] Mapstruct - @Mapping 시 List의 필드값, the type of parameter has no property named (0) | 2021.09.13 |
[TIL][중요]Entity의 필드값 변경은 Service가 아닌 Entity에서 처리 (2) | 2021.08.26 |
[TIL] Unique Id 아닌 값을 바탕으로 조회 및 update 할 때, findTopBy (0) | 2021.06.29 |
[TIL] @JsonNaming 으로 Camel Case 필드값 Snake Case로 자동변환 (0) | 2021.06.21 |