서론

공부 할 내용

도메인 모델을 구현하기 위한 기본 내용

  • 1. 도메인 모델이 뭐지? 엔티티와 밸류
  • 2. 아키텍쳐의 영역, DIP pattern, 도메인 영역의 구성 요소

공부 환경

장소: 동대문 할리스

시간: 월요일 퇴근후

향기: 흡연실 바로 앞 목과 폐가 아플 정도의 담배향기

들었던 음악

본론


1. 도메인 모델 시이작!

도메인이 뭐지? 

소프트웨어로 해결하고자 하는 문제의 영역. 

예를 들어 주겠어요? 

  • 온라인 서점은 도메인이고요! 도메인은 주문, 배송, 결제와 같은 도메인으로 나뉩니다. 도메인을 우리가 구현해야할 필요는 없고 외부 pg 연동같이 구성할 수도 있습니다. 


도메인 모델?

특정 도메인을 개념적으로 표현한 . 도메인 자체를 이해하기 위한 개념 모델.

어떻게 모델로 표현하나?

  • 각자 방법에 맞게끔.
  • 객체 모델(클래스 다이어그램) 일수도 있고. 그럼 객체 지향 언어를 통해서 구현하면 편하구..
  • 상태 다이어그램으로 작성할 수도 있고
  • 계산이 중요하다면 수학 공식을 활용해서 function으로 구현하던지
  • 관계가 중요하면 그래프를 이용해도 되고

이해가기 쉽게 표현하는 거시라고 이해했다 ^_^ 

구현 모델은 또 따로 필요하다. 


도메인 모델 패턴

아키텍처는 표현/응용/도메인/인프라스트럭쳐 4개의 계층으로 구성되어있는 것이 일반적, 여기서의 도메인 모델은 PEAA 책에 따르면, 아키텍처 도메인 계층을 객체 지향 기법으로 구현하는 패턴을 뜻함.

, 계층별로 구현해야하냐 인데, 도메인 모델 패턴은 도메인 계층을 어떻게 구현하는지.

도메인 구현 = 도메인의 핵심 규칙 구현

  • e.g., 출고 전에만 배송지를 변경할 있음. 
  • 주문 취소는 배송 전에만 있음


도메인 모델 도출

    요구사항을 정리해서 도메인 규칙을 만들어 다음에 구현한다.


    엔티티와 밸류

    엔티티

    • 식별자를 갖는다.
    • 삭제할때까지 변경하던 식별자는 유지됨
    • 두개 엔티티의 식별자가 같으면 엔티티는 같다.
      • e.g) 주문번호가 같으면 같은 주문임
    • equals(), hashCode() 메소드를 가짐
    • 생성 시점이나 방법은 도메인 특징 별로 다름
      • 특정 규칙을 쓰거나
      • UUID 클래스를 쓰거나
      • 아이디 같이 직접 입력하거나
      • 일련 번호를 쓰거나(mysql aI key..)
        • 생성하기 전에는 식별자 전달 불가

    밸류 타입

    • 개념적으로 완전한 하나를 표현하고자
    • e.g.) 받는 사람 + 주소를 묶어서 Receiver,
    • e.g.2) price 뜻하는 money 타입
    • 장점: 
      • money 위한 기능을 만들 있음. 돈계산같이..!
    • 어떻게 변경하나?
      • 기존을 변경하는게 아니라 새로운 밸류를 생성함.
      • 이뮤터블(불변)
    • 모든 속성이 같은지 비교해야 밸류 객체가 같은지 있음

    엔티티 식별자와 밸류 타입

    • 식별자를 위한 밸류타입을 사용해서 활용 가능

    도메인 모델에 set 넣지말자? ?

    • set 어떤 의미인지 개념이나 의도가 없어진다
    • 생성할때 완전한 상태가 아닐 수도 있다. (생성한담 셋하는데 하나 빼먹으면 어쩔꺼야? 그냥 생성할떄 받아라)
      • 프라이빗으로 생성할때 set시키도록. 외부에서 set 불가하고.. 

    도메인 용어

    • step1, step2 아닌 payMENT_WAITING, PREPAREING 도메인에서 사용하는 용어를 써라


    2. 아키텍쳐 개요

    네개의 영역

    표현

    • 응용에 변환하여 전달하고 받은 응답을 변환하여 웹브라우저에 보여주고

    응용

    • 표현 영역을 통해 받은 처리하기 위한 기능을 구현
    • 구현하기 위해 도메인 영역의 도메인 모델 사용(도메인 모델에 로직 수행 위임)
    • 주문등록, 주문 취소, 상품 상세 조회

    도메인

    • 도메인 모델 구현(1 내용)
    • 배송지 변경, 결제완료, 주문 총액 계산

    인프라

    • 구현 기술에 대한
    • RDBMS, 메시지 , SMTP, REST API… 

    계층 구조 아키텍처

    전형적인 계층 구조상의 의존 관계를 가지면 생기는 문제들(상위 계층에서 하위 계층으로 의존)

    • 테스트 어려움 (인프라 레벨 룰엔진이 완벽하게 동작해야 응용 영역에서 계산을 있음)
    • 기능확장 어려움(구현 방식을 변경하기 어렵다.) 

    DIP

    고수준: 가격 할인 계산 저수준: RDBMS JPA 구현, Drools 적용

    DIP: 저순준 모듈이 수준 모듈에 의존하도록 바꿈. 어떻게? 추상화한 인터페이스로!


    RuleDiscounter라는 인터페이스를 만들어서 고수준은 ruleDiscounter 활용하고, 저수준은 ruleDiscounter 상속받아 구현. 

    쉬워지는 거지?

    • 테스트해본다면? 
      • 저수준 안만들고 대용 객체를 사용해서 테스트 진행 가능 ( 데이터 활용)
    • 구현 기술이 변경된다면?
      • 고수준쪽은 수정안하고 저수준 구현 객체 생성하는 부분의 코드를 변경한다. (ruleDiscounter 생성하는 애만 바꿈..)

    DIP 아키텍처

    ?? 이해는 안가는 여튼 인프라가 응용 쪽의 인터페이스를 상속 받고 있으니 응용 영역 변경할 필요가 없고 notifier 구현하는 클래스를 인프라에다가 추가하면 되니까 깔끔하다는 같다? 

    도메인 영역의 주요 구성 요소

    • 엔티티
    • 밸류
    • 애그리거트
    • 리포지터리
    • 도메인 서비스

    + Recent posts