본문 바로가기

신세게 - Java 공부

3주차 배운점, 느낀점 - 도메인, 모델, 요구사항

728x90
반응형

3주차 수요일

 

우리는 클라이언트가 원하는 결과물을 만들어내는 부품이다. 학교 다닐 때 소프트웨어 공학을 배웠던 기억이 났다. 컴퓨터에 지식이 없는 사람과 대화 할 때 전달하는 말이 모호해 질 수 있고 오해가 생길 수 있다.
훌륭한 개발자는 상대가 원하는 기능을 잘 캐치해서 모델을 만들고 명세화하는 것이라고 생각한다. 또 이런 과정이 잘 되어 있어야 동료들과 협업이 가능할 것이다.

 

배운점

 

소프트웨어 '공'학 -> 결과가 있어야한다.

 

도메인 모델 패턴

 

 

필드명들 도메인 , 클래스, 인터페이스 : 도메인
클래스는 데이터를 담는다.
클래스를 상속.. 도메인 모델링
사용자인터페이스: 지금은 콘솔 사용하지만 웹에 붙이면 됨
사용자는 사람뿐아니라 외부 시스템일 수 있다.

 

도메인


도메인은 여러 하위 도메인으로 구성된다.
간단히 말하면 해결하고자 하는 문제의 영역 을 도메인이라고한다.
소프트웨어 입장에서 다시 해석하면 개발하고자 하는 소프트웨어의 요구사항 , 문제 영역 정도로 생각할 수 있다. 예를 들어 쇼핑몰을 만든다고 했을 때, 게시글, 댓글, 결제, 정산 등을 도메인이라고 할 수 있다.

 

 


카탈로그 하위 도메인: 리뷰
상위도메인:
결제는 주문의 하위
배송도 주문의 하위
정산도 주문의 하위
-카탈로그
구매할 수 있는 상픔 목록을 제공한다.
-주문
고객의 주문을 처리한다.
-혜택
쿠폰이나 특별한 할인 서비스를 제공한다.
-배송
고객에게 구매한 상품을 전달하는 여러가지 과정을 처리한다.(반품, 사진전송.. 등 있지만 세세하게 적지 않음)

 

한 하위 도메인은 다른 하위 도메인과 연동하여 완전한 기능을 제공
고객이 물건을 구매하면 주문, 결제, 배송, 혜택이 주어짐

 

Garbge in, Garbage out


잘못된값넣으면 잘못된게 나온다. .. 프로세스를 잘 이해해라
객체지향관련된 책좀 읽어라

 

왜 이런기능을 원하는지 또 실제로 원하는게무엇인지, 전문가와 얘기를 해서 그들이 원하는 것 기능구현
대화를 통해 그 대화를 원하는 낼 수 있는 능력 !! 이런 개발자가 되겠습니다

이런이런거 어떠세요 제안해야한다.


사용자가 원하는 기능을 만들지 않으면 개발자는 쓸모가 없다.

 

온라인쇼핑몰에서 상품을 몇개살지, 배송지 입력 , 선택한 상품 가격 이용해서 총 지불 비용

 

//코드짤때 주석처리 기본!!

 

도메인 모델


그림보고 도메인을 이해하고 지식을 공유할 수 있다.

 

 


같은 방향보고 나아갈 수 있다.


각각 생각들 나누고 정리해서 나누고 .. -> 결론 도출 -> 검증

 

메소드, 클래스, 필드이름 잘 정의해놓아야 알아보기 쉬움(뭘 제공하는지)

 

딜리버리Status클래스부분:
(상태다이어그램 이용)

 

모델의 각 구성 요소는 특정 도메인으로 한정될 때비로소 의미가 완전해 지기 때문에 하위 도메인마다 별도로 모델을 만들 수 있다.

 

 


ㄴ 이렇게 안말해줌 .

이렇게 요구사항 정리를 해야함

 

모델을 구성할때 핵심 요소, 규칙, 기능

 

주문 도메인
(상품명, 가격, 구매개수, 각 구매 항목의 구매 가격)
한 상품을 한 개 이상 주문할 수 있다.
각 상품의 구매 가격 합은 상품 가격에 구매 개수를 곱한값이다.

 

  • 출고 상태로 변경하기
  • 배송지 정보 변경하기
  • 주문 취소하기
  • 상품 가격 총합 구하기
  • 주문 결제하기
  • 주문 목록보기

 

오더와 오더라인 포함관계임

강사님이 구현해 주셨다.


