2. OCP, DIP 위반 해결방법

2024. 11. 2. 16:04·Spring

이 포스팅은 인프런에 있는 김영한 강사님의 스프링 핵심 원리 강의를 들으며 개인 공부를 한 것입니다.
소스코드는 제가 직접 작성하였습니다. (참고 : 깃허브주소)

✅ AppConfig :: OCP, DIP 위반 해결방법

  • 별도의 설정 클래스가 구현 객체를 대신 생성하고 주입해줘야 한다

SmsServiceImpl 생성자 주입 코드 추가
SmsServiceImpl는 SmsRepository, CustRepository, SmsFilter에 의존한다

스크린샷 2024-10-30 오후 5 31 41

CustServiceImpl 생성자 주입 코드 추가
CustServiceImpl은 CustRepository에 의존한다

스크린샷 2024-10-30 오후 5 32 00

SmsFilterImpl 생성자 주입 코드 추가
SmsFilterImpl은 는 smsRepository, custRepository에 의존한다

스크린샷 2024-10-30 오후 5 31 52

public class AppConfig {  
    public SmsService smsService() {  
        return new SmsServiceImpl(  
                getSmsRepository(),  
                getCustRepository(),  
                smsFilter()  
        );  
    }  

    public CustService custService() {  
        return new CustServiceImpl(getCustRepository());  
    }  

    public SmsFilter smsFilter() {  
        return  new SmsFilterImpl(  
                getSmsRepository(),  
                getCustRepository()  
        );  
    }  

    public CustRepository getCustRepository() {  
        return new MemoryCustRepository();  
    }  

    public SmsRepository getSmsRepository() {  
        return new MemorySmsRepository();  
    }  

}
  • AppConfig는 애플리케이션의 실제 동작에 필요한 구현 객체를 생성한다
  • AppConfig는 생성한 객체 인스턴스의 참조를 생성자를 통해서 주입(연결) 해준다
  • DIP 완성 : 클라이언트는 이제 인터페이스에만 의존한다.
    • 추상에만 의존하면된다. 이제 구체 클래스를 몰라도 된다.
    • 클라이언트는 이제부터 의존관계에 대한 고민은 외부에 맡기고 실행(자신의 역할)에만 집중한다
  • 관심사의 분리 : 객체의 생성과 연결은 AppConfig가 담당한다
    • 객체를 생성하고 연결하는 역할과 실행하는 역할이 명확히 분리되었다.

✅ 좋은 객체 지향 설계의 5가지 원칙

SRP 단일 책임 원칙

  • 구현 객체를 생성하고 연결하는 책임은 AppConfig가 담당
  • 클라이언트 객체는 실행하는 책임만 담당

DIP 의존관계 역전 원칙

  • 클라이언트 코드가 추상화 인터페이스만 의존하도록 코드 변경
  • AppConfig가 클라이언트 코드에 의존관계 주입

OCP 개방 폐쇄 원칙

  • 다형성을 사용하고 클라이언트가 DIP를 지킴
  • 애플리케이션을 사용 영역과 구성 영역으로 나눔
  • 소프트웨어 요소를 새롭게 확장해도 사용 영역의 변경은 닫혀 있다

✅ IoC , DI , 컨테이너

제어의 역전

  • 이전에는 클라이언트 구현 객체가 스스로 필요한 서버 구현 객체를 생성하고, 연결하고, 실행했다. 구현 객체가 프로그램의 제어 흐름을 스스로 조종했다
  • 5가지 원칙을 지키고 난 후, 프로그램에 대한 제어 흐름에 대한 권한은 모두 AppConfig가 가지고 있다
  • 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것을 제어의 역전이라 한다.

프레임워크 vs 라이브러리

  • 프레임워크 : 내가 작성한 코드를 제어하고 대신 실행하면 그것은 프레임워크가 맞다 (예시: Junit)
  • 라이브러리 : 내가 작성한 코드가 직접 제어의 흐름을 담당한다면 그것은 라이브러리다. (예시: main 메소드)

DI ; 의존관계 주입

  • 애플리케이션 실행 시점(런타임)에 외부에서 실제 구현 객체를 생성하고 클라이언트에 전달해서 클라이언트와 서버의 실제 의존관계가 연결되는 것을 의존관계 주입이라 한다.
  • 객체 인스턴스를 생성하고, 그 참조값을 전달해서 연결된다
  • 의존관계 주입을 사용하면 클라이언트 코드를 변경하지 않고, 클라이언트가 호출하는 대상의 타입 인스턴스를 변경할 수 있다 (AppConfig에서 변경가능)

'Spring' 카테고리의 다른 글

6. 의존관계 자동주입  (0) 2025.01.28
5. 컴포넌트 스캔  (0) 2025.01.28
4. 싱글톤 컨테이너  (0) 2025.01.28
3. 스프링으로 전환하기  (0) 2024.11.02
1. 문자 발송 서비스 설계 및 구현  (3) 2024.10.31
'Spring' 카테고리의 다른 글
  • 5. 컴포넌트 스캔
  • 4. 싱글톤 컨테이너
  • 3. 스프링으로 전환하기
  • 1. 문자 발송 서비스 설계 및 구현
꾸준히 기록하는 지수
꾸준히 기록하는 지수
서비스 백엔드 개발자가 되기 위해 제 경험들을 하나씩 기록해봅니다
  • 꾸준히 기록하는 지수
    지수블로그
    꾸준히 기록하는 지수
  • 전체
    오늘
    어제
    • 분류 전체보기 (37)
      • Spring (15)
      • JAVA (9)
      • 클라우드_인프라 (4)
      • Data (5)
      • CS (3)
      • 돌아보기 (0)
      • 취업준비 (1)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    SpringCloudGateway
    트러블슈팅
    Spring
    DASP합격후기
    DAsP
    자격증
    궁금증
    스프링부트
    AWS
    스프링트랜잭션
    스프링클라우드
    데이터아키텍처준전문가
    트랜잭션
    DASP합격
    MSA
    트랜잭션전파
    스프링테스트
    스프링
    DASP후기
    SCG
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
꾸준히 기록하는 지수
2. OCP, DIP 위반 해결방법
상단으로

티스토리툴바