Spring 과 객체지향(SOLID)
SOLID란 Clean Code로 유명한 Robert Martin이 정리한 좋은 객체지향 설계의 5가지 원칙이다.
- SRP : 단일 책임 원칙 (Single Reponsiblility Principle)
- OCP : 개방-폐쇄 원칙 (Open/Closed Principle)
- LSP : 리스코프 치환 원칙 (Liskov substitution principle)
- ISP : 인터페이스 분리 원칙 (Interface Segregation Principle)
- DIP : 의존관계 역전 원칙 (Dependency Inversion Principle)
SRP 단일 책임 원칙
(Single Reponsiblility Principle)
- 한 클래스는 하나의 책임만 가져아 한다.
하나의 책임이라는 것의 범위가 모호하기 때문에 그 기준을 변경으로 생각하자.
변경의 대한 파급효과가 최대한 적게 하도록 하는 것이 이 원칙을 잘 따르는 것이다.
OCP 개방-폐쇄 원칙
(Open/Closed Principle)
- 기능 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
다형성을 활용하여 인터페이스를 통해 구현한 새로운 클래스를 통해 기능을 추가한다.
LSP 리스코프 치환 원칙
(Liskov substitution principle)
- 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀수 있어야 한다.
기능적인 보장을 의미하는 원칙이다. 예를 들어서 자전거 인터페이스의 브레이크 경우 속도가 줄어드는 기능으로 약속이 되어 있는데 이것을 속도가 유지되거나 늘어나게 구현 하면 안된다는 것이다.
ISP 인터페이스 분리 원칙
(Interface Segregation Principle)
- 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
즉 하나의 일반적인 인터페이스보다는 여러개로 기능적으로 분리되어 있는 인터페이스가 좋다라는 의미이다.
DIP 의존관계 역전 원칙
(Dependency Inversion Principle)
- 프로그래머는 "추상화에 의존해야지, 구체화에 의존하면 안된다" 의존성 주입은 이 원칙을 따르는 방법 중 하나다.
구현 클래스에 의존하는 것이 아닌, 인터페이스에 의존하라 라는 의미
위의 5가지 원칙을 객체지향의 핵심인 다형성으로만 원칙을 해결하려고 하면
OCP 개방-폐쇄 원칙 / DIP 의존관계 역전 원칙에서 아래와 같은 문제가 발생한다.
1
2
3
|
public class Car {
private Engine engine = new EngineA();
}
|
cs |
A사의 엔진을 사용하는 Car Class에서 B사의 엔진으로 교체하려고 하면 아래와 같이 코드가 변경되어야 한다. (OCP 위반)
또한 클라이언트인 Car Class가 직접 B사의 구현 클래스를 선택하며 의존한다.(DIP 위반)
1
2
3
4
|
public class Car {
// private Engine engine = new EngineA();
private Engine engine = new EngineB();
}
|
cs |
스프링은 DI(Denpendency Injection)기능, DI 컨테이너를 제공함으로써 다형성으로만은 해결 할 수 없는 OCP, DIP위반 문제를 해결해준다.
#Reference
스프링 핵심 원리 - 기본편 (김영한)
위키피디아 - SOLID
ko.wikipedia.org/wiki/SOLIDko.wikipedia.org/wiki/SOLIDko.wikipedia.org/wiki/SOLID_(%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%EC%84%A4%EA%B3%84)