지난 포스트까지 개발한 프로그램을 좋은 객체 지향 설계의 5가지 원칙 (SOLID)의 관점에서 보자면,
단일 책임 원칙(SRP), 의존관계 역전 원칙(DIP), 개방-폐쇄 원칙(OCP)를 적용할 수 있다.
https://debuggingworld.tistory.com/80
3. 좋은 객체 지향 설계의 5가지 원칙 (SOLID)
지난 포스트에서 좋은 객체 지향 프로그래밍이란 프로그램의 유연한 변경이 가능하도록 하여 개발 생산성을 높이는 것이라 하였다. 그리고 이것을 위해서는 객체 지향의 다형성을 극대화하고,
debuggingworld.tistory.com
단일 책임 원칙 - SRP
하나의 클래스는 하나의 책임만 가져야 한다.
AppConfig 추가 이전까지, 클라이언트 객체는 직접 구현 객체를 생성 및 연결하고 자신의 로직을 실행하는 등 다양한 책임을 가지고 있었다.
이는 SRP (단일 책임 원칙)을 위반한 것으로, SRP를 준수하기 위해 관심사를 분리하였다.
https://debuggingworld.tistory.com/92
14. 관심사의 분리
지난 포스트에서 발생한 문제를 해결하기 위해, 외부에서 구현 객체를 생성하고 OrderServiceImpl과 같은 클라이언트에게 이를 주입해주는 역할의 필요성을 얘기하였다. https://debuggingworld.tistory.com/91
debuggingworld.tistory.com
그 결과로 객체를 생성하고 연결하는 책임은 AppConfig가 담당하게 되었고, 클라이언트 객체는 자신의 로직을 실행하는 책임만 담당하게 되었다.
의존관계 역전 원칙 - DIP
프로그램은 구현이 아닌 추상화에 의존해야 한다.
기존에는 새로운 할인 정책(RateDiscountPolicy)을 개발하고 적용하려면 클라이언트 코드(OrderServiceImpl)도 변경해야 했다.
이는 클라이언트 코드가 할인 정책의 인터페이스(DiscountPolicy)가 아닌 구현에도 의존했기 때문이다. (FixDiscountPolicy -> RateDiscountPolicy)
그래서 클라이언트 코드가 추상화에만 의존하도록 코드 변경을 시도했으나, 당연히 클라이언트 코드는 인터페이스만으론 아무것도 실행할 수 없었다.
따라서 클라이언트 코드가 생성자를 통해 의존성을(구현 객체를) 주입받도록 하고, AppConfig가 이를 주입해주도록 코드를 변경해서 문제를 해결하였다.
여기에 사용된 의존성 주입이 이 원칙을 따르는 방법 중 하나다.
개방-폐쇄 원칙 - OCP
소프트웨어 요소는 확장에는 열려 있고, 변경에는 닫혀 있어야 한다.
소프트웨어를 AppConfig가 존재하는 구성 영역과 클라이언트 코드가 있는 사용 영역으로 나누었다.
소프트웨어에 확장이 발생해도(새로운 할인 정책 개발, RateDiscountPolicy의 추가), 구성 영역의 AppConfig가 의존관계를 FixDiscountPolicy에서 RateDiscountPolicy로 변경하여 주입하므로 클라이언트 코드에는 변경이 일어나지 않는다.
즉, 소프트웨어 요소를 새롭게 확장해도 사용 영역의 변경을 닫혀있다.
좋은 객체 지향 설계의 5가치 원칙, 즉 SOLID는 말 그대로 좋은 객체 지향 설계를 위해 합의된 원칙이다.
사실 객체 지향적으로 설계된 프로그램은 기존 절차 지향 프로그램보다 실행 속도가 비교적 느리다.
그럼에도 객체 지향 프로그래밍이 많은 선택을 받는 이유는 그 생산성 때문이다.
객체 지향 프로그래밍은 프로그램을 개발하기 쉽고, 유지보수에 용이하게 만들어준다.
그러한 특성은 프로젝트 규모를 키우고, 더 많은 사람과의 협업을 가능하게 한다.
그러므로, 프로그램을 개발할 때 이러한 원칙을 늘 고려하는 것이 여러모로 도움이 될 것이다.
'[inflearn] 스프링 핵심 원리 - 기본편 > 섹션 3 - 객체 지향 원리 적용' 카테고리의 다른 글
19. 스프링으로의 전환 (0) | 2023.10.25 |
---|---|
18. IoC, DI, 그리고 컨테이너 (0) | 2023.10.25 |
16. 새로운 구조와 할인정책 적용, 전체 흐름 정리 (0) | 2023.10.24 |
15. AppConfig 리팩터링 (0) | 2023.10.14 |
14. 관심사의 분리 (0) | 2023.10.13 |