오늘이라도

[III. 객체 지향 원리 적용] 3. 관심사의 분리 본문

인프런/스프링 핵심 원리 - 기본편 (김영한)

[III. 객체 지향 원리 적용] 3. 관심사의 분리

upcake_ 2022. 12. 28. 17:57
반응형

강의 링크

 

※ 코드는 저작권 상 올릴 수 없다고 합니다 ㅜㅜ


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 객체의 의존관계가 주입된다.

반응형