-
SOLID - SRP, OCP, LSP, ISP, DIPSpring/Spring 2022. 1. 14. 23:34728x90반응형
SOLID
SOLID란 클린 코드로 유명한 로버트 마틴이 좋은 객체 지향 설계의 5가지 원칙을 정했는데 그 원칙들의 앞글자를 가져와 SOLID라 부른다. 이 원칙을 알아야 하는 이유는 시스템의 기능이 확장되거나 변동사항이 있을 때, 객체지향적인 설계가 추구하는 점인 기존의 시스템들이 영향을 받지 않도록 하기 위해서이다.
SOLID의 5대 원칙
SRP 단일 책임 원칙(Single Responsibility Principle)
"어떤 클래스를 변경해야 하는 이유는 오직 하나 뿐이어야 한다." -로버트 C. 마틴
- 하나의 클래스는 단 하나의 책임만 가져야 한다.
- 변경이 있을 때 파급효과가 적으면 단일 책임 원칙을 잘 따른 것이다.
- 객체 간의 응집도를 최대화하고 객체 간의 결합도를 최소화하는 것이 좋은 프로그램이다.
OCP 개방/폐쇄 원칙(Open/Closed Principle)
"소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에 대해서는 열려 있어야 하지만 변경에 대해서는 닫혀 있어야 한다." - 로버트 C. 마틴
- 자신의 확장에는 열려 있고, 주변의 변화에 대해서는 닫혀 있어야 한다.
- 요구사항의 변경이나 추가 상항이 발생하였을 시 기존 구성요소는 수정이 일어나지 말아야 하며, 기존 구성요소를 쉽게 확장해서 재사용할 수 있어야 한다.
- 객체를 생성하고, 연관관계를 맺어주는 별도의 조립, 설정자가 필요하다
- OCP의 예시 - JDBC
자바에서 JDBC를 사용하면 클라이언트는 데이터베이스가 오라클, Mysql, Maria 등 어떤 것이든 Connection 설정 부분을 제외하고 변경할 부분이 없다.
LSP 리스코프 치환 원칙(Liskov Substitution Principle)
"서브 타입은 언제나 자신의 기반 타입(base type)으로 교체할 수 있어야 한다."- 로버트 C. 마틴
- 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
- 즉 Upcating 된 객체 참조 변수가 논리적으로 그 역할을 하는데 문제가 없어야 한다.
김영한 님의 강의에서 들은 적절한 예시
- 자동차가 액셀을 밟았을 시 앞으로가는 기능을 만들었는데 새로 만든 자동차를 엑셀을 밟았을 시 뒤로 가는 기능으로 만들면 안 된다.
ISP 인터페이스 분리 원칙(Interface Segregation Principle)
"클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안 된다." - 로버트 C. 마틴
- 상황과 관련 있는 기능만 제공하는 원칙
- 인터페이스를 통해 메서드를 제공할 때 최소한의 메서드만 제공하는 것
- ISP은 SRP과 같은 원인에 대한 다른 해결책을 제시하는 것이다.
- 인터페이스가 명확해지고, 대체 가능성이 높아진다.
DIP 의존 역전 원칙(Dependency Inversion Principle)
"고차원 모듈은 저 차원 모듈에 의존하면 안 된다. 이 두 모듈 모두 다른 추상화된 것에 의존해야 한다."
"추상화된 것은 구체적인 것에 의존하면 안된다. 구체적인 것이 추상화 된 것에 의존해야 한다."
"자주 변경되는 구체(Concrete) 클래스에 의존하지 마라" - 로버트 C. 마틴
- 의존을 할 때 구체 클래스에 의존하지 않고 인터페이스를 의존하여 영향을 받지 않게 하는 원칙
- 구현체보다는 인터페이스나 추상 클래스에 의존해야 한다.
- OCP 설계 구조와 같다. 이처럼 하나의 설계 원칙 안에 다른 설계 원칙이 녹아져 있다.
- 스프링에서는 DI를 이용하여 클라이언트 코드 변경 없이 기능을 확장할 수 있다.
728x90반응형'Spring > Spring' 카테고리의 다른 글
스프링의 등장 - 순수 자바 코드에서 스프링까지 3 , IoC(제어의 역전)와 Di 그리고 등장하는 스프링 (0) 2022.01.16 스프링의 등장 - 순수 자바 코드에서 스프링까지 2 (0) 2022.01.16 스프링의 등장 - 순수 자바 코드에서 스프링까지 1 (0) 2022.01.15 객체 지향 프로그래밍 (OOP, Object-Oriented Programming) (0) 2022.01.13 Spring (0) 2022.01.13