1. 제어 역전 (IoC: Inversion Of Control)
- 인스턴스를 제어하는 제어권이 역전된다는 것
(메서드나 객체의 호출 작업을 개발자가 결정하는 것이 아니라 외부에서 결정되는 것을 의미한다)
(컴포넌트를 구성하는 인스턴스 생성과 의존관계 연결처리를 스프링 IoC 컨테이너에 위임한다)
- 컨트롤의 제어권이 사용자가 아니라 프레임워크에 있어 필요에 따라 스프링에서 사용자의 코드를 호출한다
- 애플리케이션의 느슨한 결합을 도모한다
-> 어떤 객체가 사용할 객체(의존관계인 객체)를 직접 선언하여 사용하는 것이 아니라,
어떤 방법을 사용하여(ex. 생성자) 주입받아 사용하는 것
블럭 끼워넣기 개발이라고도 함
2. 의존성 주입 (DI: Dependency Injection)
- 제어 역전이 발생할 때, 스프링 내부에 있는 객체가 해당클래스를 사용할 때 필요한 관계를 관리하는 동작 또는 기법
- 의존성이란 객체가 혼자서는 처리할 수 없음을 뜻함
ⓐ 따라서 객체를 직접 생성해서 구현
ex ) jsp model에서의 DAO 객체 생성
ⓑ 관계를 약화시키면서 간접 구현, 즉 호출해야한다
- 즉, 의존성 주입(DI)란 객체를 직접 생성/제어하는 것이 아니라, 제어의 역행을 사용해서 특정 객체를
필요한 객체의 외부에 가져다 연결하는 것을 뜻함
- 객체가 필요한 어떤 객체를 생성자 혹은 setter를 통해 주입하는 것을 말한다.
- 각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜준다
(클래스 사이의 의존 관계를 빈(Bean) 설정 정보를 바탕으로 컨테이너가 자동적으로 연결)
- IoC의 소프트웨어 디자인 패턴 중 하나
개발자들은 제어를 담당할 필요 없이 빈 설정 파일에 의존관계가 필요하다는 정보만 추가해주면 된다
IoC / DI 를 사용하면 객체를 생성할 때에,
해당 객체가 참조하고 있는 다른 객체에 대한 종속성을
애플리케이션 코드 외부(Container)에 설정하게 함으로써
결합도는 낮추면서 유연성과 확장성은 향상시킬 수 있다
2-1 DI의 세가지 유형
1) 생성자를 이용한 의존성 삽입
- 필요한 의존성을 모두 포함하는 클래스의 생성자를 만들고, 그 생성자를 통해 의존성을 주입
2) setter() 메서드를 이용한 의존성 삽입
- 의존성을 입력받는 setter 메서드를 만들고 이를 통해 의존성을 주입
3) 초기화 인터페이스를 이용한 의존성 삽입 (스프링은 지원하지 않는 DI 방식)
- 의존성을 주입하는 함수를 포함한 인터페이스를 작성하고 이 인터페이스를 구현하도록 함으로써
실행시에 이를 통하여 의존성을 주입
2-2 DI Container의 종류
1) Spring Container
- 스프링 IoC 컨테이너가 관리하는 객체를 빈(Bean)이라고 부름
- 스프링에서는 Bean들을 관리한다는 의미로 BeanFactory라고 부름
2) PicoContainer
3) Guice
2-3 IoC / DI 의 장점
- 인스턴스(Bean)의 스코프를 제어할 수 있다 (Singleton이 기본이다)
- 인스턴스의 생명주기를 제어할 수 있다
- AOP 방식으로 공통 기능을 제공할 수 있다
- 의존하는 컴포넌트 간의 결합도를 낮춰서 테스트하기 쉽게 만든다
- 단위 테스트를 용이하게 만든다
3. Spring IoC Container (BeanFactory / ApplicationContext)
- 스프링에서 IoC를 담당하는 컨테이너를 BeanFactory / ApplicationContext 라고 부르기도 한다
- BeanFactory : 객체의 생성과 객체 사이의 런타임 관계를 설정하는 단순 DI
스프링 IoC 컨테이너 최상위에 있는 인터페이스
- ApplicationContext : DI를 위한 BeanFactory에 엔터프라이즈 애플리케이션을 개발하는 데 필요한
여러가지 기능을 추가한 것
'Java > Spring' 카테고리의 다른 글
[Spring] Bean 설정, 컴포넌트 스캔(Component Scan) (0) | 2021.06.01 |
---|---|
[Spring/MyBatis] MyBatis? (0) | 2021.05.28 |
[Spring] 스프링 AOP(관점지향 프로그래밍, Aspect-Oriented-Programming) (1) | 2021.05.24 |
[Spring] Maven? (0) | 2021.05.23 |
[Spring] 스프링 프레임워크(Java Spring Framework)란? (0) | 2021.05.19 |
댓글