작은 객체를 조합해 동작을 교체하기 쉽게 만듭니다.
구성은 객체가 필요한 다른 객체를 속성으로 보관하는 has-a 관계입니다. 의존성을 생성자에서 받으면 실제 구현 대신 테스트용 구현을 전달할 수 있어 결합도가 낮아집니다.
CourseService는 저장소를 직접 만들지 않고 생성자로 받은 repository에 save를 맡깁니다. service.create('Python')이 딕셔너리 하나를 저장하고, 바깥에서도 같은 repository 객체를 들고 있으므로 repository.items를 출력하면 [{'title': 'Python'}]이 보입니다. save 메서드만 갖춘 객체라면 무엇이든 같은 자리에 넣을 수 있습니다.
서비스가 내부에서 구체적인 저장소를 직접 만들지 않으면 파일, 메모리, 데이터베이스 구현을 호출 코드에서 선택할 수 있습니다.
의존성의 전체 클래스보다 실제로 필요한 작은 메서드 계약에 맞춰 설계하면 대체 구현이 단순해집니다.
전역 데이터베이스나 숨은 싱글톤을 함수 안에서 직접 읽으면 테스트 순서와 환경에 영향을 받기 쉽습니다.
직접 바꿔보세요MemoryRepository에 find_by_title을 추가하고 서비스에서 사용하세요.
실행 버튼을 누르면 결과가 여기에 표시됩니다.