Spring
Spring - DI (의존성 주입) 이란 무엇인가?
dev_SiWoo
2022. 1. 11. 14:37
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 |