Spring - DI (의존성 주입) 이란 무엇인가?

DI(Dependency Inject)이란 객체를 직접 생성하는 것이 아니라 외부에서 생성한 후 주입시키는 것을 말한다.

기본적으로 Spring에서는 이러한 방식을 사용하고 있다.

 

아래는 DI에 관한 예제 코드이다.

 

1. Main.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package com.company.ioc;
 
public class Main {
    public static void main(String[] args) {
        String url = "www.naver.com/books/it?page=10&size=20&name=spring-boot";
 
        //Base64 Encoding
        Base64Encoder encoder = new Base64Encoder();
        String result = encoder.encode(url);
        System.out.println("encoder1 : " + result);
 
        //url Encoding
        UrlEncoder urlEncoder = new UrlEncoder();
        String urlResult = urlEncoder.encode(url);
        System.out.println("urlencoder1 :S " + urlResult);
 
        // 위와 같이 작성해버리면 encoding 방법이 달라질 때 마다 객체를 만들어줘야하는 문제가 생긴다.
        // 따라서 좀 더 추상화를 할필요가 있다.
 
        // 1. 인터페이스를 만든다. (여기 까지는 아무런 추상화가 이루어지지 않음)
 
        // 2. DI 개념을 도입한다. (
        Encoder encoder2 = new Encoder(new Base64Encoder());
        String result2 = encoder2.encode(url);
        System.out.println("encoder2 : " + result2);
 
        // 이처럼 DI개념을 도입하면 생성자를 변경하지 않아도 주입할 객체만 변경해주면된다.
        Encoder encoder3 = new Encoder(new UrlEncoder());
        String urlResult2= encoder3.encode(url);
        System.out.println("urlencoder2 :" + urlResult2);
 
        // 이처럼 DI는 아직까지는 개발자가 객체를 관리하고 있다.
        // 개발자가 객체를 직접 주입하고 관리하는 상황이 DI개념이다.
        
 
    }
}
 
cs

 

2. IEncoder.java(인터페이스)

1
2
3
4
5
6
7
package com.company.ioc;
 
public interface IEncoder {
    String encode(String message);
 
}
 
cs

 

3. Encoder.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.company.ioc;
 
import java.util.Base64;
 
public class Encoder {
    private IEncoder iEncoder; // 추상화시키기 위해서 인터페이스 객체를 필드로 사용한다.
 
    public Encoder(IEncoder iEncoder){
        //this.iEncoder = new Base64Encoder(); 
// 만약 Base64Encoder가아닌 urlencoding을 요청할 경우 이렇게 기본생성자를 또 바꿔줘야하는 굉장히 비효율적이고 본질적인 문제점이 존재한다.
        // 그런데 여기에 DI라는 개념을 도입하면 기본생성자를 건들지 않아도 충분히 이 객체를 재활용할 수 있다.
        // 외부에서 내가 사용할 객체를 주입시켜주는 개념이기 때문에 가능한 것이다.
        this.iEncoder = new UrlEncoder();
 
        // 그렇게 하기위해서는 생성자에서 매개변수를 받아줘야한다.
    }
 
    public String encode(String message){
        return iEncoder.encode(message);
    }
}
 
cs

 

4. Base64Encoder.java

1
2
3
4
5
6
7
8
9
package com.company.ioc;
import java.util.Base64;
 
public class Base64Encoder implements IEncoder{
    public String encode(String message){
        return Base64.getEncoder().encodeToString(message.getBytes());
    }
}
 
cs

 

 

5. UrlEncoder.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.company.ioc;
 
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
 
public class UrlEncoder implements IEncoder{ 
 
    public String encode(String message){
        try {
            return URLEncoder.encode(message, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
        }
    }
}
 
cs

 

'Spring' 카테고리의 다른 글

Spring - Component vs Bean vs Configuration  (0) 2022.01.12
Spring - Bean과 ioc에 대해서 (예제 코드)  (0) 2022.01.11
Spring - 왜 Spring을 쓰는가?  (0) 2022.01.11
Spring - ObjectMapper  (0) 2022.01.11
URI vs URL 개념정리  (0) 2022.01.06