Spring
[Spring] Ioc (Inversion Of Controll), DI (Dependency Injection)
펭귄코기
2022. 10. 14. 17:53
IoC (Inversion Of Controll)
스프링에서는 일반적인 Java 객체를 new 로 생성하여
개발자가 관리하는 것이 아닌 Spring Container에 모두 맡긴다
즉 개발자에서 -> 프레임워크로 제어의 객체 관리의 권한이
넘어갔음 으로 제어의 역전이라고 한다
@Component 를 써서 Bean으로 만들고 스프링 컨테이너에게 맡겨 관리해서 사용가능하다
IoC 예시
// ApplicationContextProvider
@Component
public class ApplicationContextProvider implements ApplicationContextAware {
private static ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
context = applicationContext;
}
public static ApplicationContext getContext(){
return context;
}
}
// main
@SpringBootApplication
public class IocApplication {
public static void main(String[] args) {
SpringApplication.run(IocApplication.class, args);
ApplicationContext context = ApplicationContextProvider.getContext();
//Base64Encoder base64Encoder = context.getBean(Base64Encoder.class);
//UrlEncoder urlEncoder = context.getBean(UrlEncoder.class);
Encoder encoder = context.getBean("urlEncode", Encoder.class);
String url = "www.naver.com/books/it?page=10&size=20&name=spring-boot";
String result = encoder.encode(url);
System.out.println(result);
}
}
@Configuration
class AppConfig{
@Bean("base64Encode")
public Encoder encoder(Base64Encoder base64Encoder){
return new Encoder(base64Encoder);
}
@Bean("urlEncode")
public Encoder encoder(UrlEncoder urlEncoder){
return new Encoder(urlEncoder);
}
}
DI (Dependency Injection)
외부(스프링 컨테이너)로부터 주입을 받는다
DI 장점
- 의존성으로 부터 격리시켜 코드 테스트에 용이하다
- DI를 통하여 불가능한 상황을 Mock와 같은 기술을 통하여 안정적으로 테스트 가능하다
- 코드를 확장하거나 변경 할 때 영향을 최소화 한다 (추상화)
- 순환참조를 막을 수 있다
DI (의존성 주입) 예시
// main
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);
}
}
// Encoder
public class Encoder {
private IEncoder iEncoder;
public Encoder(IEncoder iEncoder){
this.iEncoder = iEncoder;
}
public String encode(String message){
return iEncoder.encode(message);
}
}
// base64Encoder
public class Base64Encoder implements IEncoder{
public String encode(String message){
return Base64.getEncoder().encodeToString(message.getBytes());
}
}