Inversion of Control 프로그램의 제어 흐름 구조가 뒤바뀌는 것
기존이라면 프로그램이 시작되는 지점에서 다음 사용할 오브젝트를 결정하고 생성하고 호출한다.
제어의 역전은 이러한 흐름을 거꾸로 뒤집는것 스프링에서는 관계설정같은 제어를 담당하는 오브젝트를 빈 팩토리(bean factory)라고 부른다. 대부분 이를 확장한 애플리케이션 컨텍스트를 주로 사용한다.
설정정보를 담은 클래스
@Configuration
public class test{
@Bean
public Dao dao(){
return new Dao(connection());
}
@Bean
public Connection connection(){
return new DConnetcion();
}
}
애플리케이션 컨텍스트를 적용한 Test
public class daoTest {
public static void main(String[] args ) throws ClassNotFoundException,SQLException{
ApplicationContext context = new AnnotationConfigApplicationContext(test.class);
Dao dao = context.getBean("Dao",daoTest.class);
}
}
애플리케이션 컨텍스트를 사용했을 때 얻을 수 있는 장점
스프링이 주로 적용되는 대상이 자바 엔터프라이즈 기술을 사용하는 서버환경이기 때문.
매번 클라이언트 요청이 올때마다 오브젝트가 만들어진다면 엄청나게 많은 오브젝트가 생성되므로 이러한 문제를 해결하기위해 사용자의 요청을 담당하는 여러 스레드에서 하나이 오브젝트를 공유해 사용하는 싱글톤 패턴을 사용한다.
DI(Dependency Injection)는 오브젝트 레퍼런스를 외부로부터 제공받고 이를 통해 동적으로 의존관계가 만들어지는 것이 핵심.
예를 들어 A가 B에게 의존하고있다는 것은 B의 변경에 따라서 A에게 영향이 간다.
의존관계 주입의 3가지 조건
스프링에서 메소드를 이용한 의존관계 주입
수정자 메소드를 이용한 주입
파라미터로 전달된 값을 내부의 인스턴스 변수에 저장하는것 부가적으로 입력값의 대한 검증 그밖의 작업을 수행할수도 있음.
일반 메서드를 이용한 주입
한번에 여러 개의 파라미터를 받을 수있음 따라서 타입이 여러개라면 실수하기도 쉬워지는 주입방식. 외부에서 값이 변경될 수 있다.
다른 방식의 의존관계 주입
빈 : 스프링이 IoC 방식으로 관리하는 오브젝트라는 뜻 스프링이 직접 생성과 제어를 담당하는 오브젝트만 빈이라고 한다.
빈 팩토리 : 스프링의 IoC를 담당하는 핵심 컨테이너를 말함 빈의 등록,생성,조회 그외의 부가적인 빈을 관리하는 기능을 담당함 빈을 생성하고 관계를 설정하는 IoC의 기본 기능에 초점을 맞춤
애플리케이션 컨텍스트 : 빈 팩토리를 확장한 IoC 컨테이너 스프링이 제공하는 각종 부가 서비스를 추가한 빈 팩토리. ApplicationContext는 애플리케이션 컨텍스트가 구현해야하는 기본 인터페이스를 가리킴.
애플리케이션 전반에 걸쳐 모든 구성요소의 제어 작업을 담당하는 IoC 엔진이기도 함.
설정정보/설정 메타정보 : 애플리케이션 컨텍스트 또는 빈 팩토리가 IoC를 적용하기 위해 사용하는 메타정보를 말한다 영어로 configuration를 뜻하며 대부분 IoC 컨테이너에 의해 관리되는 애플리케이션 오브젝트를 생성,구성할 때 사용된다.
@Configuration : 스프링이 빈 팩토리를 위한 오브젝트 설정을 담당하는 클래스라고 인식할수 있도록 하는 애노테이션
@Bean : 오브젝트 생성을 담당하는 IoC용 메소드라는걸 인식할수 있도록하는 애노테이션