-
20221021 TIL 의존성 주입이 왜 제어를 역전하는 방식인가TIL 2022. 10. 21. 21:05
객체 지향을 처음 배우면서 이해가 잘 가지 않았던 개념이 의존성 주입과 제어의 역전이었다.
두 개의 연관 관계가 있다는데 의존성을 주입하는 것까지는 이해가 가도
의존성을 주입하는 것이 왜 제어의 역전인지 이해하기가 힘들었다.
다행히 객체 지향을 공부한지 몇 주가 지난 지금 이해가 조금은 되었다.
개발자로서 가져야 할 기본적인 전제는 변경되지 않는 코드는 없기 때문에 코드는 변경이 쉬워야 한다는 것이다.
객체 지향은 객체들의 협력으로 커다란 시스템을 만들기 때문에 어떤 객체는 다른 객체에 의존하게 된다.
의존한다라는 것은 의존하고 있는 객체의 변경에 영향을 받을 수 있다는 의미이다.
하지만 코드에는 변경이 자주되는 부분이 있고 그렇지 않은 부분이 있다.
변경이 자주 되는 부분은 조금 더 구체적인 부분에 해당한다.
예를 들어 결제를 담당하는 객체가 있을 때 실제 결제하는 방식은 신용카드, 체크 카드, ~~페이, 등 여러 가지가 될 수 있다.
이 때 신용카드를 이용해서 결제를 한다고 할 때 결제를 담당하는 객체에서 신용카드 객체를 이용하여 결제를 할텐데,
결제를 담당하는 객체에서 신용카드 객체를 생성해서 메소드를 호출하는 방식으로 코드를 작성하면
결제 방식에 따라 결제를 담당하는 객체가 계속 증가할 것이다.
하지만 만약에 결제하는 방식에 대한 인터페이스를 만들고, 각 결제하는 방식에서 해당 인터페이스를 구현해두고,
결제를 담당하는 객체가 어떤 결제 방식이든 받아서 사용한다면
결제 방식이 변경되거나 추가되어도 결제를 담당하는 객체는 많은 수정을 하지 않아도 될 것이다.
의존성 주입은 이처럼 객체의 생성은 다른 곳에서 하고, 의존성을 주입받은 객체는 주입받은 객체를 사용만 하게 된다.
의존성 주입에 대한 이해는 많이 어렵지는 않았다.
하지만 의존성 주입이 왜 제어의 역전을 할 수 있게 해준다는 것일까?
일단 제어의 역전이라는 말이 어렵다.
영어로는 inversion of control인데, 기존에 컨트롤하던 방식을 뒤집었다는 말이다.
기존에는 의존하는 객체를 직접 내부에 생성해서 사용하면서 직접 프로그램의 흐름을 제어했다.
즉, 흐름을 주도하는 객체가 세부사항까지 하나하나 다 관여하는 방식으로 코드를 짰던 것이다.
하지만 의존성을 주입하게 되면 세부사항에 대해 아무 것도 모르고, 주어지는 대로 사용하게 될 뿐이다.
따라서 다른 객체에 의해 흐름이 주도된다.
사실 의존성 주입과 제어 역전은 스프링 프레임워크와 자주 관련되어 등장하는 용어들이다.
일반적으로 외부 라이브러리를 쓸 때 라이브러리를 코드에서 가져다가 내가 직접 사용하면서 흐름을 제어하는데,
스프링은 내가 작성한 코드를 스프링이 사용하면서 의존성을 관리해준다.
즉 객체가 관리하는 것이 아닌 객체가 관리받는 방식으로 상황이 바뀐 것이다.
따라서 의존성 주입을 하게되면 제어의 역전이 발생한다.
내가 어려웠던 부분들, 이해가 가지 않았던 부분들을 찾아보는 것에서 그치지 말고
나만의 언어로 최대한 쉽게 풀어써보려는 노력을 하면 훨씬 이해도 잘 되는 것 같다.
어려웠던 개념이 이해가 조금씩 가기 시작했을 때 꼭 글로 남겨두자!
'TIL' 카테고리의 다른 글
20221023 TIL git을 파보다 (0) 2022.10.23 20221022 TIL ide 없는 삶 (0) 2022.10.22 20221020 TIL 멋진 개발자 되기 프로젝트 (0) 2022.10.20 20221019 TIL 왜일까 (0) 2022.10.19 20221018 TIL 반환을 하자!!! (0) 2022.10.18