Inversion of Control
제어의 역전
- 개발자가 프로그램을 제어하지 않고, Framework가 프로그램을 제어하는 것을 의미함
객체 생성
,의존관계 설정(Dependency)
,생명주기(Lifecycle)
등을 Framework가 직접 관리하는 것을 말함
- 컨테이너(Container) : 객체의 생명주기를 관리하고 생성된 인스턴스를 관리함
Spring Framework
에서 객체의 생성과 소멸을 담당하고 의존성을 관리하는 컨테이너를 IoC 컨테이너라고 함IoC 컨테이너 = 스프링 컨테이너
컨테이너 | 의미 |
---|---|
BeanFactory | • 스프링 빈 설정 파일(Spring Bean Configuration File)에 등록된 bean을 생성하고 관리하는 가장 기본적인 컨테이너 |
• 클라이언트 요청에 의해서 bean을 생성함 | |
ApplicationContext | • 트랜잭션 관리, 메시지 기반 다국어 처리 등 추가 기능을 제공 |
• bean으로 등록된 클래스들을 객체 생성 즉시 로딩시키는 방식으로 동작 | |
GenericXmlApplicationContext | • 파일 시스템 또는 클래스 경로에 있는 XML 설정 파일을 로딩하여 <bean> 태그로 등록된 bean을 생성하는 컨테이너 |
AnnotationConfigApplicationContext | • 자바 애너테이션(Java Annotation)에 의해서 bean으로 등록된 bean을 생성하는 컨테이너 |
• @Configuration, @Bean 애너테이션 등이 필요함 |
- 데이터를 저장하는 자바 객체
- 스프링 컨테이너에 등록된 객체
Spring Container
에 의해서 관리되는POJO(Plain Old Java Object)
를 의미한다.<bean>
태그를 사용하면 알아서 객체를 만든다.
<bean>
태그의scope
속성을 생략하면 디폴트는 싱글톤 패턴이다.
- View와 관련이 없는 객체를 정의
Service
,Repository(DAO)
,DB
등과 관련된 Bean을 등록함<bean>
태그를 이용해서 Bean을 등록
- 요청에 관련된 객체를 정의
Controller
,ViewResolver
,Interceptor
등과 관련된 설정을 처리함<beans:bean>
태그를 이용해서 Bean을 등록함
Top Level Package
=Base-Package
- Top Level Package는 절대 수정하면 안 된다.
<property>
태그
Setter
를 이용해서 값(value)을 전달하고 저장- 특정 Bean을 값으로 전달할 때는
ref
속성을 사용한다.작성방법-1
<property name="필드"> <value>값</value> </property>
작성방법-2
<property name="필드" value="값" />
<constructor-arg>
태그
Constructor
를 이용해서 값(value)을 전달하고 저장constructor-arg
는name
명시가 없기 때문에 생성자의 매개변수와 동일하게 반드시 순서대로 전달해야 한다.작성방법-1
<constructor-arg> <value>값</value> </constructor-arg>
작성방법-2
<constructor-arg value="값" />
src/main/resources
파일 - 마우스 우클릭 - New -Spring Bean Configuration File
- (이름 설정은 자유)
- 메인 메소드는 서버(톰캣)가 아닌
Java Application
으로 실행
XML을 이용한 Bean 생성의 한계
- 프로젝트의 규모가 커지면서 XML의 관리가 어려워졌다.
- XML에서는 자바 데이터를 사용하기가 불편하다.
- 애노테이션을 이용하는 새로운 빈 생성 방식이 개발되었다.
- 기존 XML을 이용하는 방식은 애노테이션을 이용한 방식으로 대체되는 중이다.
Spring Boot
프로젝트는 빈 생성을 위한root-context.xml
이나servlet-context.xml
파일을 기본적으로 지원하지 않고 있다.
- 클래스 레벨 애노테이션
@Configuration
이 명시된 클래스는 IocContainer에 Bean을 등록하는 클래스가 된다.@Bean
을 등록하기 위해서는 반드시@Configuration
을 등록해야 한다.
- 메소드 레벨 애노테이션
@Bean
이 명시된 메소드가 반환하는 값이 Bean으로 등록됨- 개발자가 직접 Bean을 만들어서 반환하는 방식
- 스프링은 메소드 이름을 Bean의 이름으로 등록한다.
@Bean(name="")
: Bean에 name속성을 이용해서 이름을 등록할 수 있다. (메소드명은 더이상 사용되지 않으므로 의미가 사라진다.)@Bean
을 사용하는 메소드가 포함된 클래스는 반드시@Configuration
을 사용해야 한다.태그(xml) ‣ 애노테이션