[Spring] Dependency Injection & IoC 톺아보기(2) - 강한결합 & 약한결합
앞서 살펴본 의존성에 관련해서 알아야 할 개념이 있는데, 객체 간의 결합도다.
강한 결합과 약한결합으로 나뉘는데, 먼저 강한결합에 대해 알아보겠다.
1. 강한 결합
하나의 객체가 다른 객체에 대해 직접적으로 의존하고 있는 상태를 의미한다. 이 경우, 하나의 객체를 수정하거나, 다른 객체를 추가하려고해도, 직접적으로 의존하고 있기 때문에 변경과 추가가 쉽지 않다. 이 것을 회피해서 추가하거나 수정하다보면 코드의 복잡도가 올라가고 결과적으로 유지보수의 지옥을 펼치는 원인이 된다.
물론 강한 결합이 나쁜점만 있는것은 아니다. 코드의 구현이 간단하고 직관적이고 객체 간의 연결이 명확하게 보이므로 코드를 이해하기 쉽다. => 초소규모 프로젝트의 경우엔 경우에 따라 강한 결합을 사용하기도 한다. 예시를 들어 설명하면 아래의 그림이 적절할것 같다.
Shrimp Patty를 추가하려고해도 FranchiseHamberger와 의존관계인 MeatPatty, Lettuce 클래스가 직접적으로 의존하고 있어 추가가 쉽지 않다. 이 상태를 강한 결합이라고 볼 수 있다.
2. 약한 결합
약한 결합은 객체가 서로 간접적으로 의존하도록 설계되어있는 상태를 의미하는데, 이 경우 객체들은 인터페이스를 통해 서로 통신하게 된다. 징검다리 역할을 하는 인터페이스를 통해 객체들은 서로 독립적으로 존재할 수 있으며, 하나의 객체를 수정해도 다른 객체는 영향을 받지 않는다. 이는 코드의 유연성을 높이고 유지보수를 용이하게 만든다. 예시를 추가해 조금 더 쉽게 알아보자. 다음 사진은 약한 결합을 보여주는 구조다.
Patty라는 interface를 통해서 햄버거 클래스와 MeatPatty, ShrimpPatty가 간접적으로 의존하고 있다. 이렇게 일반적으로 약한 결합을 사용하는것을 권장한다.