장성호's
장성호's blog
장성호's
  • 분류 전체보기
    • 알고리즘
      • 백준
      • 이론
    • WEB
      • Spring 인강
      • 네트워크
    • 개인 프로젝트
      • 쇼핑몰 만들기

블로그 메뉴

  • 홈
  • 깃허브
전체 방문자
오늘
어제
반응형
hELLO · Designed By 정상우.
장성호's

장성호's blog

[Spring] 스프링 공부 #15
WEB/Spring 인강

[Spring] 스프링 공부 #15

2022. 3. 23. 20:28
반응형

도메인 모델 패턴

비즈니스 로직의 대부분이 엔티티에 있고, 서비스 계층은 단순히 엔티티에 필요한 요청을 위임하는 역할을 수행하는 패턴

 

주문 엔티티

//Order.java

//==생성 메서드==//
    public static Order createOrder(Member member, Delivery delivery, OrderItem... orderItems) {
        Order order = new Order();
        order.setMember(member);
        order.setDelivery(delivery);
        for (OrderItem orderItem : orderItems) {
            order.addOrderItem(orderItem);
        }
        order.setStatus(OrderStatus.ORDER);
        order.setOrderDate(LocalDateTime.now());
        return order;
    }

    //==비즈니스 로직==//
    //주문 취고
    public void cancel() {
        if (delivery.getStatus() == DeliveryStatus.COMP) {
            throw new IllegalStateException("이미 배송된 상품은 취소가 불간능합니다.");
        }

        this.setStatus(OrderStatus.CANCEL);
        for (OrderItem orderItem : orderItems) {
            orderItem.cancel();
        }
    }

    //==조회 로직==//
    //전체 주문 가격 조회
    public int getTotalPrice() {
        int totalPrice = 0;
        for (OrderItem orderItem : orderItems) {
            totalPrice += orderItem.getTotalPrice();
        }
        return totalPrice;

        /* Java 8
         return orderItems.stream()
                .mapToInt(OrderItem::getTotalPrice)
                .sum();
         */
    }

주문 서비스

//OrderService.java

//주문
@Transactional
public Long order(Long memberId, Long itemId, int count) {

    //엔티티 조회
    Member member = memberRepository.findOne(memberId);
    Item item = itemRepository.findOne(itemId);

    //배송정보 생성
    Delivery delivery = new Delivery();
    delivery.setAddress(member.getAddress());

    //주문상품 생성
    OrderItem orderItem = OrderItem.createOrderItem(item, item.getPrice(), count);

    //주문 생성
    Order order = Order.createOrder(member, delivery, orderItem);

    //주문 저장
    orderRepository.save(order);
    return order.getId();
}

//취소
@Transactional
public  void cancelOrder(Long orderId) {
    //주믄 엔티티 조회
    Order order = orderRepository.findOne(orderId);
    //주문 취소
    order.cancel();
}

//검색
//    public List<Order> findOrders()
}
 

트랜잭션 스크립트 패턴

도메인 모델 패턴과 다르게 엔티티에 비즈니스 로직이 거의 없고 서비스 계층에서 대부분의 비즈니스 로직을 처리하는 방법

 

 

※ 코드의 문맥에 따라서 적절한 패턴을 사용하면 된다. 동일한 프로젝트에서 2개의 패턴을 동시에 사용할 수도 있다.

 

출처

[인프런] 스프링 부트와 JPA 활용1

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-JPA-%ED%99%9C%EC%9A%A9-1/dashboard

 

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 인프런 | 강의

실무에 가까운 예제로, 스프링 부트와 JPA를 활용해서 웹 애플리케이션을 설계하고 개발합니다. 이 과정을 통해 스프링 부트와 JPA를 실무에서 어떻게 활용해야 하는지 이해할 수 있습니다., - 강

www.inflearn.com

도메인 모델 패턴

https://martinfowler.com/eaaCatalog/domainModel.html

 

P of EAA: Domain Model

 

martinfowler.com

트랜잭션 스크립트 패턴

https://martinfowler.com/eaaCatalog/transactionScript.html

 

P of EAA: Transaction Script

| P of EAA Catalog | Transaction Script Organizes business logic by procedures where each procedure handles a single request from the presentation. For a full description see P of EAA page 110 Most business applications can be thought of as a series of tra

martinfowler.com

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'WEB > Spring 인강' 카테고리의 다른 글

[Spring] 스프링 공부 #17  (0) 2022.03.29
[Spring] 스프링 공부 #16  (0) 2022.03.29
[Spring] 스프링 공부 #14  (0) 2022.02.17
[Spring] 스프링 공부 #13  (0) 2022.02.09
[Spring] 스프링 공부 #12  (0) 2022.02.07
    'WEB/Spring 인강' 카테고리의 다른 글
    • [Spring] 스프링 공부 #17
    • [Spring] 스프링 공부 #16
    • [Spring] 스프링 공부 #14
    • [Spring] 스프링 공부 #13
    장성호's
    장성호's
    장성호's 개발 공부 블로그

    티스토리툴바