๐ ์ DTO ↔ Entity ๋ณํ์ด ํ์ํ๊ฐ?
Entity๋ DB ๋ชจ๋ธ์ด๊ณ , DTO๋ ์ ์ถ๋ ฅ·๋ทฐ ๋ชจ๋ธ์ด๊ธฐ ๋๋ฌธ.
์ํฐํฐ๋ฅผ ๊ทธ๋๋ก ๋ ธ์ถํ๋ฉด ๋ณด์·์ปคํ๋ง·์ ํจ์ฑ ๊ฒ์ฆ·API ์คํ ๋ถ๋ฆฌ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฏ๋ก,
DTO๋ก ๋ณํํด์ ์ธ๋ถ์ ๋ด๋ถ๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์ด Spring ์ค๋ฌด ํ์ค์ด๋ค.
๐ ๊ฐ์ฒด ๋ณํ 3๊ฐ์ง ๋ฐฉ๋ฒ ๋น๊ต
Spring Boot์์ DTO ↔ Entity ๋ณํ ์ ๋ํ์ ์ผ๋ก ์๋ 3๊ฐ์ง๋ฅผ ๋น๊ตํ ์ ์๋ค.
๐ ๋น๊ต ๊ธฐ์ค
- ์ปฌ๋ ์ (List) ๋ณํ
- ์ฐ๊ด ๊ด๊ณ ํ๋ ๋ณํ (์: User → Address ํฌํจ)
- ํ์ ๋ณํ (์: LocalDateTime → String)
| ๋ฐฉ๋ฒ | List ๋ณํ | ์ฐ๊ด ๊ด๊ณ ํ๋ ๋ณํ | ํ์ ๋ณํ (์: LocalDateTime → String) |
| BeanUtils.copyProperties() | โ ์๋ ์ฒ๋ฆฌ ํ์ | โ ์๋ ๋ณํ ๋ถ๊ฐ | โ ์ง์ ๋ณํ ํ์ |
| ModelMapper | โ ์๋ ๋ณํ ๊ฐ๋ฅ | ๐ ์ผ๋ถ ๋ณํ ๊ฐ๋ฅ | โ ์ปค์คํ ๋ณํ ์ง์ |
| ์๋ ๋ณํ (์ง์ ๋งคํ) | โ ์๋ฒฝํ ์ ์ด ๊ฐ๋ฅ | โ ์ํ๋ ๋๋ก ๋ณํ ๊ฐ๋ฅ | โ ์ํ๋ ๋ฐฉ์์ผ๋ก ๋ณํ ๊ฐ๋ฅ |
โ 1. BeanUtils.copyProperties()
Spring์ BeanUtils.copyProperties()๋ ๊ฐ๋จํ DTO ๋ณํ์ ์ ์ฉ.
ํ์ง๋ง, ์ฐ๊ด ๊ด๊ณ ํ๋(@OneToMany, @ManyToOne)๋ ํ์
๋ณํ(LocalDateTime → String)์ด ์๋์ผ๋ก ์ฒ๋ฆฌ๋์ง ์์์ ์ง์ ๋ณํํด์ผ ํ๋ค.
๐น ์์ ์ฝ๋
- OrderItemDetails orderItemDetails = new OrderItemDetails();
- BeanUtils.copyProperties(orderItem, orderItemDetails);
๐ฅ ์ฅ์ & ๋จ์
โ ์ฅ์
๋น ๋ฅด๊ณ ๋จ์
ํ๋๋ช
์ด ๊ฐ์ผ๋ฉด ์๋ ๋ณํ
โ ๋จ์
์ปค์คํ
/์ค์ฒฉ ํ๋ ์ฒ๋ฆฌ ๊ฑฐ์ ์์
๐น ๋ฆฌ์คํธ ๋ณํ ๋ฐ ์ฐ๊ด ๊ด๊ณ ๋ณํ ์์ (์๋ ์ฒ๋ฆฌ ํ์)
orderItemDetails.setOrderId(orderItem.getOrder().getOrderId()); // ์ฐ๊ด ๊ด๊ณ ํ๋ ์ง์ ๋งคํ
orderItemDetails.setProductName(orderItem.getProduct().getName());
โ 2. ModelMapper
ModelMapper๋ List ๋ณํ, ์ฐ๊ด ๊ด๊ณ ๋ณํ, ํ์
๋ณํ์ ์๋์ผ๋ก ์ฒ๋ฆฌ.
ํ์ง๋ง ์ฑ๋ฅ์ด ๋ค์ ์ ํ๋ ์ ์์.
๐น ์์ ์ฝ๋
- ModelMapper modelMapper = new ModelMapper();
- OrderItemDetails orderItemDetails = modelMapper.map(orderItem, OrderItemDetails.class);
๐ฅ ์ฅ์ & ๋จ์
โ ์ฅ์
์๋ ๋งคํ, ์ปจ๋ฒค์
๊ธฐ๋ฐ
โ ๋จ์
์ค์ ๋ณต์ก, ๋ฐํ์ ์ฑ๋ฅ ์ด์ ๊ฐ๋ฅ
๐น ๋ฆฌ์คํธ & ์ฐ๊ด ๊ด๊ณ ์๋ ๋ณํ ์์
modelMapper.createTypeMap(Product.class, ProductDTO.class)
.addMappings(mapper -> {
mapper.map(Product::getName, ProductDTO::setProductName);
mapper.map(src -> src.getCategory().getCategoryName(), ProductDTO::setCategoryName);
});
โ 3. ์๋ ๋ณํ
์ฐ๊ด ๊ด๊ณ(@OneToMany, @ManyToOne) ํ๋ ๋ณํ, ๋ฆฌ์คํธ ๋ณํ, ํ์
๋ณํ์ ์๋ฒฝํ๊ฒ ์ ์ดํ ์ ์๋ค.
ํ์ง๋ง ์ฝ๋๊ฐ ๊ธธ์ด์ง ์ ์์.
๐น ์์ ์ฝ๋
public static ProductDTO convertToDto(Product product) {
ProductDTO productDTO = new ProductDTO();
productDTO.setId(product.getId());
productDTO.setName(product.getName());
// ์ฐ๊ด ๊ด๊ณ ๋ณํ
productDTO.setCategoryName(product.getCategory().getCategoryName());
// ๋ฆฌ์คํธ ๋ณํ
List<ProductDetailDTO.ProductStockDto> stockDTOs = product.getStocks().stream()
.map(stock -> new ProductDetailDTO.ProductStockDto(
stock.getSize().getSizeName(),
stock.getColor().getColorName(),
stock.getStockQuantity()))
.collect(Collectors.toList());
productDTO.setProductStocks(stockDTOs);
return productDTO;
}
๐ฅ ์ฅ์ & ๋จ์
โ ์ฅ์
๊ฐ์ฅ ๋ช
ํ, ์ ์ง๋ณด์ ์ฌ์
โ ๋จ์
์ฝ๋๊ฐ ๊ธธ์ด์ง ์ ์์
๐ ์ต์ข ๊ฒฐ๋ก : ์ด๋ค ๋ฐฉ๋ฒ์ ์ ํํ ๊น?
| ๋ฐฉ๋ฒ | ์ถ์ฒ ์ฌ์ฉ ๊ฒฝ์ฐ |
| BeanUtils.copyProperties() | ํ๋๋ช ์ด ๋์ผํ ๊ฐ๋จํ DTO ๋ณํ์ผ ๋ |
| ModelMapper | ์๋ ๋ณํ์ด ํ์ํ ๊ฒฝ์ฐ (์ฐ๊ด ๊ด๊ณ ํฌํจ) |
| ์๋ ๋ณํ | ์ต๋ ์ฑ๋ฅ & ์ ํํ ์ ์ด๊ฐ ํ์ํ ๊ฒฝ์ฐ |
'Backend > spring (Boot)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| DTO / VO / DAO / Entity / Model ๋น๊ต (0) | 2026.01.25 |
|---|---|
| Redis๋? (Spring ์ฐ๋) (0) | 2026.01.07 |
| Connection Pool๊ณผ Size ์ ์ ๊ธฐ์ค (with HikariCP) (0) | 2025.09.01 |
| [Spring, JSP] session ์์ฑ ์ฐจ๋จ (0) | 2025.07.26 |
| [Spring] (ํ๋ก์ ํธ ์ธ๋ถ) ์ ์ ๋ฆฌ์์ค ์ฒ๋ฆฌ (0) | 2025.07.26 |