스프링은 자바 기반의 프레임워크
=> 자바의 가장 큰 특징은 객체 지향 언어
=> 스프링은 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크
객체 지향 프로그래밍이란 프로그램을 유연하고 변경이 용이하게 만드는 것
=> 다형성을 가지는 것
>> 객체를 설계할 때 역할과 구현을 명확히 분리하라 !!!
객체 설계시 역할(인터페이스)을 먼저 부여하고, 그 역할을 수행하는 구현 객체 만들기
다형성으로 인터페이스를 구현한 객체를 오버라이딩을 이용하여 실행 시점에 유연하게 변경할 수 있다.
클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있다.
- SRP: 단일 책임 원칙(single responsibility principle)
- OCP: 개방-폐쇄 원칙 (Open/closed principle)
- LSP: 리스코프 치환 원칙 (Liskov substitution principle)
- ISP: 인터페이스 분리 원칙 (Interface segregation principle)
- DIP: 의존관계 역전 원칙 (Dependency inversion principle)
객체 지향의 핵심은 다형성
다형성 만으로는 쉽게 부품을 갈아 끼우듯이 개발할 수 없다.
다형성 만으로는 구현 객체를 변경할 때 클라이언트 코드도 함께 변경된다.
다형성 만으로는 OCP, DIP를 지킬 수 없다.
public class MemberService {
private MemberRepository memberRepository = new MemoryMemberRepository();
}
// 다른 구현체로 갈아끼우는 경우
//private MemberRepository memberRepository = new MemoryMemberRepository();
private MemberRepository memberRepository = new JdbcMemberRepository();
위 코드는 MemberRepository 인터페이스를 설계한 후 새로운 구현체로 바꾸는 작업이다. MemberService는 클라이언트 코드인데 아래의 경우 구현체를 갈아 끼울 때, 즉 확장을 할 때 클라이언트의 코드를 변경해야하므로 OCP를 위반한다.
또한 memberRepository는 MemberRepository라는 인터페이스에 의존하지만, 동시에 구현체에도 의존하므로 DIP를 위반한다.
DI(Dependency Injection)
: 의존관계, 의존성 주입
스프링은 다음 기술로 다형성 + OCP, DIP를 가능하게 지원
DI 컨테이너
제공
클라이언트 코드의 변경 없이 기능 확장 쉽게 부품을 교체하듯이 개발