본문 바로가기
아키텍쳐

의존성 주입(Dependency Injection) 이란?

by hayz 2022. 6. 12.

앞선 글에서 클린 코드와 클린 아키텍쳐에 관한 얘기를 하며 의존성 주입(Dependency Injection) 에 관한 얘기를 언급한적이 있습니다. 이번 글은 그 의존성 주입이 어떤것인지 간단하게 정리해보도록 하겠습니다. 

 

클린 코드 혹은 클린 아키텍쳐에 대한 고민

소프트웨어를 설계하거나 개발을 할 때 많이 나오는 주제중에 하나는 클린 코드와 클린 아키텍쳐입니다. 이 글에서는 클린 코드와 클린 아키텍쳐에 대한 저의 생각에 대해서 간단하게 작성해보

hayz.tistory.com


사실 의존성 주입이라는 개념에 대해서는 주변에 스프링 개발을 하는 친구나 테크 컨퍼런스나 하는 경로로 한두번 접한적이 있던것 같지만 유심히 생각하지 않은 주제였습니다. 개발을 하면서 직접적으로 의존성 주입을 고려하여 개발을 한 적이 없었고, 그때 당시 데이터 엔지니어의 업무가 보다 많았기 때문에 크게 고려하지 않아도 되는 것이라고 생각했기 때문입니다. 

 

하지만 서버 개발자로 직무를 바꾸게 되면서 의존성 주입이라는 것을 체감하게 되고, 실제로 개발을 할때 의존성 주입등을 고려하며 개발을 시작하게 되었습니다. 그렇기 때문에 지금 시점은 의존성 주입을 직접 체험하고 공부하게 된지 약 2~3개월도 안된 시점에서 작성하는 글입니다. 

 

 

의존성 주입이란?

의존성 주입이랑 영어로 Dependency Injection 이라고 하며 DI 로도 많이 불립니다. 의존성을 주입한다는 것은 객체에 특정 변수 혹은 다른 객체를 주입한다는 것을 의미하는데, 이 주입한다는 의미는 우리가 평소에 많이 사용하는 함수 혹은 객체의 매개변수로 넣어준다는 의미입니다.

 

예를 들어, savePerson() 이라는 함수가 존재하고, 이 함수의 매개변수로 person 이라는 객체를 넣어주고자 한다면 함수의 형태은 savePerson(Person *person) 이 될것입니다. 우리는 이러한 함수를 작성할때 자연스럽게 person 이라는 객체를 매개변수로 정하게 되는데, 그 이유는 person 형식만 유지한다면 person 이 어떤 값이든 savePerson 함수를 동일하게 동작하게 하기 위해서일겁니다. 

 

위 예시 처럼 무엇인가를 매개변수로 빼내는 이유는 그 매개변수가 자주 바뀔수 있는 값이고, 함수가 특정 값에만 동작하지 않고 일반적으로 동작하기 위해서 입니다. 프로그래밍 에서는 이것을 "의존성" 이라고 합니다. 만약 savePerson 함수가 특정 "tom" 이라고 하는 이름의 Person 만 저장할 수 있도록 되어 있다면 이 savePerson 은 "tom" 이름의 person 객체에 의존성이 강한 함수라고 할 수 있을겁니다. 

하지만 이를 분리시키기 위해 우리는 매개변수 형태로 값을 주입받도록 하며 의존성을 분리시키게 됩니다. 이런식으로 분리시킨 의존성을 메서드 또는 생성자 또는 환경변수 등으로 주입해주는 형태를 "의존성 주입" 이라고 합니다. 

 

 

의존성 주입이 왜 중요한가?

의존성 주입을 지키지 않고 의존성이 강한 객체들이 존재하도록 프로그래밍 하면 어떻게 될까요? 특정 상황에 대해서는 아주 잘 동작하겠지만, 의존성을 가진 객체의 형식이 조금만 바뀌면 혹은 다른 형식을 객체를 지원하려고 하면 수정해야 하는 코드의 범위가 한없이 커지게 됩니다.

코드의 수정 범위를 제한한다는 것은 아주 큰 장점을 가지고 있습니다.  코드 수정으로 인한 사이드 이펙트를 최소한으로 하고, 쉽고 빠른 수정과 배포를 지향하고, 테스트 또한 확장이 훨씬 수월해 질수 있습니다. 

 

의존성 주입을 적용하는 방법

의존성 주입을 실천하는 방법은 여러가지가 있습니다. 생성자 주입, 메서드 주입, 컨피그 주입 등등

각각의 세부 방법에 대해서는 다음 글에서 살펴보도록 하겠습니다. 

 

 

댓글