Entity์ Dto ๊ฐ์ฒด ๊ฐ์ ๋งคํ์ ์ง์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
Entity์ Dto ๊ฐ์ฒด ๊ฐ์ ๋งคํ์ ์ง์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ModelMapper์ MapStruct๊ฐ ์๋ค.
MapStruct๋ ์ปดํ์ผ ์ ๋ฏธ๋ฆฌ ์์ฑ๋ ๊ตฌํ์ฒด๋ก ๋งคํํด์ฃผ๊ธฐ ๋๋ฌธ์ ๋ฐํ์ ๋น์ฉ์ด ์ ๊ฒ ๋ค๋ฉฐ ๋งคํ ์ฑ๋ฅ์ด ๋ฐ์ด๋๋ค.
MapStruct๋ ์ธํฐํ์ด์ค ๊ธฐ๋ฐ ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ค.
๊ฐ ๋งคํ์ ์ํ ๋ฉ์๋๋ฅผ ๊ฐ๋จํ๊ฒ ์ ์ํ๋ฉด ํด๋น ๋ฉ์๋๋ฅด ๊ตฌํํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
MapStruct์ ์ฃผ์ ๊ธฐ๋ฅ
๋ค์ํ ๋งคํ ์ ๋ต ๋ฐ ๊ธฐ๋ฅ ์ ๊ณต
์ด๋
ธํ
์ด์
๊ธฐ๋ฐ ์ค์
๋ค๋ฅธ ๋งคํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํตํฉ ๊ฐ๋ฅ
Gradle ๋ฐ Maven ํ๋ฌ๊ทธ์ธ ์ ๊ณต
Lombok ๊ณผ ํตํฉ ๊ฐ๋ฅ
๋งคํ ์ธํฐํ์ด์ค ์์ฑ
์ธํฐํ์ด์ค๋ @Mapper ์ด๋
ธํ
์ด์
์ ์ฌ์ฉํ์ฌ ๋งคํ ๋์ ํด๋์ค๋ฅผ ๋ช
์ํ๋ค.
@Mapping ์ด๋
ธํ
์ด์
์ ์ฌ์ฉํ๋ฉด ๋งคํ ์ ํน์ ํ๋๋ ๋ฉ์๋๋ฅผ ์ง์ ํ ์ ์๋ค.
Source ํด๋์ค๋ฅผ Target ํด๋์ค๋ก ๋งคํํ๋ ค๋ฉด ์๋์ ๊ฐ์ด ์์ฑํ๋ค.
์ธํฐํ์ด์ค์ ๋ฉ์๋ ๋ช
์ ์ํ๋ ๋๋ก ์ง์ ๊ฐ๋ฅ
@ Mapper
public interface SourceTargetMapper {
SourceTargetMapper INSTANCE = Mappers .getMapper (SourceTargetMapper .class );
@ Mapping (source = "id" , target = "targetNo" )
Target sourceToTarget (Source source );
}
์์ ์์๋ INSTANCE๋ฅผ ์ ์ธํ์ฌ ํด๋ผ์ด์ธํธ์ ๋งคํผ ๊ตฌํ์ฒด์ ๋ํ ์์ธ์ค๋ฅผ ์ ๊ณตํ๋ค.
INSTANCE๋ฅผ ์ ์ธํ์ง ์๋๋ค๋ฉด, ์์กด์ฑ ์ฃผ์
์ผ๋ก SourceTargetMapper ๊ตฌํ์ฒด๋ฅผ ์ฃผ์
ํ์ฌ ์ฌ์ฉํ ์๋ ์๋ค.
@ Autowired
private SourceTargetMapper mapper ;
@Mapping ์ด๋
ธํ
์ด์
์ผ๋ก Source ๊ฐ์ฒด์ id ๋ผ๋ ํ๋๊ฐ์ Target ๊ฐ์ฒด์ targetNo ํ๋๊ฐ์ผ๋ก ๋งคํํ๋ค.
source์ target ๋์์ด ๋ค๋ฅธ ํ์
์ธ ๊ฒฝ์ฐ ํ ๋ณํ์ ์คํํ์ฌ ๋งคํํ๋ค.
MapStruct๋ ์ปดํ์ผ ํ์์ ๋งคํ ๊ตฌํ์ฒด๋ฅผ ์์ฑํด์ค๋ค.
@Mapper(componentModel = "spring") ์ ๊ฐ์ด componentModel="spring" ์์ฑ์ ์ง์ ํด์ฃผ๊ฒ ๋๋ฉด ์๋ ์์ฑ๋๋ ๊ตฌํ์ฒด ํด๋์ค๋ฅผ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ ์ ์๋ค.
componentModel ์์ฑ์ ์๋ตํ๊ฒ ๋์ด๋ Spring ์ปดํฌ๋ํธ ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ๊ตฌํ์ฒด๋ฅผ ์์ฑํ๊ธด ํ๋ค.
Target target = SourceTargetMapper .INSTANCE .sourceToTarget (source );
@ Mapper
public interface OrderMapper {
@ Mapping (source = "owner.name" , target = "ownerName" )
@ Mapping (source = "orderItems" , target = "orderItems" )
@ Mapping (source = "buyDate" , target = "buyDate" )
@ Mapping (target = "totalPrice" , qualifiedByName = "calculateTotalPrice" )
OrderDto mapToDto (Order order );
@ Named ("calculateTotalPrice" )
default double calculateTotalPrice (Order order ) {
double total = 0.0 ;
for (OrderItem item : order .getOrderItems ()) {
double itemPrice = item .getPrice ();
int quantity = item .getQuantity ();
total += itemPrice * quantity ;
}
return total ;
}
}
calculateTotalPrice ๋ผ๋ ์ฌ์ฉ์ ์ ์ ๋ฉ์๋๋ฅผ ์ ์ํ๋ค.
@Mapping ์ด๋
ธํ
์ด์
์ qualifiedByName ์์ฑ์์ @Named ์ด๋
ธํ
์ด์
์ผ๋ก ์ด๋ฆ์ด ๋ถ์ฌ๋ ์ฌ์ฉ์ ์ ์ ๋ฉ์๋๋ฅผ ์ฐธ์กฐํ๋ค.
์ฐธ์กฐํ calculateTotalPrice ๋ฉ์๋์์ ๊ณ์ฐํ ๊ฐ์ OrderDto ๊ฐ์ฒด์ totalPrice ํ๋์ ๋งคํํ๋ค.