728x90
지금까지 보통 웹개발을 하면서 서비스 레이어에서 대부분의 비즈니스 로직을 처리 했던 기억 밖에 없었는데, 이번에 JPA 강의를 들으면서 한가지 새로 배운 개념이 있어서 정리해보려 한다.
바로 도메인 모델 패턴이라는 것인데 해당 패턴에서는 복잡한 비즈니스 로직을 서비스에서 처리하는 것이 아닌 도메인 즉, 엔티티에 작성을 하고 서비스는 로직 수행을 엔티티에 위임하는 방식으로 설계하는 방법이다.
JPA 등의 ORM을 사용할 때 유지보수 측면에서 더욱 유용한 패턴이라고 하는데, 처음 접했을 때는 상당히 낯설어서 적응하려면 시간이 조금 걸릴 것 같다.
강의에서는 주문을 수행하는 엔티티에 비즈니스 로직과 조회 로직 등이 들어갔는데, 이러한 복잡한 로직을 엔티티에 작성하는 이유는 엔티티가 각 데이터를 가지고 있는 엔드포인트이기 때문에 조금 더 효율적으로 로직을 수행할 수 있기 때문이라고 한다.
아주 간단한 예를 들자면 다음과 같은 차이점이 있다고 보면 될 것이다.
// 도메인 모델 패턴
Class Order {
private List<OrderItem> orderItems = new ArrayList<>();
...
public Long getTotalPrice() {
Long totalPrice = 0;
for (OrderItem orderItem : order.getOrderItems()) {
totalPrice += orderItem.getTotalPrice();
}
return totalPrice;
}
}
Class OrderItem {
private int count // 주문 수량
private Long orderPrice // 주문(당시) 금액
/**
* 총 금액 구하기
*/
public Long getTotalPrice() {
return count * orderPrice;
}
}
Class OrderService {
private final OrderRepository orderRepository;
...
public Long getTotalPrice(Long orderId) {
return orderRepository.findOne(orderId)
.getTotalPrice();
}
}
728x90
// 트랜잭션 스크립트 패턴
Class OrderItem {
private int count // 주문 수량
private Long orderPrice // 주문(당시) 금액
...
}
Class Order {
private List<OrderItem> orderItems = new ArrayList<>();
...
}
Class OrderService {
private final OrderRepository orderRepository;
...
public Long getTotalPrice(Long orderId) {
Long totalPrice = 0;
order = orderRepository.findOne(orderId);
for (OrderItem orderItem : order.getOrderItems()) {
totalPrice += orderItem.getCount() * orderItem.getOrderPrice();
}
return totalPrice;
}
}
위의 코드를 보면 OrderService 쪽에 코드량이나 복잡도가 다른 것을 알 수 있다.
어떤 패턴이 더 좋고 나쁘고 한 것은 없고 때에 따라 팀에따라 어떤 패턴을 적용할 것인지 한가지를 정해서 공유하면 될 것 같다.
728x90
'Back-end > java' 카테고리의 다른 글
[SpringBoot-JPA활용] 최적화된 조회를 위한 전략 (0) | 2023.03.06 |
---|---|
[SpringBoot-JPA활용] 변경 감지와 병합(merge) (0) | 2023.03.03 |