SOLID 원칙이란 무엇일까?
SOLID는 5가지 원칙에서 하나의 글자씩만 따와서 만든 글자이다.
SOLID원칙을 지키면서 코딩을 하게 되면 객체지향을 목표로 하는 프로그램을 잘 구성하여 만들 수 있다.Spring이 어느정도 잘 도와줄 것이니 걱정 말자!
S부터 하나씩 살펴보겠다.
S는 Single responsiabilty principle의 약자로 단일 책임의 원칙이다.
이 원칙은 하나의 메서도 혹은 클래스는 하나의 책임만을 가져야 한다는 의미이다. 이 말은 약간 모호할 수 있는데 어디까지가 하나의 책임이고 어디까지가 책임이 아닌지는 설계할 때 잘 설정해야한다. 시골의 고수 개발자님이 말씀해주시길 실력이 좋을 수록 책임의 범위를 잘 설정할 수 있다 하셨다.
치킨집을 예를 들면 치킨집이 잘된다면 알바생은 치킨을 튀기는 역할만 맡을 것이다. 하지만 치킨집이 잘 안된다면 주문을 받는 역할까지 할 수도 있는 것이다. 즉 하나의 책임을 상황에 따라(치킨을 튀기는 책임)과 (치킨집을 관리하는 책임)으로 바뀔 수 있다는 것이다.
O는 Open closed principle의 약자로 개방-폐쇄의 원칙이다.
이 원칙은 확장에는 열려있으나 변경에는 닫혀 있어야 한다는 의미이다. 이 말은 처음들으면 무슨 개똥같은 소리지 라고 생각 할 수 있지만 조금 만 더 공부해보면 꽤나 이해할 수 있다. 자바에서 보면 우리는 Interface를 만들고 class를 통해 구현체를 만든다. 즉 Interface의 변경은 닫게하되 class라는 구현체를 만들어서 확장하라는 의미이다.
자동차를 예를 들면 우리는 Sonata, Martiz, Carnival 를 운전하기 위해선 운전하는 방법이 필요하지 Sonata나 Martiz에 대해 자세히 알 필요가 없는 것이다. 운전면허(Interface)만 잘 가지고 있으면 어느 차(Class구현체)를 몰던 문제 없이 빠르게 변경할 수 있다는 장점이 있다.
L은 Liskov substitution principle의 약자로 리스코프 치환 원칙이다.
이 원칙은 다형성을 잘 지키기 위해 하위 클래스가 인터페이스가 설정한 약속을 잘 지켜줘야 한다는 의미이다. 이것은 생각보다 간단하다.
또 자동차로 예를 들자면 만약에 break()라는 함수가 인터페이스에 있으면 하위 클래스에서는 자동차가 멈추는 기능을 잘 구현해야 하는 것이고 excel() 라는 함수가 있으면(후진은 따로있다는 가정) 앞으로 가야하는 기능을 하위클래스에서 알맞게 구현 해야한다는 의미이다.
I는 Interface segregation principle의 약자로 인터페이스 분리 원칙이다.
이 원칙은 기능별로 잘 나누어 인터페이스를 여러개로 구성해야한다는 의미이다. 즉 여러가지의 기능이 담겨있는 하나의 인터페이스보다 여러가지 기능이 잘나누어져 여러가지 인터페이스에 잘 들어가 있는게 더 잘된 설계라는 의미이다.
또또 자동차로 예를 들자면 만약 자동차 와이퍼 점검, 타이어 점검, 워셔액 점검, 엔진점검, 액셀, 브레이크, 후진 등 이러한 기능들이 있다면 자동차 수리라는 인터페이스와 자동차 주행이라는 인터페이스로 나누어 만들면 되는 것이다!
D는 Dependency inversion principle의 약자로 의존관계 역전 원칙이다.
이 원칙은 추상화에 의존해야지 구현체에 의존하지 말아야 한다는 의미이다. 이것은 하나의 객체를 생성할 때 그 객체가 추상화(Interface)에 의존해야지 구현체(Class)에 의존하면 안된다는 말이다. 왜냐하면 코드를 확장하게 되는 일(OCP원칙과 관련있음)이 있으면 추상화로 만들어진 모든 객체의 값을 바꿔줘야한다. 하지만 Interface에 의존하고 있다면 관리 Class인 AppConfig에서 바꿔주면 된다.
예를들어 연극을 하게되면 연극은 대본(Inteface)에 의지를 해야지 배우(Class구현체)에 의지를 하면 안된다. 배우가 바뀐다고 해서 연극자체 내용이 바뀌는 것이 아니기 때문이다.차도 마찬가지이다 차(Class구현체)가 바뀌든 말든 우리는 차를모는 방법인 면허증(Interface)에만 의존하면 되는 것이다.