해당 포스트는 <김영한>님의 인프런 강의 '스프링 핵심 원리 - 기본편'을 토대로 공부한 내용을 정리하였습니다.
(!) 강의 자료에서 캡쳐한 이미지는 출처를 기재하였습니다.
이번 포스트에서는 객체 지향 프로그래밍의 중요한 개념인 "SOLID 원칙"에 대해 공부한 내용을 정리해보았다.
‘클린코드’의 저자 로버트 마틴(Robert Martin)이 정의한 좋은 객체 지향 설계의 5가지 원칙
이미지 출처 : https://search.shopping.naver.com/book
(!) 문제점
객체 지향의 핵심은 다형성이지만 다형성 만으로는 구현 객체를 변경할 때 클라이언트 코드도 변경해야 상황이 발생. 즉, 다형성 만으로는 OCP, DIP를 지킬 수 없음
앞서 다뤘던 SOLID 원칙에서 다형성의 한계로 인한 OCP, DIP 원칙이 위반되는 문제점이 있었다. 바로 이 문제점의 해결책은 Spring이다.
Spring에서는 DI(Dependency Injection, 의존성 또는 의존관계 주입)와 DI Container를 제공한다.
이 기술로 다형성과 OCP, DIP를 가능케 하여 클라이언트 코드 변경 없이 기능을 확장할 수 있다.
옛날 어떤 개발자가 좋은 객체 지향 개발을 하기 위해 OCP, DIP 원칙을 지키며 개발을 해보니 해야 할 일이 너무 많았다. 그래서 spring 프레임워크가 만들어 졌다고 한다. 더 정확하게는 DI Container 라는 개념이 탄생하게 된 것이다.
정리하자면 가장 중요한 핵심은 “모든 설계에 역할과 구현을 분리”. 이상적으로는 모든 설계에 인터페이스를 부여를 하는 것이다. 하지만 모든 설계에 인터페이스를 도입(무분별하게 남발)하게 되면 추상화라는 비용이 발생한다. 직접 구현한 개발자가 아닌 다른 개발자는 추상화된 구현 클래스에 대해 알기가 어렵다. 그래서 코드를 일일이 타고 들어가 파악을 해야 하는 비용이 발생한다는 의미이다. 코드가 추상화 됨으로써 장점만 있는 것이 아니라 단점도 존재한다.
강의에서 김영한님은 “장점이 단점을 넘어설 때 선택해야 한다.” 라는 명언을 남기셨다.
기능을 확장할 가능성이 없다면 구체 클래스를 바로 직접 사용하고, 이후 확장이 필요한 상황이 발생한다면 그 때 리팩토링 하여 인터페이스를 도입하는 것도 방법이다.