DDD : 9. 팩토리 패턴
- 카테고리 없음
- 2023. 11. 1.
9.1 팩토리의 목적
- 도메인 객체를 생성하는데 복잡한 로직이 들어간다면, '도메인을 잘 표현하기 위한' 도메인 객체의 취지가 무색해진다. 도메인 규칙이 무엇인지 이해하기 어려워지기 때문이다.
- 아래처럼 Customer 객체를 하나 생성하는데 필요한 로직이 무척 많다면, Customer 클래스를 봤을 때 '어떤 규칙이 있는지' 사실상 알기가 어려워진다.
- 이런 부분의 개선을 위해 도메인 객체 생성을 위한 팩토리를 도입을 고려하자.
public class Customer{
public Customer(){
// DB에서 데이터를 받아온다
// DB에 데이터가 무결성이 문제 없는지 확인한다
// 슬랙이랑 연동해서 확인한다
....
// 수많은 확인 작업.
}
}
9.2 생성자는 가능한 단순해야 함.
- 생성자는 가능한 단순해야한다.
- 생성자 안에서 다른 도메인 객체를 생성한다면, 다른 도메인이 변경되었을 때 이 객체의 생성자도 영향을 받게 된다.
- 생성자가 단순해지면, 도메인 객체의 명세를 읽기가 더 편해진다.
9.3 팩토리의 구성
- 객체 생성 팩토리는 클래스 / 메서드 형태로 구현할 수 있음.
- 객체 생성을 캡슐화할 수 있음.
- 팩토리를 이용하면 반환 타입을 인터페이스로 설정해 다형성을 구성할 수도 있음.
- 생성 절차가 복잡한 인스턴스를 만드는 코드를 모아둔 팩토리로도 만들 수 있음.
- 팩토리는 객체 생성 시 '의도'를 더 명확하게 표현한다.
- createUrgentOrder(String name, boolean urgent)
- createNormalOrder(String name, boolean normal)
- new Order(String name, boolean urgent)
- 어떤 메서드가 객체 생성 의도를 잘 드러내는가?
- 객체의 생성 여부를 팩토리 내에서 통제할 수 있음. (싱글톤, 플라이 웨이트 패턴)