IoC (Inversion of Control, 제어의 역전)
제어 반전, 제어의 반전, 역제어는 프로그래머가 작성한 프로그램이 재사용 라이브러리의 흐름 제어를 받게 되는 소프트웨어 디자인 패턴을 말한다. 줄여서 IoC이라고 부른다. 전통적인 프로그래밍에서 흐름은 프로그래머가 작성한 프로그램이 외부 라이브러리의 코드를 호출해 이용한다.
기존으 프로그램에서는 클라이언트 구현 객체가 스스로 필요한 서버 구현 객체를 생성하고, 연결하고, 실행하는 방식이였다
즉 구현 객체 (프로그래머)가 프로그램의 제어 흐름을 조종하는 역할이였다.
반면, IoC을 따르면 프로그램에 대한 제어 흐름 권한을 외부(라이브러리)에서 가져가는 것이다 (AppConfig)
-
프레임워크 - 프로그래머가 작성한 코드를 제어하고, 대신 실행하는 것
@BeforeEach, @Test ...
실행을 Junit 프레임워크가 완전히 맡아 프로그래머가 짠 로직을 알아서 처리해 주는 것.
-
라이브러리 - 프로그래머가 작성한 코드가 직접 제어의 흐름을 담당하는 것
DI (Dependency Injection, 의존관계 주입)
소프트웨어 엔지니어링에서 의존성 주입은 하나의 객체가 다른 객체의 의존성을 제공하는 테크닉이다. "의존성"은 예를 들어 서비스로 사용할 수 있는 객체이다. 클라이언트가 어떤 서비스를 사용할 것인지 지정하는 대신, 클라이언트에게 무슨 서비스를 사용할 것인지를 말해주는 것이다.
-
정적인 클래스 의존관계
- 클래스가 사용하는 import 코드만 보고 의존관계를 쉽게 판단할 수 있다.
- 정적인 의존관계는 클래스를 실행하지 않고도 의존관계를 파악할 수 있다.
- 하지만, 클래스 의존관계 만으로는 어떤 객체가 주입되는지 알 수 없다.
-
동적인 객체(인스턴스) 의존관계
- 애플리케이션 실행 시점에서 실제 생성된 객체 인스턴스의 참조가 연결된 의존관계
- 애플리케이션 런타임에 외부에서 실제 구현 객체를 생성하고 클라이언트에 전달해서 클라이언트와 서버의 실제 의존관계가 연결 되는 것을 "의존관계 주입" 이라고 한다.
- 의존관계 주입을 사용하면 클라이언트 코드를 변경하지 않고, 클라이언트가 호출하는 대상의 타입 인스턴스를 변경할 수 있다.
- 의존관계 주입을 사용하면 정적인 클래스 의존관계를 변경하지 않고 동적인 객체 인스턴스 의존관계를 쉽게 변경할 수 있다.
IoC 컨테이너, DI 컨테이너
- IoC를 준수하는 컨테이너, 객체 생성과 의존관계 주입 등의 작업을 수행하는 독립된 컨테이너.
- 스프링 컨테이너는 BeanFactory 와 ApplicationContext 라고 하는 두 개의 인터페이스로 정의되어 있다.
-
BeanFactory
-
Easier integration with Spring’s AOP features
-
Message resource handling (for use in internationalization)
-
Event publication
-
Application-layer specific contexts such as the WebApplicationContext for use in web applications
spiring.io document를 가져온 부분이다
Bean Factory는 스프링 설정 파일에 등록된 Bean 객체를 생성하고 관리하는 기본적인 기능을 제공한다.
컨테이너가 구동될 때 Bean 객체를 생성하는 것이 아니라 클라이언트의 요청에 의해서 Bean 객체가 사용되는 시점에 객체를 생성하는 방식을 사용.
IoC 컨테이너인 ApplicationContext가 이 BeanFactory를 상속받고 있다.
-
ApplicationContext
In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assembled, and managed by a Spring IoC container. Otherwise, a bean is simply one of many objects in your application. Beans, and the dependencies among them, are reflected in the configuration metadata used by a container.
스프링에서는 IoC 컨테이너 (Bean 들의 집합)에 의해 객체들이 생성되고 관리된다.
Bean은 IoC에 의해 인스턴스화되고, 구성되고 관리되는 객체이며 컨테이너는 이 Bean들과 그들의 의존관계를 관리한다.
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
OrderService orderService = applicationContext.getBean("orderService", OrderService.class);
위 코드는 애플리케이션에서 Bean 객체를 담은 AppConfig 클래스를 호출하고, Bean 객체를 호출해 인스턴스를 설정하는 것을 담고있다.
-
Bean
컨테이너는 프로그래머가 정의한 @Configuration 이하의 @Bean 객체들을 관리한다.
스프링 Configuration은 적어도 하나 이상의 bean의 정의로 이루어진다.
여기서 bean은, 애플리케이션을 구성하는 실제 오브젝트와 상응한다.

'CSE > Spring' 카테고리의 다른 글
| 컴포넌트 스캔과 필터 이용하기 (0) | 2021.03.01 |
|---|---|
| Spring이 제공하는 싱글톤 컨테이너 (0) | 2021.03.01 |
| AppConfig - 애플리케이션 동작 방식을 Configuration ! (0) | 2021.02.22 |
| 기본적인 자바 문법 + IntelliJ 단축키 @계속 추가 예정 (0) | 2021.02.20 |
| 객체 지향 프로그래밍 - Why spring? (0) | 2021.02.17 |