간단하게 요약하자면, Spring이 관리하는 객체를 가져와 사용하는 것을 말한다.
IoC Contrainer(스프링 컨테이너)란 Bean을 생성하고 관리한다. 즉, Bean이 생성되고 소멸되기까지의 생명주기를 스프링 컨테니어네서 관리하는 것이다.
추가로, 여기서 스프링 컨테이너에서 관리되는 Bean에 대한 종속성을 주입시키는 것을 DI (Dependency Injection) 라고 한다.
앞서 적힌 내용과 같이 Bean이란 스프링 컨테이너가 생성하고 관리하는 객체이다.
아래 코드에서 Car
객체가 해당된다.
@Service
public class TestService {
@Autowired
Car car;
}
개발자는 스프링 컨테이너에게 해당 객체를 생성해 달라고 요청해야한다. 이 행위를 Bean 등록이라고 일컫는다.
그 방법에는 XML 파일 설정, Annotation 추가 등의 여러가지가 있다. 주로 Annotation을 사용하며 대표적인 방법은 아래 코드와 같으며 다양한 어노테이션이 존재한다.
@Component // Car 클래스를 통해 car Bean으로 등록
public class Car {
...
}
이때 Bean의 이름은 Class명의 첫글자를 소문자로 바꿔 정의된다. (Bean 이름 또한 개발자가 따로 정의해줄수 있다.)
org.springframework.beans
org.springframework.context
BeanFactory
: 모든 Object 타입을 관리할 수 있는 메커니즘 제공하는 인터페이스이다.ApplicationContext
: BeanFactory의 하위 인터페이스로 추가 기능을 제공한다.org.springframework.beans.factory.BeanFactory
org.springframework.context.ApplicationContext
설정 메타데이터란 간략하게 어떤 객체를 어떻게 사용할 지에 대한 정보를 다룬다.
주로 나는 Java기반 Annotation으로 설정하고 있다.
@Configuration
@Bean
@Controller
@Service
등의 어노테이션이 달린 클래스가 Spring에 의해 Bean 등록이 되고 관리된다.
이후 @Autowired
어노테이션을 통해 IoC되고 있는 Bean을 가져다가 사용한다.
이렇게 Spring에 의해 어떤 객체를 Bean으로 등록할 것인지, 언제 의존성 주입(DI)을 통해 가져다가 사용할 것인지 등의 정보를 Configuration Metadata(설정 메타데이터)라고 한다.
❓ @Autowired를 사용하지 않고 Bean를 가져오는 방법은?
ApplicationContext
의getBaen()
메소드를 통해 직접 Spring이 관리하는 Bean을 가져와 사용할 수 있다.ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml"); PetStoreService service = context.getBean("petStore", PetStoreService.class);
❓ Configuration Metadata는 어떻게 xml, java, Groovy등 다양한 언어가 가능한걸까?
BeanDefinition
interface 가 존재한다.- Java annotation을 사용한 경우
AnnotationConfigApplicationContext
가AnnotatedBeanDefinitionReader
를 통해 Spring이 관리할 Bean 정보들을 읽고BeanDefination
을 생성한다.- Xml을 사용한 경우
GenericXmlApplicationContext
가XmlBeanDefinitionReader
를 통해 appConfig.xml 설정 정보를 읽고BeanDefination
을 생성한다.- 그외 형식들도 마찬가지로
xxxBeanDefinationReader
를 통해BeanDefination
을 생성한다.
이렇듯 해당 언어를 처리 할 수 있는 ApplicationContext가 동작하여 설정 메타데이터를 만든다.
객체간의 결합도를 줄이고 유연한 코드를 작성할 수 있다. 이로 인해 코드의 재사용성이 높아지며, 유지보수가 편리해 진다.
Spring이 Bean을 관리해주기 때문에 개발자는 비즈니스 개발 영역에 좀더 집중 할 수 있다.