Home 스프링 컨테이너와 스프링 빈
Post
Cancel

스프링 컨테이너와 스프링 빈

스프링 컨테이너의 생성

1
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
  1. 스프링 컨테이너 생성

스프링 컨테이너를 생성할 떄는 구성 정보를 지정해주어야 한다. (AppConfig.class)

  1. 스프링 빈 등록

메서드 이름이 빈 이름이 되고, return값을 빈 객체로 등록하게 된다.

** 빈 이름을 따로 설정할 수 있다. 단, 빈 이름은 중복이 되면 안된다.

  1. 스프링 빈 의존관계 설정 - 준비

  1. 스프링 빈 의존관계 설정 - 완료

스프링 컨테이너는 설정 정보를 참고해서 의존관계를 주입한다.

단순히 자바 코드를 호출하는 것 같지만 차이가 있다. 이 차이는 뒤에서 설명한다.

빈(Bean) 조회하기

테스트코드를 작성하여 등록된 빈 모두를 볼 수 있다.

AppConfig도 빈에 등록되는 것을 볼 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ac.getBean("memberService", MemberService.class); // 이름으로
ac.getBean("memberService", MemberServiceImpl.class); //구체로
ac.getBean(MemberService.class); // 이름없이 타입으로

@Bean
memberService1() { return MemberService;}
@Bean
memberService2() { return MemberService;}

//이러한 클래스가 있다면 이름없이 타입으로 조회했을 때 중복오류 발생
//이런 경우 이름으로 getBean 해주어야 한다.

Map<String, MemberRepository> beans = ac.getBeansOfType(MemberService);

//key, value를 이용해 모두 가져올 수도 있다.

*빈 조회 - 상속관계

  • 부모타입으로 조회하면, 자식 타입도 함께 조회한다.
  • 그래서 모든 자바 객체의 최고 부모인 ‘Object’ 타입으로 조회하면 모든 스프링 빈을 조회한다.
1
2
3
4
5
6
7
8
9
10
11
@Bean
public DiscountPolicy rateDiscountPolicy(){
	return new rateDiscountPolicy();
}

@Bean
public DiscountPolicy fixDiscountPolicy(){
	return new fixDiscountPolicy();
}

//이렇게 존재할 때, ac.getBean(DiscountPolicy.class); 하면 중복 발생한다.

BeanFactory와 ApplicationContext

BeanFactory

  • 스프링 컨테이너의 최상위 인터페이스
  • 스프링 빈을 관리하고 조회하는 역할
  • getBean() 제공

ApplicationContext

  • 빈을 관리하고 검색하는 기능을 BeanFactory가 제공해주는데, 그러면 둘의 차이가 뭘까?
  • 애플리케이션을 개발할 때는 빈은 관리하고 조회하는 기능은 물론이고, 수 많은 부가 기능이 필요하다.

  • 메시지 소스를 활용한 국제화 기능 ( 한국 - 한국어, 영어권 - 영어)
  • 환경 변수 - 로컬, 개발, 운영등을 구분해서 처리
  • 애플리케이션 이벤트 - 이벤트를 발행하고 구독하는 모델을 편리하게 지원
  • 편리한 리소스 조회 - 파일, 클래스패스, 외부 등에서 리소스를 편하게 조회

** ApplicationContext를 스프링 컨테이너라 한다.

다양한 설정 형식 지원 - 자바코드, XML

스프링 컨테이너는 다양한 형식의 설정 정보를 받아들일 수 있도록 유연하게 설계되어 있다.

애노테이션 기반 자바코드 설정 사용이 여지껏 해왔던 방법.

XML 설정 사용

최근에는 스프링부트를 많이 사용하면서 XML 기반의 설정은 잘 사용하지 않는다. 하지만 아직 많은 레거시 프로젝트들이 XML로 되어 있고, 또 XML을 사용하면 컴파일 없이 빈 설정 정보를 변경할 수 있는 장점도 있으므로 한번쯤 배워두는 것도 좋다.

-> appConfig.xml

1
2
ApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml");
//이 코드를 사용해 사용한다.

스프링 빈 설정 메타정보 - BeanDefinition

스프링은 어떻게 이런 다양한 설정 형식을 지원하는 것일까?

그 중심에는 ‘BeanDefinition’ 이라는 추상화가 있다.

역할과 구현을 개념적으로 나눈 것이다.

  • XML을 읽어서 BeanDefinitinon을 만든다.
  • 자바 코드를 읽어서 BeanDefinition을 만든다.

스프링 컨테이너는 자바 코드인지, XML인지 몰라도 된다. 오직 BeanDefinition만 알면 된다.

BeanDefinition을 빈 설정 메타정보라 한다.

@Bean, Bean 태그 당 각각 하나씩 메타정보가 생성된다.

스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성한다.

BeanDefinition을 직접 정의하거나 사용할 일은 거의 없다.

그저 스프링이 다양한 형태의 설정 정보를 BeanDefinition으로 추상화해서 사용하는 것 정도만 이해하면 된다.

This post is licensed under CC BY 4.0 by the author.