DDD
DDD는 객체지향에서부터!
객체지향에서의 핵심은 뭘까요?
객체지향에서의 핵심은 뭘까? 뭘까? 뭘까?
왜 객체를 지향할까?
좋은점이 많으니까 절차지향보다 순서를 고려하지 않아도 되는 장점들
일단, 재사용성이 좋지
그리고 객체가 그 자체를 표현하니까 보면서도 이 객체가 뭐를 말하고 싶은지 알 수 있지
유지보수에서도 장점이 있지
근데 객체지향이야 그렇다면, 어떻게 할 수 있을까?
추상화의 범위를 어떻게 잡아서 객체를 만들고, 어떤 객체가 필요하고, 상호작용하는 객체가 어떤것인지 추려낼 수 있을까?
이것을 가능하게 하는 것이 DDD이다. 도메인 주도 설계(Domain Driven Design)
즉, 도메인을 중심으로 설계해 나가는 것을 의미한다.
도메인이 뭔데? 정확히 한마디로 막 네이버 이려먼서 얼버무리지 말고 지역 범위를 말하는 영어 뜻 말고
도메인은 실세계에서 사건이 발생하는 집합이다.(?)
실세계에서 사건이 발생하는 집합 -> 말로 쓰니까 이해가 안된다.
ex) 옷 쇼핑몰을 예로 들어보면
손님들이 옷을 주문하는 도메인, 점주들이 옷을 관리하는 도메인, 좀 세부적으로 옷을 사기전에 담아두는 도메인 등등 있다.
이러한 여러가지 도메인들이 서로 상호작용하며, 설계하는 것이 도메인 주도 설계이다.
이 DDD의 특징은 같은 객체가 여러 개 존재할 수 있다는 것,
예를들어 옷을 손님 관점에서 보면 사기 위한 정보만 알면 된다.
하지만, 점주 입장에서는 더 다양한 정보가 필요하다. 예를들어 만든시간, 발주일자, 제조회사 등
즉, !문맥!에 따라 !객체!의 역할이 바뀐다.
이러한 관점을 더 나아가서 직접 서비스에 적용시킨 것이 바로 마이크로서비스이다.
다시 말해, 서로 다른 도메인 영역에 영향을 끼치기 위해, API 호출로 해야 된다는 것
즉, 각각의 도메인은 서로 철저히 분리되고, 높은 응집력과 낮은 결합도로 변경과 확장에 용이한 설계를 얻게 된다.
DDD는 어떻게 할까?
일단 3개의 Layer로 구분하는 것이 핵심이다.
Application Layer: 주로 도메인과 Repository를 바탕으로 실제 서비스(API)를 제공하는 계층이다.
Domain Model Layer: Entity, VO를 활용해서 도메인 로직이 진행되는 계층
Infrastructure Layer: 쉽게 말해서 외부 통신(ORM, DB, NoSql)을 담당하는 계층이다.