오늘이라도
[III. 객체 지향 원리 적용] 3. 관심사의 분리 본문
※ 코드는 저작권 상 올릴 수 없다고 합니다 ㅜㅜ
1. 관심사의 분리
- 애플리케이션을 하나의 공연이라 생각해 보자. 각각의 인터페이스를 배역(배우 역할)이라 생각하자. 그런데 실제 배역을 맡는 배우는 누가 선택하는가?
- 누가 남주인공을 하고 여주인공을 할지를 배우들이 정하는 것이 아니다.
- 이전 코드는 남주인공역할(인터페이스)을 맡은 레오나르도 디카프리오(구현체, 배우)가 여주인공 역할(인터페이스)을 하는 배우(구현체)를 직접 초빙하는 것과 같다,
- 이 경우에 디카프리오는 공연도 해야 하고 여주인공 배우도 직접 초빙해야 하는 다양한 책임을 가지고 있다.
2. 관심사를 분리하자
- 배우는 본인의 역할인 배역을 수행하는 것만 집중해야 한다.
- 디카프리오는 어떤 여자 주인공이 선택되더라도 똑같이 공연을 할 수 있어야 한다.
- 공연을 구성하고, 배우를 섭외하고, 역할에 배우를 지정하는 책임을 담당하는 별도의 공연 기획자가 있어야 한다.
- 공연 기획자를 만들고, 배우와 공연 기획자의 책임을 확실히 분리하자.
3. AppConfig 등장
- 애플리케이션의 전체 동작 방식을 구성(config)하기 위해, 구현 객체를 생성하고, 연결하는 책임을 가지는 별도의 설정 클래스를 만들자.
- AppConfig 클래스 작성
- AppConfig는 애플리케이션의 실제동작에 필요한 구현 객체를 생성한다.
* MemberServiceImpl
* MemoryMemberRepository
* OrderServiceImpl
* FixDiscountPolicy
- AppConfig는 생성한 객체 인스턴스의 참조(레퍼런스)를 통해서 생성자를 통해 주입(연결)해준다.
* MemberServiceImpl → MemoryMemberRepository
* OrderServiceImpl → MemoryMemberRepository, FixDiscountPolicy
4. 생성자 주입으로 변경
- MemberServiceImpl 생성자 주입으로 바꾼다
* 설계변경으로 MemberServiceImpl은 MemoryMemberRepository를 의존하지 않는다
* 단지 MemberRepository 인터페이스에만 의존한다.
* MemberServiceImpl 입장에서 생성자를 통해 어떤 구현 객체가 들어올지(주입될지)는 알 수 없다.
* MemberServiceImpl 의 생성자를 통해서 어떤 구현 객체를 주입할지는 오직 외부(AppConfig)에서 결정된다.
* MemberServiceImpl 은 이제부터 의존관계에 대한 고민은 외부에 맡기고 실행에만 집중하면 된다.
- 객체의 생성과 연결은 AppConfig가 담당한다.
- DIP 완성 : MemberServiceImpl은 MemberRepository인 추상에만 의존하면 된다. 이제 구체 클래스를 몰라도 된다.
- 관심사의 분리 : 객체를 생성하고 연결하는 역할과 실행하는 역할이 명확히 분리되었다.
- appConfig 객체는 memoryMemberRepository 객체를 생성하고 그 참조값을 memberServiceImpl을 생성하면서 생성자로 전달한다.
- 클라이언트인 memberServiceImpl 입장에서 보면 의존관계를 마치 외부에서 주입해주는 것 같다고 해서 DI(Dependency Injection) 우리말로 의존관계 주입 또는 의존성 주입이라 한다.
- OrderServiceImpl도 생성자 주입으로 변경
* 설계 변경으로 OrderServiceImpl은 FixDiscountPolicy를 의존하지 않는다.
* 단지 DiscsoutPolicy 인터페이스만 의존한다.
* OrderServiceImpl 입장에서 생성자를 통해 어떤 구현 객체가 들어올지(주입될지)는 알 수 없다
* OrderServiceImpl 의 생성자를 통해서 어떤 구현 객체를 주입할지는 오직 외부(AppConfig)에서 결정한다,.
* OrderServiceImpl은 이제부터 실행에만 집중하면 된다.
* OrderServiceImpl에는 MemoryMemberRepository, FixDIscountPolicy 객체의 의존관계가 주입된다.
'인프런 > 스프링 핵심 원리 - 기본편 (김영한)' 카테고리의 다른 글
[III. 객체 지향 원리 적용] 5. 새로운 구조와 할인 정책 적용 (0) | 2023.01.19 |
---|---|
[III. 객체 지향 원리 적용] 4. AppConfig 리팩터링 (0) | 2023.01.19 |
[III. 객체 지향 원리 적용] 2. 새로운 할인 정책 적용과 문제점 (0) | 2022.12.13 |
[III. 객체 지향 원리 적용] 1. 새로운 할인 정책 개발 (0) | 2022.12.13 |
[II. 예제 만들기] 13. 주문과 할인 도메인 실행과 테스트 (0) | 2022.12.13 |