Million Dreams
100만개의 꿈을 꾸는 개발자 지망생
Springframework (1)
DI(Dependency Injection)란? 1. Constructor(생성자) 방식

스프링 프레임워크에는 DI란 개념이 있다.

의미를 직역하면 다음과 같다.

 

DI(Dependency Injection) : 의존성 주입

 

앞선 포스트에서 스프링 모듈들은 서로 의존관계에 있다고 언급한 바 있는데,

그 말처럼 스프링은 기본적으로 DI 기반으로 동작하기 때문에 구조에 대한 이해가 필요하다.

 

DI 설계 패턴의 기본적인 원리는 각각의 클래스가 실행을 위해 서로를 필요로 한다는 점을 볼 수 있다.

 

가령 A라는 클래스는 파라미터를 받아 콘솔에 그 파라미터의 값을 출력하는 기능을 하는 print()라는 메소드를 가진 클래스라고 하자.

하지만, 그 print 메소드가 다른 클래스 B를 필요로 한다고 한다면, A와 B는 의존관계에 있다고 할 수 있다.

 

의존관계를 만드는 방법은 크게 2가지 방법이 있을 수 있다.

1. 직접 의존 객체를 만드는 방법

2. 외부에서 파라미터를 전달받는 방법

 

먼저 1번 방법을 살펴보면

A 클래스내에 직접 new 생성자로 의존하는 클래스 B를 생성해 사용하는 방식이다.

1
2
3
4
5
6
7
8
9
10
package test;
 
public class A {
    private B b = new B();
    
    public void B(String question, String answer) throws IOException {
      ...
      ...
    }
}

그러나 이 상황에서 B의 하위 클래스인 C의 클래스를 사용해야 한다고 가정하면,

 

1
2
3
4
5
6
7
8
9
10
package test;
 
public class A {
    private B b = new B();
 
-> private B b = new C();
    
    public void B(String c, String d) throws IOException {
      ...
      ...
    }
}
 

이런식으로 바꿔줘야 한다.

 

만약에 이럴 경우 B클래스를 사용해 짜두었던 코드들을 모두 C에 해당하는 내용으로 변경해야 하기 때문에 코딩의 양이 증가한다 할 수 있다.

 

이와 달리 DI 방식은 의존 객체를 외부에서 조립하기 때문에 이같은 상황을 방지할 수 있다.

 

DI 방식 또한 크게 2가지가 있다.

1. Constructor(생성자) 방식

2. Property 방식

 

DI방식은 이처럼 의존하는 객체를 클래스 내에서 직접 만드는 것이 아니라 외부에서 주입하는 것이기 때문에 의존 주입이라는 표현을 쓰며 객체를 연결한다는 의미로 Wiring 이라는 표현으로도 사용된다.

 

의존 주입을 위해서는 객체를 생성하고 연결시켜주는 조립기 클래스가 따로 필요하다.

여기서는 임의로 Assembler라는 이름의 클래스로 만들어보았다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Assembler {
    private A a;
    private B b;
    
    
    public Assembler() {
        a = new A();
        b = new B();
    }
    
    public A a() {
        return a;
    }
    
}

이제 Assembler를 사용하면 이런식으로 클래스를 불러와 사용하는 것이 가능하다.

1
2
3
Assembler assembler = new Assembler();
    
    A a = assembler.a();

즉, 코드의 변경 사항이 있어도 클래스 내부에서 직접 수정하는 것이 아니라, 조립기의 내용을 수정함으로써 DI로 전달받는 코드는 영향을 받지 않게 된다.

 

 

 

  Comments,     Trackbacks