public class MyService {
MyRepository myRepository; //Service "has a" Repository
public void save() {
myRepository.save();
}
}
상속 관계는 정적인 관계로 컴파일 시간에 모든 관계가 정해지고 변경될 수 없지만 위임 관계는 동적인 관계로 런타임 시간 동안 관계가 변경될 수 있다.
간단한 예시로 save()를 수행할 때 처음에는 myRepository를 MemoryRepository로 쓰다가 어느 순간에 JpaRepository로 교체하여 사용할 수 있다.
또한 다형성을 활용함으로써 두 클래스 간의 결합도가 낮아진다.
myRepository의 구현체를 변경하여도 MyService 입장에서는 실제 구현체가 아닌 그들이 구현하는 인터페이스를 바라보기 때문에 적절한 구현체를 갈아 끼우기만 하면 되기 때문이다.
물론 결합도가 낮아져도 구현체를 바꿔 넣기 위해 코드를 직접 수정해야 한다. 즉 OCP; Open-Close Principle 원칙에 위배된다.
Spring을 쓰면 의존성 주입을 프레임워크가 해주므로 OCP를 준수할 수 있다.