요구사항을 만족하기 위해
Order 클래스 생성자에 shippingInfo 를 두었다.
=> 주문할 때 배송지 정보를 반드시 지정해야 한다.
verifyAtLestOneorMoreOrderLines 메소드를 통해 orderLines가 비어있는지 검사한다.
=> 최소 한 종류 이상의 상품을 주문해야 한다.
Amounts 는 개수 * 가격이다.
=> 각 상품의 구매 가격 합은 상품 가격에 구매 개수를 곱한값이다.
calculateTotalAmounts에서 리스트의 가격 토탈값을 구한다.
=> 총 주문 금액은 각 상품의 구매 가격 합을 모두 더한 금액이다.
verifyNotYetShipped를 통해 배송했는지 안했는지 체크한다.
=> 출고를 하면 배송지를 변경할 수 없다.

 

order class

 

public class Order {
 private List<OrderLine> orderLines; // 주문 상품??
 private ShippingInfo shippingInfo;  // 주소지 정보
 private Money totalAmounts;         // Money타입의 토탈 값

 private OrderState state;           // 상태 정보

 public Order(List<OrderLine> orderLines, ShippingInfo shippingInfo) {
   // 주문할때 배송지 정보를 반드시 지정해야한다.
   setOrderLines(orderLines);
   setShippingInfo(shippingInfo);
 }


 private void setShippingInfo(ShippingInfo shippingInfo) {
   if (shippingInfo == null)
     throw new IllegalArgumentException("no ShippingInfo"); // shippingInfo null인지 검사
   this.shippingInfo = shippingInfo; // 검사 후 shippingInfo 필드 초기화
 }

 private void setOrderLines(List<OrderLine> orderLines) {
   verifyAtLestOneorMoreOrderLines(orderLines); // 생성자에서 OrderLines 받으면 비어있는지 검사
   this.orderLines = orderLines; // orderLines 필드 초기화
   calculateTotalAmounts();      // 받은 orderLines의 가격 토탈
 }

 private void verifyAtLestOneorMoreOrderLines(List<OrderLine> orderLines) { 
 //받은 OrderLine null이거나 Empty인지 검사
   if (orderLines == null || orderLines.isEmpty()) {
     throw new IllegalArgumentException("no OrderLine");
   }
 }

 private void calculateTotalAmounts() {
   int sum = orderLines.stream().mapToInt(x -> x.getAmounts()).sum();
   //orderLine 객체의 getAmounts메소드(amounts)값 리턴 으로 토탈 값 구하기
   this.totalAmounts = new Money(sum);
   //Money 객체에 sum 넣어서 생성
 }

 public void changeShipped(ShippingInfo shippingInfo) {
   verifyNotYetShipped(); //상태검사
   setShippingInfo(shippingInfo);
 }

 private void verifyNotYetShipped() {
   if (state != OrderState.PAYMENT_WAITING && state != OrderState.PREPARING) // OrderState가 결제대기, 준비중 이 아닐때
     throw new IllegalArgumentException("aleady shipped"); // 이면 "이미 배송"
 }

 public void changeShippingInfo(ShipingInfo newShipping) {
 }

 public void cancel() {
   verifyNotYetShipped();
   this.state = OrderState.CANCELED;
 }

 public void completePayment() {
 }
}

 

shoppingInfo class

 

이름, 폰번호, 주소들을 필드로가진다
=>배송지 정보는 받는 사람 이름,전화번호, 주소로 구성된다.

 

public class ShippingInfo {

    private  String receiverName;
    private String receiveerPhoneName;
    private String shippingAddress1;
    private String shippingAddress2;
    private String shippingAddress3;


    ShippingInfo(){}
    public String getReceiverName() {
        return receiverName;
    }

    public String getReceiveerPhoneName() {
        return receiveerPhoneName;
    }

    public String getShippingAddress1() {
        return shippingAddress1;
    }

    public String getShippingAddress2() {
        return shippingAddress2;
    }

    public String getShippingAddress3() {
        return shippingAddress3;
    }
}

 

 

회고

 

도메인모델링은 현실의 모호한것을 클래스로만들어 구체화하여 정의했다. 협업할 때 편할 것 같다.
강사님께서 '주문' 도메인에서 필요하다고 생각되는 기능을 써 보라고 하셨다. 간단할 줄 알았다. 평소 당연시 여기며 이용해 왔던 기능들이 막상 개발을 위해 생각해 내려니 생각보다 쉽게 생각이 나지않았다.
예제를 보여주셨다. 기본적으로 있어야할 기능들 설명과 사용자의 요구사항을 만족시키기 위해 하나씩 메소드를 써내려가셨다.
이럴 땐 이렇게 저럴 땐 저렇게 대강 어떻게 해줘야할 지 감이 잡힌다. 요구사항만 읽고 바로 코드로 구현할 수 있는 능력 갖고 싶다. 연습해야겠다.

반응형