좋은 객체 지향 설계의 5가지 원칙(SOLID)
# 인프런 김영한의 스프링 핵심 원리 - 기본편을 개인적으로 정리한 글입니다.
정리
Q. SOLID가 뭐야?

Q. SRP가 뭐야?
- 한 클래스에는 하나의 책임을 가져야 한다.
즉 한 클래스에 Entity, repository, service등의 코드가 집합되어있으면 안된다! 각각 분리해야 한다.
Q. OCP가 뭐야?
- 소프트 웨어의 요소는 확장에는 열려 있으나 변경에는 닫혀있어야 한다.

하지만 일반적으로 JAVA개발을 하게되면 다음과 같이 MemberService의 요구 변경이 있을때, 클라이언트의 코드를 변경해야 하는 상황이 발생한다. == OCP를 위반하게 된다.
Q. 그럼 어떻게 OCP를 위반되지 않게 개발할수 있을까?
AppConfig와 같이 객체를 생성하고, 연관관계를 맺어주는 별도의 설정자를 생성하면서 해결할 수 있다.
Q.LSP가 뭐야?
프로그램의 객체는 프로그램의 정확성을 위반하지 않으면서 하위 타입의 인스턴으로 변경이 가능해야 한다.
ex) 자동차의 악셀을 밟으면 앞으로 가야한다. 라는 기능적 설계가 존재할때,
악셀을 밟았는데 뒤로 가게 되면 기능적 설계를 위반,
즉 프로그램의 정확성을 위반하는 행위가 되므로
느리더라도, 성능이 안나와도 앞으로 가야하는 기능을 구현해야 한다.
Q. ISP가 뭐야?
특정 클라이언트를 위한 다양한 인터페이스가 하나의 범용 인터페이스보다 좋다.
ex) 회사라는 Class에 기획부, 전산정보부, 홍보부, 기술부 등등으로 나누는 것 처럼 Interface도 각 기능에 따라 나눠주는 것이 좋다.
Q. DIP가 뭐야?
추상화에 의존하고 구체화에 의존 하지 않는 원칙
즉 프로그래머는 구현 클래스에 의존하지 말고 인터페이스에 의존하라는 의미.
풀어말해 역할에 의존해야 하지 구현체에 의존하면 변경이 어려워진다.
예를들어, 현빈을 대상으로 하는 드라마를 기획하다가 현빈의 캐스팅이 어려워지면 그 드라마는 방영하기 어렵다.
하지만, 키크고 잘생긴 배우를 대상으로 드라마를 기획하면 현빈이 아리더라도 해당하는 배우가 많이 존재하기 때문에 방영하기 쉽다.
Q.객체 지향의 핵심은 다형성이라며? 다형성만 만족하면 SOLID를 만족할수 있어?
아니다.
다형성 만으로는 OCP, DIP를 지킬수는 없다.
Q. 그렇다면 어떻게 SOLID를 지키면서 개발해?
그래서 스프링을 사용하는거야!
스프링은 다형성과 OCP + DIP를 가능하게 지원한다. == SOLID를 지키면서 개발이 가능하다.
DI 컨테이너를 제공함으로써 의존관게, 의존성을 주입하여 해결시킬수 있다!