오늘의 5분 개발지식 라디오! 안녕하세요~ 오늘은 dependency injection, 의존성 주입에 대해서 이야기해보려고 합니다.
단어 자체가 직관적이지 않아서 저도 처음에 이해할때 많이 헷갈렸는데요, 의존성 주입이라는 용어에서부터 시작해보겠습니다.
일단 의존성이라는 단어부터 보면 좋을 것 같은데요, 의존성이란 말 그대로 하나의 코드가 다른 코드에 의존하는 상태를 뜻하는데요, 쉽게 말하자면 A라는 코드가 B라는 코드를 사용한다면, A는 B에 의존하고 있다, 혹은 의존성이 있다라고 말할 수 있습니다.
주입이라는 말은 말그대로 “넣어주다”라는 말인데요, 합쳐서 보면 의존성 주입이라는 용어는 의존성이 있는 코드, 객체를 넣어준다~라는 말입니다. 조금 더 실사용 예시로 풀어서 생각을 해보면, A라는 클래스가 B라는 클래스를 사용하고 있을때, 즉 의존하고 있을때, A 클래스에서 B클래스를 직접 생성해서 사용하는 것이 아니라 외부에서 B클래스의 인스턴스를 생성해서 주입해준다는 것입니다.
자 이렇게 의존성 주입이라는 용어를 이해했는데요, 의존성 주입이라는 단어를 사용할때에는 방금 설명한 가장 기초적인 개념외에도 추가적인 몇가지 개념들이 같이 포함되어있습니다.
첫번째로 Inversion of Control, 줄여서 IoC, 제어의 역전이라는 용어인데요, 의존성 주입이라는 오늘의 주제에 맞게 해석을 해보자면, 기존에는 의존성을 직접 모두 제어했다면, Inversion of Control이 발생하면 제어권이 역전되어있기때문에 반대로 직접 제어하지 않는다라고 생각하시면 됩니다. 그림으로 보시면 조금 더 이해가 빠르실텐데요,
조금 쉽게 이해가 되도록 대략적으로 그림으로 그려보았습니다.. 이전의 예시를 그대로 들고오자면 클래스A가 클래스B를 직접 참조하고 생성했던 것을 중간에 매개체를 하나 두고 그 매개체를 통해서 사용한다고 생각을 해보시면 기존의 화살표가 위에서 아래로 쭉 흐르던 것이 서로 마주보게 되어 제어를 나타내는 화살표의 방향이 역전된 것을 보실 수 있습니다.
이렇게 그림으로 보면 이해가 빠르긴 하지만 직접적으로 화살표 방향으로 생각하시지 마시고 개발자가 직접 의존성을 제어하던 것을 어떠한 매개체에게 제어권을 일임, 또는 뺏기게되어 더이상 제어의 주체가 개발자가 아니게되기 때문에 제어의 역전이 발생되었다고 보시면됩니다.
여기서 조금 전에 매개체라고 했던 것이 있는데요, 이 매개체를 IoC Container라고 합니다. 이 IoC Container는 개발자에게서 일임 받은 제어권을 사용하여 의존성을 관리하고, 인스턴스를 생성하여 주입해주고, 나중에는 메모리 해제하는 역할을 해줍니다. 이 IoC Container는 주로 프레임워크가 이 역할을 담당합니다. NestJS, Spring등과 같은 프레임워크들을 IoC Container를 포함하고 있습니다.
자 이제 정리를 해봅시다. 의존성 주입이라는 것은 IoC 컨테이너라는 매개체를 두고, 여기에 필요한 모든 모듈들을 등록해둡니다. 그리고 사용처에서 직접 생성하는 것이 아니라 필요할때에 IoC 컨테이더가 의존성이 있는 모듈을 주입해주는 방식입니다. 이 과정에서 의존하는 모듈의 생성과 해제, 주입 등 일련의 제어과정을 IoC 컨테이너 기능을 포함하는 프레임워크들에게 줌으로써 제어의 역전이 일어나게 됩니다.
이제 의존성 주입을 이해했으니 이 개념이 어떠한 장점들이 있는지를 이해해보겠습니다.
첫번째로 의존성이 줄어듭니다. 사용하는 클래스에서 직접 생성하는 것이 아니라 IoC container를 통해서 사용하기 때문에 그렇습니다. 의존성이 줄어든다는 것은 변화에 강하다는 말도 됩니다. 의존하고 있는 모듈의 라이프사이클을 전혀 신경쓰지 않기때문에 의존하고있는 모듈이 변경된다고 해서 이를 사용처에서 신경쓸필요가 없어집니다. 따라서 유지보수도 더 용이해집니다.
모듈의 생성과 삭제 등을 직접할 필요가 없기때문에 코드의 양도 감소합니다. 다이나믹하게 크게 차이나지는 않겠지만 작업속도도 빨라질 수 있겠죠.
또, 외부에서 의존성을 직접 주입받기때문에 테스트를 하기에도 용이합니다. 자신이 원하는 객체의 상태를 직접 세팅하여 주입할 수 있기때문에 내가 원하는 테스트 코드를 작성하기도 훨씬 더 수월합니다.
끝!
'백엔드' 카테고리의 다른 글
Apache vs NginX vs Tomcat (0) | 2020.03.30 |
---|---|
Docker와 Nginx 포트 포워딩 (0) | 2020.03.20 |
[Django 공식문서 번역] Class-based Views - 1. Introduction (0) | 2020.03.18 |
[Web Server 이해하기] Apache vs Nginx (0) | 2020.03.18 |
[Web Server 이해하기] CGI / WAS / WSGI (0) | 2020.03.18 |