어떤 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 한다 - 로버트 C . 마틴
클래스를 역할과 책임에 따라 분리하여 하나의 역할과 책임을 줘야한다
소프트웨어 엔티티 ( 클래스, 모듈, 함수 등) 는 확장에 대해서는 열려 있어야 하지만 변경에 대해서는 닫혀 있어야 한다 - 로버트 C . 마틴
자신의 확장에는 열려 있고 , 주변의 변화에 대해서는 닫혀 있어야 한다
서브 타입은 언제나 자신의 기반 타입 ( base type ) 으로 교체할 수 있어야 한다 - 로버트 C . 마틴
객체 지향에서의 상속은 조직도나 계층도가 아닌 분류도가 돼야 한다
하위 클래스 is a kind of 상위 클래스 - 하위 분류는 상위 분류의 한 종류
구현 클래스 is able to 인터페이스 - 구현 분류는 인터페이스할 수 있어야 한다
하위 클래스의 인스턴스는 상위형 객체 참조 변수에 대입해 상위 클래스의 인스턴스 역할을 하는 데에 문제가 없어야 한다
” 인터페이스할 수 있어야 한다 “ 란
클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안 된다 - 로버트 C . 마틴
프로젝트 요구사항이나 설계자의 취향에 따라 SRP 나 ISP 중 하나를 선택할 수 있지만 특별한 경우가 아니라면 SRP 를 적용하는 것이 더 좋은 해결책
클래스에 대해 특정 역할이나 책임에 따라 인터페이스로 분류하여 최소주의 원칙을 지키게 한다
고차원 모듈은 저차원 모듈에 의존하면 안 된다. 이 두 모듈 모두 다른 추상화된 것에 의존해야 한다 추상화된 것은 구체적인 것에 의존하면 안 된다. 구체적인 것이 추상화된 것에 의존해야 한다 자주 변경되는 구체 ( Concrete ) 클래스에 의존하지 마라 - 로버트 C . 마틴
상위 클래스일수록 , 인터페이스일수록 , 추상 클래스일수록 변하지 않을 가능성이 높기에 하위 클래스나 구체 클래스가 아닌 상위 클래스 , 인터페이스 , 추상 클래스를 통해 의존하라는 것이 바로 DIP ( 의존 역전 원칙 ) 이다
SOLID 는 원칙의 집합이다
원칙의 사전적 정의를 찾아보면 어떤 행동이나 이론 따위에서 일관되게 지켜야 하는 기본적인 규칙이나 법칙임을 의미한다.. 자세히 봐보면 이전 글들에서 다뤘던 객체 지향들의 특징들이 조금 더 확장시키고 추상화한 것을 알겠는가..
각 원칙 별로 로버트 C.마틴의 말이 하나씩 적혀 있는데 이는 이 원칙이 존재해야하는 이유를 간단한 문장을 통해 잘 정리했다고 생각해서이다
이번 파트는 사실 엄청 중요한 부분이라고 생각한다 spring 을 배우는 입장에서 굳이 이렇게 해야하는가라던지 의문들에 대해 대답이 되는 시간들이였기 때문이다 이 글을 통해 SOLID 5원칙에 쉽게 접근할 수 있길 바란다