SOLID 객체지향 5대 원칙그냥 매번 달달 외우는식으로 공부를 했었는데, 개발을 진행하며 해당 원리들을 어떻게 지키는지 실습하고나니, 제대로 이해가되어 다시 한 번 정리해보았다.

**Single Responsibility Principle
단일 책임 원칙**
하나의 클래스는 하나의 책임만을 가져야한다.

**Open - Closed Principle
개방 - 폐쇄 원칙**
확장에 열려있어야하고, 변경에 닫혀있어야한다.

이 원칙과 아래에 나올 DIP 원칙이 가장 중요하다고 생각이 든다.
인터페이스 구현 -> 구현체 적용 과 같은 방식으로 개발을하게 되는데, 인터페이스를 잘 구현해 두면 따로 인터페이스 수정 없이 구현체를 바꾸는것으로 다양하게 개발을 할 수 있게 된다. 해당 원칙이 지켜지지 않으면 인터페이스를 계속해서 변경해야하므로 클라이언트 코드를 자주 수정하는일이 벌어진다.

**Liskov Substituion Principle
리스코프 치환 원칙**

상위 객체를 하위 타입의 객체로 바꾸어도, 프로그램의 실행에는 문제가 없어야한다.당연한 소리인것 같다. 결국 하위 타입의 객체를 상위 객체를 상속해 만든 클래스의 객체이기 때문에, 추가적인 메소드가 있을 뿐 상위 클래스의 메소드들도 정상적으로 작동해야하기 때문.

**Interface Segregation Principle
인터페이스 분리 원칙**

하나의 범용 인터페이스보다, 특정 클라이언트를 위한 여러개의 인터페이스가 더 낫다.쉽게 말해서, 하나의 인터페이스가 여러 타입의 기능들을 모두 갖고있어서는 안 된다.

자동차에대한 인터페이스들을 만든다고 생각해보면, 운전 인터페이스 + 정비 인터페이스와 같이 각각의 역할에따라 인터페이스들을 나누는것이 자동차 인터페이스 하나로 사용하는것보다 더 좋다.이렇게 인터페이스들을 따로 나누어 놓게 되면, 사용자를 정비사/운전자와 같이 역할을 분리해서 저장 할 수 있고 이후에 기능이 늘어 코드를 수정해야하는 경우가 생기면, 해당 부분들만 건드리면 되기 때문에 운용도 더 편해진다.
++ 인터페이스의 역할이 명확해지고, 대체 가능성이 높아진다.

**Dependency Inversion Principle
의존관계 역전 원칙**

프로그래머는 추상화에 의존해야하고, 구체화에 의존하면 안 된다.구현체는 언제든지 바뀔 수 있으므로, 해당 구현체를 보고 개발을하면 안 된다. 같은 기능을 하는 구현체들을 보고 개발을 하는것이 아닌, 인터페이스를 기준으로 개발을 진행해야 후에 다른 구현체로 바뀌었을 때에도 정상적으로 동작 할 것이다.다형성만으로는 개방 - 폐쇄 원칙과 의존관계 역전 원칙을 지킬 수 없다.

인터페이스를 만들어두고 구현체를 선택하는방식으로 다형성을 지켜도, 결국 해당 인터페이스를 구현체와 함께 가져다 쓰는 부분에서 코드로 구현체를 지정하기 때문에 해당 원칙들을 지킬 수 없다. 동적으로 컨테이너에서 구현체를 선택하는 방식으로 구현해야 한다.
Spring에서는 AppConfig 클래스와 같이 객체를 생성하고 할당해주는 클래스는 따로 만들어 구현이 가능하다.

출처:

https://tmpfactory.tistory.com/51

[Tempo:티스토리]