반응형
SMART UI(지능형 UI) "안티 패턴”
- 도메인 로직을 사용자 인터페이스(UI) 계층에 너무 많이 포함시키는 것을 경고하는 개념
- SMART UI 안티 패턴은 사용자 인터페이스 계층(UI)에서 도메인 로직과 비즈니스 규칙을 처리하는 방식
문제점
- 도메인 로직과 UI 로직의 혼합
- 도메인 로직이 UI 코드에 직접 포함되어 있어, UI 변경 시 도메인 로직이 영향을 받을 수 있다
- 코드의 복잡성이 증가하고, 변경 사항이 여러 부분에 영향을 미칠 수 있다
- 테스트 어려움
- UI 계층은 일반적으로 테스트하기 어려운 부분입니다. 도메인 로직이 UI에 포함되면, 도메인 로직의 테스트가 어렵고, 오류를 발견하기 힘들어진다
- 재사용성 감소
- 도메인 로직이 UI 코드에 포함되어 있으면, 동일한 로직을 다른 UI에서 재사용하기 어려워진다
- 코드의 중복이 발생하고, 유지보수 비용이 증가한다
- 유지보수 어려움
- UI와 도메인 로직이 혼합되면, 특정 기능을 수정하거나 확장하는 것이 매우 복잡해질 수 있다
- 한 부분의 변경이 예기치 않은 버그를 유발할 수 있다
상황 예시
- 컨트롤러에서 도메인 로직을 직접 처리하는 경우
@Controller
public class OrderController {
@Autowired
private OrderRepository orderRepository;
@PostMapping("/orders")
public String createOrder(@RequestParam String product, @RequestParam int quantity, Model model) {
// 도메인 로직이 컨트롤러에 직접 포함됨
Order order = new Order();
order.setProduct(product);
order.setQuantity(quantity);
order.setStatus("NEW");
// 비즈니스 규칙 처리
if (quantity > 10) {
order.setDiscount(10);
} else {
order.setDiscount(0);
}
orderRepository.save(order);
model.addAttribute("order", order);
return "orderConfirmation";
}
}
어떻게 해결할까?
- 서비스 계층 도입
- 도메인 로직을 서비스 계층으로 이동시켜, UI 계층은 서비스 계층을 호출하여 결과를 처리하도록 한다
- 도메인 객체와 도메인 서비스 활용
- 도메인 객체와 도메인 서비스를 활용하여 비즈니스 로직을 처리한다
개선된 예제
- OrderService.java (서비스 계층)
@Service
public class OrderService {
@Autowired
private OrderRepository orderRepository;
public Order createOrder(String product, int quantity) {
Order order = new Order();
order.setProduct(product);
order.setQuantity(quantity);
order.setStatus("NEW");
applyDiscount(order);
return orderRepository.save(order);
}
private void applyDiscount(Order order) {
if (order.getQuantity() > 10) {
order.setDiscount(10);
} else {
order.setDiscount(0);
}
}
}
- OrderController.java (UI 계층)
@Controller
public class OrderController {
@Autowired
private OrderService orderService;
@PostMapping("/orders")
public String createOrder(@RequestParam String product, @RequestParam int quantity, Model model) {
Order order = orderService.createOrder(product, quantity);
model.addAttribute("order", order);
return "orderConfirmation";
}
}
반응형
LIST
'도서' 카테고리의 다른 글
DDD - 에릭 에반스, (11장 분석 패턴의 적용) (0) | 2024.06.29 |
---|---|
DDD - 에릭 에반스, (10장 유연한 설계) (0) | 2024.06.29 |
DDD - 에릭 에반스, (6장 도메인 객체 생명주기) (0) | 2024.06.29 |
DDD - 에릭 에반스, (5장 소프트웨어에서 표현되는 모델) (0) | 2024.06.29 |
DDD - 에릭 에반스, (2장 의사소통과 언어 사용) (0) | 2024.06.29 |