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;
}
}
회고
도메인모델링은 현실의 모호한것을 클래스로만들어 구체화하여 정의했다. 협업할 때 편할 것 같다.
강사님께서 '주문' 도메인에서 필요하다고 생각되는 기능을 써 보라고 하셨다. 간단할 줄 알았다. 평소 당연시 여기며 이용해 왔던 기능들이 막상 개발을 위해 생각해 내려니 생각보다 쉽게 생각이 나지않았다.
예제를 보여주셨다. 기본적으로 있어야할 기능들 설명과 사용자의 요구사항을 만족시키기 위해 하나씩 메소드를 써내려가셨다.
이럴 땐 이렇게 저럴 땐 저렇게 대강 어떻게 해줘야할 지 감이 잡힌다. 요구사항만 읽고 바로 코드로 구현할 수 있는 능력 갖고 싶다. 연습해야겠다.
'신세게 - Java 공부' 카테고리의 다른 글
3주차 배운점 느낀점 - 클래스 다이어그램, 클래스간의 관계 (9) | 2024.10.03 |
---|---|
3주차 배운점 느낀점 - Usecase, 다이어그램, 엑터, 관계, 추상화, 인터페이스 (16) | 2024.10.03 |
3주차 배운점 느낀점 - 상속, 부모, 자식, 단일, 다단계, 타입제한, 조별과제 (2) | 2024.09.26 |
3주차 배운점 느낀점 - 생성자, 오버로딩, this(), 접근제한자, 조별과제 (10) | 2024.09.24 |
2주차 배운점 느낀점 - 클래스, 인터페이스, 상속 (햄버거) (2) | 2024.09.24 |