Spring/Computer Science
04. Bean
연어조아
2021. 9. 26. 21:03
728x90
Bean
- Spring IoC 컨테이너가 관리하는 자바 객체를 빈(Bean)이라는 용어로 부른다.
- 우리가 new 연산자로 어떤 객체를 생성했을 때 그 객체는 빈이 아니다.
- ApplicationContext.getBean()으로 얻어질 수 있는 객체는 빈이다.
- 즉 Spring에서의 빈은 ApplicationContext가 알고있는 객체, 즉 ApplicationContext가 만들어서 그 안에 담고있는 객체를 의미한다.
앞선 포스팅된 순수 자바 코드로 작성된 DI를 스프링에 적용해보자
AppConfig 스프링 기반으로 변경
@Configuration
public class AppConfig {
@Bean
public Computer computer() {
return new ComputerImpl(keyBoard());
}
@Bean
public KeyBoard keyBoard() {
return new SamsungKeyBoard();
}
}
- AppConfig에 설정을 구성한다는 뜻의 @Configuration 을 붙여준다.
- 각 메서드에 @Bean 을 붙여준다. 이렇게 하면 스프링 컨테이너에 스프링 빈으로 등록한다
public class Test {
public static void main(String[] args) {
ApplicationContext applicationContext = new
AnnotationConfigApplicationContext(AppConfig.class);
Computer computer = applicationContext.getBean("Computer",
Computer.class);
System.out.println("computer" + computer);
}
}
이러면 등록된 samsungKeyboard가 실행된다.
스프링 컨테이너
- ApplicationContext 를 스프링 컨테이너라 한다.
- 기존에는 개발자가 AppConfig 를 사용해서 직접 객체를 생성하고 DI를 했지만, 이제부터는 스프링 컨테이 너를 통해서 사용한다.
- 스프링 컨테이너는 @Configuration 이 붙은 AppConfig 를 설정(구성) 정보로 사용한다.
- 여기서 @Bean 이라 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다.
- 이렇게 스프링 컨테이너에 등록된 객체를 스프링 빈이라 한다.
- 스프링 빈은 @Bean 이 붙은 메서드의 명을 스프링 빈의 이름으로 사용한다.
- 이전에는 개발자가 필요한 객체를 AppConfig 를 사용해서 직접 조회했지만,
- 이제부터는 스프링 컨테이너 를 통해서 필요한 스프링 빈(객체)를 찾아야 한다.
- 스프링 빈은 applicationContext.getBean() 메서드 를 사용해서 찾을 수 있다.
스프링 컨테이너의 생성 과정
1. 스프링 컨테이너 생성
- new AnnotationConfigApplicationContext(AppConfig.class)
- 스프링 컨테이너를 생성할 때는 구성 정보를 지정해주어야 한다.
- 여기서는 AppConfig.class 를 구성 정보로 지정했다
2. 스프링 빈 등록
@Configuration
public class AppConfig {
@Bean
public Computer computer() {
return new ComputerImpl(keyBoard());
}
@Bean
public KeyBoard keyBoard() {
return new SamsungKeyBoard();
}
}
- 스프링 컨테이너는 파라미터로 넘어온 설정 클래스 정보를 사용해서 스프링 빈을 등록한다
3. 스프링 빈 의존관계 설정
- 스프링 컨테이너는 설정 정보를 참고해서 의존관계를 주입(DI)한다.
- 단순히 자바 코드를 호출하는 것 같지만, 차이가 있다.
BeanFactory와 ApplicationContext beanFactory
- BeanFactory
- 스프링 컨테이너의 최상위 인터페이스다.
- 스프링 빈을 관리하고 조회하는 역할을 담당한다.
- getBean() 을 제공한다
- ApplicationContext
- BeanFactory 기능을 모두 상속받아서 제공한다.
- 빈을 관리하고 검색하는 기능을 BeanFactory가 제공해준다.
- 애플리케이션을 개발할 때는 빈은 관리하고 조회하는 기능은 물론이고, 수 많은 부가기능이 필요하다.
다양한 설정 형식 지원 - 자바 코드, XML
ApplicaiontContext를 상속받아 다양한 방식으로 bean을 설정할 수 있다.
- 애노테이션 기반 자바 코드 설정 사용
- 많이 사용한다.
- new AnnotationConfigApplicationContext(AppConfig.class)
- AnnotationConfigApplicationContext 클래스를 사용하면서 자바 코드로된 설정 정보를 넘기면 된다.
- 스프링 빈 설정 메타 정보 - BeanDefinition
- BeanDefinition 추상화를 통해 위의 다양한 설정 형식을 가지고 있다.
- 스프링 컨테이너는 BeanDefiniton을 의존하고 있고 각 설정 정보들은 BeanDefinition을 만들어서 설정한다.
- BeanDefinition 추상화를 통해 위의 다양한 설정 형식을 가지고 있다.
참고
- https://mangkyu.tistory.com/150
- 인프런, 김영한 스프링 기본편
- https://hongchangsub.com/springcore4/