본문 바로가기
⚙️Backend/Spring

[Spring] DI (Dependency Injection) part 1

by Bㅐ추 2020. 5. 30.
728x90
반응형

2020/05/30 - [🌎Web Application/Spring] - [Spring] Spring 이란

1. 스프링을 사용하기 전

우리는 지금까지 한 클래스 내에서 다른 클래스의 기능이 필요로 할 때, new연산자를 통해 그 클래스의 생성자를 호출해서 사용했었다.

 

 예를 들어.  메인메소드 내에서 외부 클래스 MessageBean의 메소드 SayHello 을 쓰기위해서는,

public class MessageBean {
	public void sayHello(String name){
    	System.out.println("안녕, "+name);
    }
}
MessgeBean bean = new MessageBean(); 
bean.sayHello("Spring");

와 같이, 우리(주체)가  사용 할 클래스(메인 클래스)내에서 사용 될 클래스(MessageBean)를 만들고 (new연산자) 사용(.method())했다.

==> 즉, 우리가 사용 할 클래스와 사용 될 클래스의 관계는 개발자(우리)에 의해 직접 코드에서 부여했다.

==> 이제까지는 클래스를 사용하려면 자바코드에서 클래스 생성자를 호출해 객체를 생성했다.

 

메인 클래스는 MessageBean의 sayHello() 기능을 사용 하려면 MessageBean 클래스가 필요하다.
 즉 메인 클래스는 MessageBean에 <<의존>>하고 있다.

 

 

< "의존하다"의 의미  >

어떤 기능을 실행시키기 위해 다른 클래스가 필요로 할 때. 즉, A가 B에 의존한다는 것은 A가 B객체를 사용한다는 것. ) 


이러한 방식(매번 개발자가 직접 클래스사이의 관계를 부여하는 방식)은 아래와 같은 문제점이 있다.


만약 의존하는 클래스(MessageBean)에 변경사항이 생기면 해당 클래스를 의존하고 있던 모든 클래스들의 소스코드를 수정해 줄 필요가 생긴다.  ==> 서로 간의 의존관계가 높기 때문이다. ==  결합도가 높다!

 

최종목표는 코드의 유연성을 위해 이 의존관계를 낮춰주는 것이다. 즉, 결합도를 낮춰야 한다!

 

 *   (cf) 강한결합 vs 약한결합 
 *   현실에서 우리는 자동차의 에어컨이 고장 나면 당연히 에어컨만 수리하거나 교체하면 된다.  
 *   하지만 만약 자동차 에어컨의 기능이 자동차 엔진과 관련있게 설계되었다고 (현실적이지 않지만) 가정해보자. 
 *   에어컨에 작은 문제라도 생기면 자동차 엔진까지 손을 봐야 하는 상황이 생길 것이다!.
 *    
 *   자동차 부품과 에어컨 부품은 전혀 << "연관성"이 없음에도 >>  
 *   엔지니어가 자동차 부품과 에어컨 부품이 서로 관련 있게 설계를 했다면 
 *   이러한 문제가 생긴다. 
* (에어컨이 고장났으니 에어컨 부품만 손보면 되는데 멍청한 엔지니어가 에어컨 부품과 자동차 부품을 연관지었다면 자동차 * 까지 손봐야 한다.) 

 *    
 *   다시말해, 컴퓨터의 그래픽 카드가 고장났다면 그래픽 카드만 교체하면 되는데, 
 *   컴퓨터와 그래픽카드의 기능을 서로 관련 있게 설계했다면 
 *   컴퓨터까지 교체할 상황이 온다는 의미이다. 
 *    
 *   즉, 엔지니어는 << 서로 관련이 없는 기능끼리는  서로 영향을 주지 않게 설계해야할 필요 >> 가 있다. 
 *    
 *   이때의 엔지니어를 개발자, 자동차를 프로그램이라고 생각하면, 
 *    
 *   프로그램도 각각의 독립적인 기능들로 구성되어 있다. 
 *   또 각 기능들은 또 세부기능을 하는 여러 클래스들로 이루어 진다. 
 *    
 *   그런데 부품 기능을 하는 클래스에 변경 사항이 발생(ex. 에어컨 부품)했을 때  
 *   그 클래스의 기능과 관련 없는 다른 클래스(ex. 자동차 부품)까지 손봐야 한다면 
 *   위의 예처럼 여러가지 문제가 발생할 수 있다. 
 *    
 *   그러므로 서로 관련이 있는 기능들은 강하게 결합하고 관련이 없는 기능들은 약하게 결합해야 좋은 프로그램 이다. 


 이러한 문제점을 해결(의존관계가 높다는 문제점)하기 위해 나온 것이

DI(Dependency Injection) 의존성 주입
 
각 클래스 사이의 의존관계를 낮추는 것을 도와준다.

 

728x90
반응형