IT/Spring

IoC (Inversion of Control)

김 정 환 2021. 6. 22. 17:16
반응형

IoC (Inversion of Control)

위키백과의 내용입니다.

in traditional programming, the custom code that expresses the purpose of the program calls into reusable libraries to take care of generic tasks, but with inversion of control, it is the framework that calls into the custom, or task-specific, code.

전통적인 프로그래밍에서 흐름은 프로그래머가 작성한 프로그램이 외부 라이브러리의 코드를 호출해 이용합니다. 하지만 제어 반전(Inversion of Control)이 적용된 구조에서는 외부 라이브러리의 코드가 프로그래머가 작성한 코드를 호출합니다.

 

 

무슨 뜻인지 이해하기 전에 아래 동영상을 보면 굉장히 이해가 쉬울 거라고 생각합니다.

 

 

 

IoC는 소프트웨어 디자인 패턴으로, 설계 목적은 아래와 같습니다.

  • 작업을 구현하는 방식과 작업 수행 자체를 분리합니다.
  • 모듈을 제작할 때, 모듈과 외부 프로그램의 결합에 대해 고민할 필요없이 모듈의 목적에 집중할 수 있습니다.
  • 다른 시스템이 어떻게 동작할지에 대해 고민할 필요 없이, 미리 정해진 협략대로만 동작하게 하면 됩니다.
  • 모듈을 바꾸어도 다른 시스템에 부작용을 일으키지 않습니다.

 

이러한 목적 때문에 객체 간의 결합도를 줄이고 유연한 코드를 작성할 수 있습니다. 그 결과, 유지 보수를 쉽게 할 수 있습니다. 

 

 

IoC container

IoC 컨테이너는 자동으로 객체의 생성, 생명주기, 의존성 주입을 해주는 프레임 워크입니다. IoC 컨테이너는 객체를 생성해주고, 모든 의존성을 생성자를 통해 넣어주고, 끝날 때에는 알아서 버려줍니다. 이 과정은 개발자가 손수하지 않고 IoC 컨테이너가 알아서 해줍니다.

 

스프링에서 IoC 컨테이너가 관리하는 자바 객체를 빈(Bean)이라고 합니다. IoC 컨테이너에 개발자가 Bean을 등록해 놓으면 Bean이 필요한 곳을 알아서 찾아 넣어줍니다.

 

- BeanFactory

BeanFactory는 IoC 컨테이너의 기능을 정의하고 있는 인터페이스 입니다. 

 

- ApplicationContext

ApplicationContext는 BeanFactory를 상속받고 있습니다. 그래서 BeanFactory가 제공하는 기능 외에도 다른 기능들을 제공합니다. 대게 ApplicationContext를 사용합니다.

 

 

Bean

빈(Bean)은 스프링 IoC 컨테이너가 관리하는 자바 객체를 말합니다.

 

- Bean 등록

스프링에서 특정 어노테이션(annotation)을 부여한 클래스(class)를 찾아서 자동으로 빈을 등록해주는 Bean Scanning 기능이 있습니다.

 

특정 어노테이션은 대게 @Component, @Service, @Repository, @Controller, @Configuration이 있습니다. 사용자가 지정할 수도 있습니다.

 

수동으로 빈을 등록하고 싶으면 XML 또는 자바 설정 파일에 등록할 수 있습니다. 구체적인 방법은 이분 블로그에 정리가 잘 되어 있습니다.

 

- Bean 주입

주입하는 방법은 DI에서 설명하겠습니다.

 

 

DI (Dependency Injection)

의존성 주입은 개발자가 생성한 Bean을 IoC 컨테이너가 알아서 필요한 곳에 주입해 줍니다. 

 

일반적인 방법은 @Autowired를 setter, 생성자, 필드에 붙여서 사용하는 것입니다.

 

@Autowired 외에도 @Resource, @Qualifier 등이 있습니다. 

 

아래 예시에서 의존성 주입를 볼 수 있습니다. 단, 아래 예시는 PetOwner의 유일한 생성자에 Bean이 들어가서 @Autowired가 없어도 가능합니다.

 

 

참고

- 위키백과

- IoC 참고 블로그

- IoC 컨테이너 참고 사이트

- IoC 컨테이너 참고 사이트

- 빈 등록/사용 참고 사이트

- DI 참고 사이트

- DI 참고 사이트

반응형