객체 지향 설계 원칙 : '응집도 높이고 결합도 줄이자' 이것을 객체 지향 관점에서 재정의한 것.
"어떤 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 한다."
역할과 책임에 따라 클래스, 속성, 메서드, 패키지, 모듈, 컴포넌트, 프레임워크 등을 쪼개자.
-> 데이터베이스의 정규화와 비슷.
-> 객체 지향 4대 특성 중 추상화와 관계가 깊다.
"자신의 확장에는 열려있고, 주변의 변화에 대해서는 닫혀 있어야 한다."
-> JDBC
JDBC
를 사용하는 클라이언트는 데이터베이스가 오라클
에서 mysql
로 바뀌더라도 커넥션을 설정하는 부분 외에는 따로 수정할 필요가 없다.-> JVM
JVM
은 확장에 열려 있는 구조다.-> myBatis
, 하이버네이트
등등 데이터베이스 프로그래밍 지원하는 라이브러리와 프레임워크에서도 볼 수 있음.
"하위 클래스의 인스턴스는 상위형 객체 참조 변수에 대입해 상위 클래스의 인스턴스 역할을 하는데 문제가 없어야 한다."
"서브 타입은 언제나 자신의 기반 타입으로 교체할 수 있어야 한다."
ex. 고래가 포유류 또는 동물의 역할을 하는 것은 전혀 문제가 되지 않는다.
"클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안된다."
클래스를 쪼개기보다는 인터페이스를 나눠서 제한.
즉, 단일 책임 원칙(SRP)과 인터페이스 분할 원칙(ISP)은 같은 문제에 대한 두가지 다른 해결책이다.
둘 중 하나를 선택해서 설계할 수 있는데 특별한 경우가 아니라면 단일 책임 원칙을 적용하는 것이 더 좋은 해결책이다.
" 추상화된 것은 구체적인 것에 의존하면 안된다. 구체적인 것이 추상화된 것에 의존해야한다."
-> 자신보다 변하기 쉬운 것에 의존하지 마라.
상위 클래스일수록, 인터페이스일수록, 추상 클래스일수록 변하지 않을 가능성이 높다. 따라서 이를 의존하라.(OCP와 밀접한 관련이 있다.)
-> 대표 사례 : JDBC.
SOLID와 밀접한 것 : SoC 관심사의 분리.
관심이 같은 것끼리는 하나의 객체 안으로 또는 친한 객체로 모으고,
관심이 다른 것은 가능한 한 따로 떨어져 서로 영향을 주지 않도록 분리하라.
하나의 속성, 하나의 메서드, 하나의 클래스, 하나의 모듈, 또는 하나의 패키지에는 하나의 관심사만 들어 있어야 한다!
SOLID원칙을 적용하면 소스 파일의 개수는 더 많아지겠으나 이렇게 많아진 파일이 논리를 더욱 잘 분할하고, 이해하기 쉽고, 개발하기 쉽고, 유지보수하기 쉬워진다.
스프링 입문을 위한 자바 객체 지향의 원리와 이해