- ½ºÇÁ¸µ ÇÁ·ÎÁ§Æ® °èÃþ ±¸Á¶ ¼³°èÇϱâ (DDD)
- Spring À¥ °èÃþ ±¸Á¶
- ºñÁî´Ï½º ·ÎÁ÷À» µµ¸ÞÀο¡ ³Ö´Â ÀÌÀ¯
- ¿¹½Ã - °Ô½Ã±Û ÀúÀåÇϱâ ÄÚµå
½ºÇÁ¸µ ÇÁ·ÎÁ§Æ® °èÃþ ±¸Á¶ ¼³°èÇϱâ (DDD)
API¸¦ ¸¸µé±â À§ÇØ ÃÑ 3°³ÀÇ Å¬·¡½º°¡ ÇÊ¿äÇÏ´Ù.
- Request µ¥ÀÌÅ͸¦ ¹ÞÀ» Dto
- API ¿äûÀ» ¹ÞÀ» Controller
- Æ®·£Àè¼Ç, µµ¸ÞÀÎ ±â´É °£ÀÇ ¼ø¼¸¦ º¸ÀåÇÏ´Â Service
¿©±â¼ ¸¹ÀÌ ¿ÀÇØÇÏ°í ÀÖ´Â ºÎºÐÀÌ Service¿¡¼ ºñÁî´Ï½º ·ÎÁ÷À» ó¸®ÇØ¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù. ÇÏÁö¸¸ ÀüÇô ±×·¸Áö ¾Ê´Ù. Service´Â Æ®·£Àè¼Ç, µµ¸ÞÀÎ °£ ¼ø¼ º¸ÀåÀÇ ¿ªÇÒ¸¸ ÇÑ´Ù.
±×·³ ºñÁî´Ï½º ·ÎÁ÷Àº ´©°¡ ó¸®ÇÒ±î?
¹Ù·Î, µµ¸ÞÀÎ DomainÀÌ´Ù.
Spring À¥ °èÃþ ±¸Á¶
Web °èÃþ
- ÈçÈ÷ »ç¿ëÇÏ´Â ÄÁÆ®·Ñ·¯(@Controller)¿Í JSP/ Freemarker µîÀÇ ºä ÅÛÇø´ ¿µ¿ªÀÌ´Ù.
- ÀÌ¿Ü¿¡µµ ÇÊÅÍ(@Fiilter), ÀÎÅͼÁÅÍ, ÄÁÆ®·Ñ·¯ ¾îµå¹ÙÀ̽º(@Controller Advice)µî ¿ÜºÎ ¿äû°ú ÀÀ´ä¿¡ ´ëÇÑ Àü¹ÝÀûÀÎ ¿µ¿ªÀ» ³ªÅ¸³½´Ù.
Service °èÃþ
- @Service°¡ »ç¿ëµÇ´Â ¼ºñ½º ¿µ¿ªÀÌ´Ù.
- ÀϹÝÀûÀ¸·Î Controller¿Í DaoÀÇ Áß°£ ¿µ¿ª¿¡¼ »ç¿ëµÈ´Ù.
- @TransactionalÀÌ »ç¿ëµÇ¾î¾ß ÇÏ´Â ¿µ¿ªÀ̱⵵ ÇÏ´Ù.
Repository °èÃþ
- Database¿Í °°ÀÌ µ¥ÀÌÅÍ ÀúÀå¼Ò¿¡ Á¢±ÙÇÏ´Â ¿µ¿ªÀÌ´Ù.
- Dao(Data Access Object)¿µ¿ªÀ̶ó°í ºÒ¸®±âµµ ÇÑ´Ù.
Dtos
- Dto(Data Transfer Object)´Â °èÃþ °£¿¡ µ¥ÀÌÅÍ ±³È¯À» À§ÇÑ °´Ã¼¸¦ À̾߱âÇϸç Dtos´Â À̵éÀÇ ¿µ¿ªÀ» ¸»ÇÑ´Ù.
- ex) ºä ÅÛÇø´ ¿£Áø¿¡¼ »ç¿ëµÉ °´Ã¼³ª Repositoy °èÃþ¿¡¼ °á°ú·Î ³Ñ°ÜÁØ °´Ã¼ µîÀÌ DtoÀÌ´Ù.
Domian Model
- µµ¸ÞÀÎÀ̶ó ºÒ¸®´Â °³¹ß ´ë»óÀ» ¸ðµç »ç¶÷ÀÌ µ¿ÀÏÇÑ °üÁ¡¿¡¼ ÀÌÇØÇÒ ¼ö ÀÖ°í °øÀ¯ÇÒ ¼ö ÀÖµµ·Ï ´Ü¼øÈ ½ÃŲ °ÍÀ» µµ¸ÞÀÎ ¸ðµ¨À̶ó°í ÇÑ´Ù.
- ºñÁî´Ï½º ·ÎÁ÷À» ó¸®ÇÑ´Ù.
- @Entity°¡ »ç¿ëµÈ ¿µ¿ª ¿ª½Ã µµ¸ÞÀÎ ¸ðµ¨ÀÌ´Ù.
- ´Ù¸¸, ¹«Á¶°Ç µ¥ÀÌÅͺ£À̽ºÀÇ Å×À̺í°ú °ü°è°¡ ÀÖ¾î¾ß ÇÏ´Â °ÍÀº ¾Æ´Ï´Ù. (VOó·³ °ª °´Ã¼µéµµ µµ¸ÞÀÎ ¸ðµ¨¿¡ ÇØ´çÇϱ⠶§¹®)
Spring °èÃþ °£ È帧µµ
ºñÁî´Ï½º ·ÎÁ÷À» µµ¸ÞÀο¡ ³Ö´Â ÀÌÀ¯
±âÁ¸¿¡ Service·Î ºñÁî´Ï½º ·ÎÁ÷À» ó¸®ÇÏ´ø ¹æ½ÄÀº Æ®·£Àè¼Ç ½ºÅ©¸³Æ®¶ó°í ÇÑ´Ù. ¸ðµç ·ÎÁ÷ÀÌ ¼ºñ½º Ŭ·¡½º ³»ºÎ¿¡¼ ó¸®ÇÏ¸é ¼ºñ½º °èÃþÀÌ ¹«ÀǹÌÇϸç, °´Ã¼¶õ ´Ü¼øÈ÷ µ¥ÀÌÅÍ µ¢¾î¸® ¿ªÇÒ¸¸ ÇÏ°Ô µÈ´Ù.
Service¿¡¼ ºñÁî´Ï½º ·ÎÁ÷ ó¸®
@Transactional
public Order cancelOrder(int orderId){
OrdersDto order = ordersDao.selectOrders(orderId);
BillingDto billing = billingDao.selectBilling(orderId);
DeliveryDto delivery = deliveryDao.selectDelivery(orderId);
String deliveryStatus = delivery.getStatus();
// "¹è¼Û Ãë¼Ò" ÇØ¾ß ÇÏ´ÂÁö È®ÀÎ
if("IN_PROGRESS".equals(deliveryStatus)){
// ¹è¼Û Ãë¼Ò·Î º¯°æ
delivery.setStatus("CANCEL");
deliveryDao.update(delivery);
}
// °¢ Å×À̺í Ãë¼Ò »óÅ update
order.setStatus("CANCEL");
ordersDao.update(order);
billing.setStatus("CANCEL");
billingDao.update(billing);
return order;
}
¹Ý¸é µµ¸ÞÀο¡¼ ó¸®ÇÒ °æ¿ì
order, billing, delivery°¡ °¢ÀÚ º»ÀÎÀÇ Ãë¼Ò À̺¥Æ® 󸮸¦ Çϸç, ¼ºñ½º ¸Þ¼Òµå´Â Æ®·£Àè¼Ç°ú µµ¸ÞÀÎ °£ÀÇ ¼ø¼¸¸ º¸ÀåÇØÁØ´Ù.
@Transactional
public Order cancelOrder(int orderId){
OrdersDto order = ordersRepository.findById(orderId);
BillingDto billing = billingRepository.findByOrderId(orderId);
DeliveryDto delivery = deliveryRepository.findByOrderId(orderId);
// ¹è¼Û Ãë¼Ò ·ÎÁ÷
delivery.cancel();
// °¢ Å×ÀÌºí¿¡ Ãë¼Ò update
order.cancel();
delivery.cancel();
return order;
}
¿¹½Ã - °Ô½Ã±Û ÀúÀåÇϱâ ÄÚµå
PostsApiController
@RestController
@RequiredArgsConstructor
public class PostsApiController {
private final PostsService postsService;
/**
* °Ô½Ã±Û µî·Ï
*/
@PostMapping("/api/v1/posts")
public Long save(@RequestBody PostsSaveRequestDto requestDto){
return postsService.save(requestDto);
}
}
PostsService
@Service
@RequiredArgsConstructor
public class PostsService {
private final PostsRepository postsRepository;
/**
* °Ô½Ã±Û ÀúÀå (Æ®·£Àè¼Ç ó¸®)
*/
@Transactional
public Long save(PostsSaveRequestDto requestDto){
return postsRepository.save(requestDto.toEntity()).getId();
}
}
´Ù¾çÇÑ ÀÇÁ¸¼º ÁÖÀÔ ¹æ¹ý
- @Autowired
- setter
- »ý¼ºÀÚ ÁÖÀÔ
¡æ ÀÌ Áß °¡Àå ±ÇÇÏ´Â ¹æ½ÄÀº »ý¼ºÀÚ·Î ÁÖÀÔ¹Þ´Â ¹æ½ÄÀÌ´Ù. (ÀÌÀ¯ : °´Ã¼ ºÒº¯¼º È®º¸, Å×½ºÆ® ÄÚµå ÀÛ¼º ¿ëÀÌ)
PostsSaveRequestDto
/**
* °Ô½Ã±Û ÀúÀå ¿äû Dto
*/
@Getter
@NoArgsConstructor
public class PostsSaveRequestDto {
private String title;
private String content;
private String author;
@Builder
public PostsSaveRequestDto(String title, String content, String author){
this.title = title;
this.content = content;
this.author = author;
}
public Posts toEntity(){
return Posts.builder()
.title(title)
.content(content)
.author(author)
.build();
}
}
¡ØÂü°í