IoC(Inversion of Control)
- 스프링에서는 일반적인 Java객체를 new로 생성하여 개발자가 관리하는 것이 아닌, Spring Container에 모두 맡긴다.
- 개발자 -> 프레임워크로 제어의 객체 관리 권한이 넘어갔기 때문에 이를, "제어의 역전"이라고 한다.
DI(Dependency Injection)
- DI의 장점
- 의존성으로부터 격리시켜 코드테스트에 용이하다.
- DI를 통하여, 불가능한 상황을 Mock 기술을 통해 안정적으로 테스트할 수 있다.
- 코드를 확장하거나 변경할 때 영향을 최소화 한다.(추상화)
- 순환참조를 막을 수 있다.
DI 예제(소스코드)
- URL을 두 가지 방식으로 Encode할 때, DI를 적용시켜보는 예제이다.
public class Main {
public static void main(String[] args) {
String url = "www.naver.com/books/it?page=10&size=20&name=spring-boot";
Encoder encoder = new Encoder(new Base64Encoder());
String result = encoder.encode(url);
System.out.println(result);
}
}
public interface IEncoder {
String encode(String message);
}
import java.util.Base64;
public class Base64Encoder implements IEncoder{
public String encode(String message){
return Base64.getEncoder().encodeToString(message.getBytes());
}
}
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;
}
}
}
public class Encoder {
private IEncoder iEncoder;
public Encoder(IEncoder iEncoder){
this.iEncoder = iEncoder;
}
public String encode(String message){
return iEncoder.encode(message);
}
}