[Spring] 스프링의 IoC & DI
IoC 란?
IoC(Inversion of Contorl)은 제어의 역전이라는 개념이다.
제어의 역전이라는 건, 쉽게 말하면 프로그램의 제어 흐름 구조가 뒤바뀌는 것이다.
먼저 Servlet이라는 개념을 생각해보도록 하자.
일반적인 자바 프로그램은 main() 메소드에서 시작해서 개발자가 미리 정한 순서를 따라 오브젝트가 생성되고 실행된다.
But. 서블릿을 개발해서 서버에 배포할 수는 있지만, 그 실행을 개발자가 직접 제어할 수 있는 방법은 없다.
대신 Servlet 에 대한 제어 권한을 가진 컨테이너(Container)가 적절한 시점에 서블릿 클래스의 오브젝트를 만들고 그안의 메소드를 호출한다.
위의 예시를 생각해보면 JSP, EJB처럼 컨테이너 안에서 동작하는 구조는 간단한 방식이긴 하지만 제어의 역전 개념이 적용되어 있다고 볼 수 있다.
스프링 용어 정리
● 빈(Bean)
빈 또는 빈 오브젝트는 스프링이 IoC방식으로 관리하는 오브젝트라는 뜻이다.
( 스프링이 직접 그 생성과 제어를 담당하는 오브젝트만을 빈이라고 한다. )
● 빈 팩토리 ( Bean Factory )
스프링의 IoC를 담당하는 핵심 컨테이너를 가리킨다.
빈을 등록, 생성, 조회, 구동, 그 외에 부가적인 빈을 관리하는 기능을 담당한다.
보통 이를 확장한 애플리케이션 컨텍스트를 이용한다.
● 애플리케이션 컨텍스트 ( Application Context )
빈 팩토리를 확장한 IoC 컨테이너이다. 똑같이 빈을 관리하는 기능
여기에 스프링이 제공하는 각종 부가 서비스를 추가로 제공한다.
애플리케이션 컨텍스트는 빈 팩토리를 상속한다.
● 설정정보/설정 메타정보 ( Configuration metadata )
스프링의 설정정보란 애플리케이션 컨텍스트 또는 빈 팩토리가 IoC를 적용하기 위해 사용하는 메타정보를 말한다.
● 컨테이너 또는 IoC 컨테이너
IoC 방식으로 빈을 관리한다라는 의미에서 빈 팩토리 or 애플리케이션 컨텍스트 를 컨테이너 라고 지칭한다.
DI란?
Dependency Injection은 그대로 번역하면 의존관계 주입이다.
먼저 의존관계란 무엇인지 생각을 해보자.
두 개의 클래스 또는 모듈이 의존관계에 있다고 말할 때는 항상 방향성을 보여해줘야 한다.
즉 누가 누구에게 의존하는 관계에 있다는 식이어야 한다.
A --> B ( A가 B에 의존하고 있음을 나타낸다. )
그렇다면 의존하고 있다는 것은 무슨 의미일까?
의존한다는 건 의존대상, 여기서는 B가 변하면 그것이 A에게 영향을 미친다는 뜻이다.
B의 기능이 추가되거나 변경되거나, 형식이 바뀌면 그 영향이 A로 전달된다는 것이다.
의존관계 주입이란 다음과 같은 세 가지 조건을 충족해야한다.
● 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않는다. 그러기 위해서는 인터페이스에만 의존해야 한다.
● 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제3의 존재가 결정한다.
● 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 제공(Injection)해줌으로써 만들어진다.
DI 적용 방법
1. 생성자를 이용한 DI
2. 수정자 메소드 DI
3. XML을 이용한 설정