August 25, 2022
다형성이란 프로그램 언어 각 요소들(상수, 변수, 식, 객체, 메소드 등)이 다양한 자료 형(type)에 속하는 것이 허가되는 성질을 가르킨다.
즉 다형성이란 하나의 타입에 여러 객체를 대입할 수 있는 성질이라고 이해하면 된다. 따라서 다형성을 활용하면 기능을 확장하거나, 객체를 변경해야할 때 타입의 변경 없이 객체 주입만으로 수정이 일어나게 할 수 있다.
다형성을 효과적으로 활용하기 위해서, 역할과 구현을 확실하게 분리하는 것이 필요하다.
여기서 역할은 인터페이스이고, 구현은 해당 인터페이스를 구현한 클래스 또는 객체 인스턴스이다.
스프링은 다형성을 극대화해서 이용할 수 있게 도와준다. 스프링에서 제공하는 제어의 역전(IoC), 의존관계 주입(DI)는 다형성을 활용해서 역활과 구현을 편리하게 다룰 수 있도록 지원한다.
SOLID 5원칙은 클린코드로 유명한 로버트 마틴이 좋은 객체 지향 설계의 5가지 원칙을 정리한 것이다.
하지만 다음과 같은 예시를 보면, 분명 다형성을 이용하여 구현체를 바꿨지만, 클라이언트 코드를 변경하게 된다.
public class MemberService{
// private MemberRepository memberRepository = new MemoryMemberRepository();
private MemberRepository memberRepository = new JdbcMemberRepository();
}
따라서 이와 같은 문제점을 해결해주기 위해 나타난 것이, Spring Continaer이다.
위에서 사용했던 예시도 마찬가지로 DIP도 위반하는 예시이다.
public class MemberService{
// private MemberRepository memberRepository = new MemoryMemberRepository();
private MemberRepository memberRepository = new JdbcMemberRepository();
}
보면 memberRepository는 결국 jdbcMemberRepository라는 구현체에 의존하고 있으므로, DIP에 위반이다.