표현 영역
사용자의 요청을 받아 응용 영역에 전달하고 응용 영역의 처리 결과를 다시 사용자에게 보여주는 역할

응용 서비스가 요구하는 형식의 객체 타입으로 변환해서 전달
응용 영역
도메인 영역
인프라스트럭처 영역

상위 계층은 바로 아래의 계층에만 의존을 가져야 하지만 구계층 구조를 유연하게 적용 

고수준 모듈
저수준 모듈
구현 변경과 테스트가 어려운 문제를 해결하기 위해서는?
저수준 모듈이 고수준 모듈에 의존하도록 변경
- 추상화한 인터페이스 사용
- 행위만 작성하고 실제 구현은 인터페이스를 상속한 구현체에 적용한다.
- 그러면 다른 계층은 행위 자체만 알고 실제 구현에 대해서는 모른다. → 의존하지 않는다.

DIP 주의사항
저수준 모듈에서 인터페이스를 추출하지 않도록 주의

도메인 관점이 아니라 룰 엔진이라는 저수준 모듈 관점에서 도출된 경우

주문 시 통지 방식에 SMS를 추가해야 한다는 요구사항이 들어왔을 때 응용 영역의 OrderService는 변경할 필요가 없다.
| 요소 | 설명 |
|---|---|
| 엔티티 ENTITY | 고유의 식별자를 갖는 객체로 자신의 라이프 사이클을 갖는다. |
| 밸류 VALUE | 고유의 식별자를 갖지 않는 객체로 주로 개념적으로 하나인 값을 표현할 때 사용된다. 엔티티의 속성으로 사용할 뿐만 아니라 다른 밸류 타입의 속성으로도 사용할 수 있다. |
| 애그리거트 AGGREGATE | 애그리거트는 연관된 엔티티와 밸류 객체를 개념적으로 하나로 묶은 것이다. 예를 들어, 주문과 관련된 Order 엔티티, OrderLine 밸류, Orderer 밸류 객체를 ‘주문’ 애그리거트로 묶을 수 있다. |
| 리포지터리 REPOSITORY | 도메인 모델의 영속성을 처리한다. |
| 도메인 서비스 DOMAIN SERVICE | 특정 엔티티에 속하지 않은 도메인 로직을 제공한다. ‘할인 금액 계산’은 상품, 쿠폰, 회원 등급, 구매 금액 등 다양한 조건을 이용해서 구현하게 되는데, 이렇게 도메인 로직이 여러 엔티티와 밸류를 필요로 하면 도메인 서비스에서 로직을 구현한다. |
큰 수준에서 모델을 이해하지 못해 큰 틀에서 모델을 관리할 수 없는 상황에 빠질 수 있다.루트 엔티티를 갖는다.


