• 스프링은 자바 언어 기반의 프레임워크
• 자바 언어의 가장 큰 특징 - 객체 지향 언어
• 스프링은 객체 지향 언어가 가진 강력한 특징을 살려내는 프레임워크
• 스프링은 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크
• 추상화 - 인터페이스
• 캡슐화 - 생성자 getter setter
• 상속
• 다형성
객체지향이란 레고조립하듯이 컴퓨터 부품조립하듯이 유연하게 구현 인스턷스를 교체할수있는것
객체 설계시 역할(인터페이스)을 먼저 부여하고, 그 역할을 수행하는 구현 객체 만들기
어떤 클레스에서 다른 구현체를 사용할때 그 구현 클레스에도 의존하면 안되고 생성된 인터페이스에도 의존하면 안된다.
오직 인터페이스만 장착해야한다. 이때 결국 이 클레스는 어떻게 실체 인스턴스를 받느냐?
이 사용클레스와 사용될 기능이 구현된 클레스들을 조립해주는 녀석이 따로 있으면 되는것이다.
public class OrderServiceImpl implements OrderService{
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
OrderServiceImpl
은 어떤 할인 정책을 써야한다. 그종류가 어려가지 이겠지만 지금 어떤것을 쓸지 알지 못해야한다.
즉 DiscountPolicy
인터페이스로 구현된 어떤 클레스가 들어오는지 그 인스턴스도 몰라야한다.
그럼 OrderServiceImpl
는 작동을 결국 어떻게 하느냐
OrderServiceImpl
와 DiscountPolicy
들중 무엇을 연결할지 총괄해주고 연결해주는 기능을 가진 클레스가 있으면 되는것이다.
이것을 해주는것이 스프링의 본질
스프링에서 이야기하는 제어의 역전(IoC), 의존관계 주입(DI)은 다형성을 활용해서 역할과 구현을 편리하게 다룰 수 있도록 지원한다.
• SRP: 단일 책임 원칙(single responsibility principle)
• OCP: 개방-폐쇄 원칙 (Open/closed principle)
• LSP: 리스코프 치환 원칙 (Liskov substitution principle)
• ISP: 인터페이스 분리 원칙 (Interface segregation principle)
• DIP: 의존관계 역전 원칙 (Dependency inversion principle)
한 클래스는 하나의 책임만 가져야 한다. 기준이 모호하지만
중요한 기준은 변경이다. 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 잘 따른 것
위의 다형성을 참고하자 저것이 가장 핵심
인터페이스로 구현된 클레스들은 명확히 인터페이스의 모든 규약을 지켜야하는것 그래야지 모든 구현 클레스에 대해 믿고 OCP를 사용할 수 있다.
• 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다
• 자동차 인터페이스 -> 운전 인터페이스, 정비 인터페이스로 분리
• 사용자 클라이언트 -> 운전자 클라이언트, 정비사 클라이언트로 분리
• 분리하면 정비 인터페이스 자체가 변해도 운전자 클라이언트에 영향을 주지 않음
프로그래머는 “추상화에 의존해야지, 구체화에 의존하면 안된다.” 의존성 주입은 이 원칙을 따르는 방법 중 하나다.
쉽게 이야기해서 구현 클래스에 의존하지 말고, 인터페이스에 의존하라는 뜻
다형성을 잘지켜라 하는것