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());
    }
}