
DDD (Domain-Driven Design)
Domain-Driven Design의 약자이다.
소프트웨어 개발 방법론 중 하나로, 복잡한 도메인을 이해하고 효과적으로 모델링하기 위해 사용되는 개발 철학과 방법이다.
단어 그대로 도메인 주도 설계라고 부르고, 도메인에 집중하며 도메인의 복잡성을 최소화하기 위해 소프트웨어를 설계하고 개발한다.
예를들어, 온라인 쇼핑몰의 주요 도메인을 구성해보면 아래와 같을 것이다.

주요 구성 요소
엔티티(Entity)
값 객체(Value Object)
집합체(Aggregate)
레포지토리(Repositories)
서비스(Service) 등이 있다.
엔티티(Entity)
도메인 모델에서 가장 중요한 개념 중 하나로, 식별 가능하고 상태를 가지는 도메인 객체이다.
고유한 식별자이어야 한다.
위의 온라인 쇼핑몰의 예시에서 고객 정보(이름, 이메일, 전화번호 등)과 주문 정보(주문 ID, 주문 항목) 등이 해당된다.
값 객체(Value Object)
소프트웨어의 모델을 구성하는 수치에 대한 객체이다.
엔티티와 달리 도메인 모델에서 상태를 가지는 객체이지만 식별자가 없는 객체이다.
위의 온라인 쇼핑몰의 예시에서 주소 정보를 담은 객체(주소, 도시, 우편번호 등)과 통화와 금액 정보를 담은 객체 등이 해당된다.
집합체(Aggregate)
연관된 엔티티와 값 객체를 묶어 하나의 논리적 단위로 표현하는 개념이다.
위의 온라인 쇼핑몰의 예시에서 주문 엔티티와 주문 항목 엔티티(OrderItem)를 포함하며, 주문의 상태를 변경하는 로직과 고객 엔티티와 고객의 주소 정보를 포함하며, 고객의 상태를 변경하는 로직 등이 해당된다.
레포지토리(Repositories)
도메인 객체를 저장, 검색, 조작하는 인터페이스를 제공하는 객체이다.
위의 온라인 쇼핑몰의 예시에서 고객 정보를 저장하고 불러오는 인터페이스과 주문 정보를 저장하고 불러오는 인터페이스 등이 해당된다.
서비스(Service)
Domain Object에서 위치시키기 어려운 operation을 가지는 객체이다.
위의 온라인 쇼핑몰의 예시에서 주문 생성, 주문 취소 등의 로직과 결제 처리 로직 등이 해당된다.
IoC (Inversion of Control)
Inversion of Control의 약자로, 단어 그대로 "제어의 역전"이다.

객체의 생성과 의존성 주입을 제어하는 디자인 패턴이라는 것을 기억하고, 위 사진에서 제어의 주체의 변화를 중점으로 두고 보면 이해할 수 있다.
IoC를 왜 쓸까 ?
1. 유연성의 증가
IoC는 구성 요소 간의 결합도를 낮춰준다.
따라서, 한 구성 요소를 다른 구성 요소로 쉽게 교체하거나 업데이트 할 수 있게 해준다.
2. 재사용성의 향상
독립적이고 모듈화된 구성 요소를 만들 수 있기 때문에, 동일한 구성 요소를 여러 프로젝트나 애플리케이션에서 재사용할 수 있다.
3. 가독성 및 유지보수성의 향상
코드의 가독성이 향상된다.
의존성 주입 등을 통해 어떤 구성 요소가 어떤 다른 구성 요소에 의존하는지 명확하게 알 수 있다.
4. 관심사의 분리
각 계층이나 모듈이 자신이 해야 할 일에만 집중할 수 있게 만들기 때문에 코드의 명료성을 높인다.
5. 확장성의 향상
애플리케이션이 성장하고 새로운 기능이 추가되기 때문에, IoC를 통해 새로운 요구사항에 맞춰 구성 요소를 쉽게 확장하거나 수정할 수 있다.