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를 준수할 수 있다.