[Spring] 의존성 주입(Dependency Injection)

Junbeom Wi·2021년 5월 9일
0

Java Spring

목록 보기
1/2


MVC 구조와 같은 객체 지향 프로그래밍을 하다 보면, 의존성 주입(Dependency Injection, 이하 DI)을 하게 된다. 그렇기 때문에 객체 지향 설계를 주로 다루는 Java Spring에게 있어서 DI는 가장 기본적이고, 꼭 알아야 하는 개념이다.

의존성 주입이란?


말 그대로 객체에 다른 객체의 의존성을 주입하는 것이다. 하지만 이렇게 설명하면 헷갈리고 이해가 매우 어렵다. (붕어같은 내 머리로는 이런 식으로 기억했다간 내일이면 까먹는다🤦‍♂️🤦‍♂️) 그렇기 때문에 먼저 의존성이 어떤 것인지에 대해 알아봐야 한다.


의존성 (Dependency)


public class Computer {
	// Processor에 대해 의존성이 생기게 됨.
	Private Processor processor;
}

위 코드를 보자.

컴퓨터인 Computer객체에서 Processor객체를 불러오게 되었다. 이 두 객체 사이에서 의존성이 발생하였다고 표현하며, ComputerProcessor 객체를 가져다 쓰게 되므로, ComputerProcessor에 대해 의존성을 가진다.

결국 객체지향 프로그래밍에서 객체에서 다른 객체를 사용할 때 의존성이 발생하게 되는 것이다.


문제점


그러나 의존성을 발생하는 단계에서 문제점이 생기곤 한다. 바로 생산성에 문제가 생기는 문제점을 갖게 되는데 밑 코드를 들여다 보면,
public class Computer {
	Private Processor processor;
	Private Gpu gpu;
	Private Memory memory;
    
    public Computer {
 	   Processor Intel = new Processor();
 	   Gpu Geforce = new Gpu();
 	   Memory memory1024 = new Memory();
  	   ... 
 	   }
   ...
   }

Computer를 만들기 위해 여러 객체(부품)을 가지고 와야 하는데, 해당 객체들을 직접 생성해서 의존성을 만들게 되면 향후 부품에 문제가 생기거나 업그레이드를 위해 부품을 교체해야 하는 일이 생기게 되면 문제가 생긴 부품의 클래스도 수정해야할 뿐더러, Computer 클래스도 다시금 수정해야 하는 번거로움이 생긴다.

우리가 일체형 컴퓨터보다 조립형 컴퓨터를 오래 사용하는 것도 같은 맥락이지 않을까? (문제 있는 부품을 그때그때 고쳐서 개조할 수 있으니까!!)


단편적인 예시였지만 클래스가 만들어내는 여러 의존성을 만들어내게 된다면 관리하기가 매우 어려워지게 될 것이다. 이는 코드의 가독성도 해치게 되며 무엇보다 생산성을 잃어버린다.


해결방법 : 의존성 주입


그래서 이를 해결할 수 있는 방법이 의존성 주입이다. 위 코드에서 처럼 직접 생성하여 의존성을 만들어내지 말고 외부에서 생성된 객체를 주입받는 것이다.

public class Computer {
	Private Processor processor;
	Private Gpu gpu;
	Private Memory memory;
    
 //   public Computer { // 강한 결합의 의존성 생성 방식 (문제점)
 //	   Processor Intel = new Processor();
 //	   Gpu Geforce = new Gpu();
 //	   Memory memory1024 = new Memory();
 //	   ... 
 // 	   }
 
 public Computer(Processor processor, Gpu gpu, Memory memory) {
 	 // 직접 new를 통해 객체를 생성하지 않고, 외부에서 받아서 의존성을 주입. 
    	 this.processor = processor;
   	 this.gpu = gpu;
   	 this.memory = memory;
 	...
    }
 ...
   }

위 코드는 앞서 소개한 문제점을 개선한, 생성자를 이용해 의존성 주입을 한 코드이다. 이렇게 객체 내부에서 new를 통한 직접 의존성 생성을 하지 않고, 외부에서 생성한 객체를 의존성으로 주입해주면 다형적이지 않아 생산성이 떨어지는 문제점을 해소하게 된다. 이렇게 외부에서 의존성을 넣어주게 되면 외부에서 제어가 된 것을 받아서 쓰기 때문에 IoC(Inverse of Control : 제어권의 역전)이라 DI를 부르기도 한다.


의존성 주입의 장점


물론 이와 같은 문제점만 해결한다고 의존성 주입을 사용하는 것은 아니다. 의존성 주입을 함으로써 여러 장점을 얻을 수가 있는데,
  • 코드가 다형성을 가지기 때문에 생산성이 올라간다.

  • 코드가 단순해져 가독성이 좋고 재활용성이 생긴다.

  • Test code를 작성하는데 용이하다.

    • Mocking을 하여 다른 Mock 객체에 넣어줄 수 있으므로 각 Unit을 Test할 수 있다.

    정도를 가장 큰 장점으로 들을 수 있다.



Spring에서의 의존성 주입


그러나 의존성이 많아지게 된다면, 의존성들을 관리하기가 쉽지 않은 것은 당연하다. 또한, 외부에서 객체를 생성해서 그 의존성이 필요한 객체에 의존성을 주입해주어야 하는데 그럴 때마다 외부에서 객체를 생성하는 것도 번거로운 일이 된다.

근데 그 의존성을 관리하고 외부에서 의존성을 생성해주는 일을 Spring이라는 Framework가 해준다. 바로 Spring Container라는 Spring의 핵심 컴포넌트이자 IoC 컨테이너가 이를 관리해주는데, 우리는 이 Spring Container를 통해 더욱이 편하게 개발할 수 있다.

맺음

Spring에서 DI를 하는 것은 다음 포스트에서 다시 다룰 예정이다.

profile
No Experience Backend Developer

0개의 댓글