[Spring] 3-4. 전체 흐름 정리와 SOLID 원칙의 적용

송광호·2023년 12월 13일

[Spring]

목록 보기
14/41
post-thumbnail

Spring 시리즈는 혼자 공부하며 기록으로 남기고, 만약 잘못 학습 한 지식이 있다면 공유하며 피드백을 받고자 작성합니다.
스프링에 대해 깊게 공부해보고자 인프런의 김영한 강사님께서 강의를 진행하시는 (스프링 핵심 원리 - 기본편) 강의를 수강하며 정리하는 글입니다.
혹여나 글을 읽으시며 잘못 설명된 부분이 있다면 지적 부탁드리겠습니다.


지금까지 전체 흐름 정리

새로운 할인 정책 개발

  • 다형성 덕분에 새로운 정률 할인 정책 코드를 추가로 개발하는 것 자체는 문제가 없이 작성되었다.

새로운 할인 정책 적용과 문제점

  • 새로운 할인 정책을 적용하려고 하니 사용 영역클라이언트 코드인 주문 서비스 구현체도 함께 변경을 해야했다.
  • 주문 서비스 클라이언트가 인터페이스인 DisCountPolicy뿐만 아니라 구체 클래스인 FixDiscountPolicy도 함께 의존하고 있었기 때문이다. -> DIP 위반

관심사의 분리

  • 기존에는 클라이언트가 의존하는 서버 구현 객체를 직접 생성하고, 실행한다.
  • 공연으로 분리하면 남자 주인공 배우가 공연도 하고, 여자 주인공 배우도 직접 섭외하는 다양한 책임을 가지는 것과 같다.
  • AppConfig(공연 기획자)의 등장
  • AppConfig는 애플리케이션의 전체 동작 방식을 구성하기 위해, 구현 객체를 생성하고, 연결하는 책임을 가지고있다.

AppConfig 리팩터링

  • 구성정보에서 역할과 구현을 명확하게 분리한다.
  • new MemoryMemberRepository 중복코드를 제거하였다.

새로운 구조와 할인 정책 적용

  • AppConfig의 등장으로 애플리케이션이 크게 사용 영역과, 객체를 생성하고 구성(Configuration)하는 영역으로 분리되었다.
  • 새로운 할인정책 변경으로 인한 클라이언트 코드의 변경이 없어졌다.

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

  • 여기서는 SRP, DIP, OCP가 적용되었다.

SRP 단일 책임 원칙

한 클래스는 하나의 책임만 가져야 한다.

  • 클라이언트 객체가 직접 구현을 생성하고, 연결하고, 실행하는 다양한 책임을 가지고 있었다.
  • SRP 원칙을 따르기 위해 관심사를 분리했다.
  • 구현 객체의 생성과 연결은 AppConfig가 담당하도록 한다.

DIP 의존관계 역전 원칙

프로그래머는 "추상화에 의존해야지, 구체화에 의존하면 안된다." 의존성 주입은 이원칙을 따르는 방법 중 하나다.

  • 새로운 할인 정책을 개발하고 적용하려고 하니 클라이언트 코드가 함께 변경되었다.
  • 기존의 코드는 추상화에만 의존하는 줄 알았지만 구현체에도 의존하고 있었기 때문이다.
  • 클라이언트 코드가 DisCountPolicy추상화 인터페이스에만 의존하도록 코드를 변경하였는데?
    • 이대로 실행하니 NPE가 발생!
  • AppConfig가 FixDiscountPolicy구현체를 클라이언트 코드 대신 생성해서 클라이언트 코드에 의존관계를 주입했다.

OCP 개방-폐쇄 원칙

소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다

  • AppConfig를 이용하여 애플리케이션을 크게 사용 영역과 구성 영역으로 나누었다.
  • AppConfig를 이용하여 의존관계를 FixDiscountPolicy -> RateDiscountPolicy로 변경해서 주입하므로 클라이언트 코드의 변경은 필요하지 않다.
  • 소프트웨어 요소를 새롭게 확장하여도 사용 영역의 변경은 닫혀있다.

0개의 댓글