SPRING
2022.05.02 / 16:09

½ºÇÁ¸µ ÇÁ·ÎÁ§Æ® °èÃþ ±¸Á¶ ¼³°èÇϱâ (DDD)

ÄÚÄÚ·Î
Ãßõ ¼ö 218

[Spring] ½ºÇÁ¸µ ÇÁ·ÎÁ§Æ® °èÃþ ±¸Á¶ ¼³°èÇϱâ (DDD)

½ºÇÁ¸µ ÇÁ·ÎÁ§Æ® °èÃþ ±¸Á¶ ¼³°èÇϱâ (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();
    }

}

 

´Ù¾çÇÑ ÀÇÁ¸¼º ÁÖÀÔ ¹æ¹ý

  1. @Autowired
  2. setter
  3. »ý¼ºÀÚ ÁÖÀÔ

¡æ ÀÌ Áß °¡Àå ±ÇÇÏ´Â ¹æ½ÄÀº »ý¼ºÀÚ·Î ÁÖÀÔ¹Þ´Â ¹æ½ÄÀÌ´Ù.  (ÀÌÀ¯ : °´Ã¼ ºÒº¯¼º È®º¸, Å×½ºÆ® ÄÚµå ÀÛ¼º ¿ëÀÌ)

 

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();
    }
}

¡ØÂü°í

½ºÇÁ¸µ ºÎÆ®¿Í AWS·Î È¥ÀÚ ±¸ÇöÇÏ´Â À¥ ¼­ºñ½º - À̵¿¿í