스프링 프레임워크를 쉽게 사용할 수 있도록 지원
유연하고, 변경이 용이하다 -> 다형성
다형성이 왜 중요한가?
역할 - 구현
클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있다
변경이 있을 때 하나의 클래스 / 하나의 지점만 고치면 됨
확장에는 열려있으나, 변경에는 닫혀 있어야 함
구현 객체를 변경하려면 > 클라이언트 코드를 변경해야 함
특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나 보다 낫다
역할에 의존하게 해야 한다 > 구현체
e.g. 로미오 역할을 맡은 배우는 줄리엣 역할(역할)에 의존해야지, 줄리엣 역을 하는 배우(구현)에 의존하면 안된다!
구현 클래스를 직접 선택
다형성 만으로는 앞서 나온 OCP, DIP 규칙에 위반됨
MemberService는 구현체를 바꾸려할 때 코드를 변경해야 함.
추상화 인터페이스에 의존 & 구현체에도 동시에 의존하고 있음.
OCP -> 변경에 닫혀 있어야 하나, 구현체를 변경할 때 코드를 수정해야 함
DIP -> 역할(인터페이스)에만 의존해야 하나, 동시에 구현체에도 의존하고 있음 (MemoryMemberRepository, JdbcMemberRepository)
! 다형성만으로는 구현 객체를 변경할 때 클라이언트 코드를 변경해야 함
! 다형성만으로는 OCP, DIP를 지킬 수 없음
=> 뭔가 더 필요하다.