Spring Container 정리

Song_MinGyu·2022년 6월 26일
0

Spring 정리

목록 보기
8/10

Spring Container

  • 간단히 요약하면 자바 객체를 세밀하게 관리할 수 있다.
  • 해당 자바 객체는 Bean이라고 부르며, 해당 컨테이너에 들어간 Bean들은 객체가 생성되어 관리되며, KEY:OBJECT 형태로 관리된다.
  • 따라서 IoC, DI, 그리고 객체에 대한 생명주기를 관리할 수 있다.
  • 스프링 컨테이너의 경우, Class, XML 등 다양한 형태로 관리 할 수 있다.

BeanFactory와 ApplicationContext

  • BeanFactory
    • 스프링 컨테이너의 최상위 인터페이스
    • 스프링 빈을 관리하고 조회하는 역할을 담당
    • getBean()을 제공한다.
    • 지금까지 우리가 사용했던 대부분의 기능은 BeanFactory가 제공하는 기능
  • ApplicationContext
    • ApplicationContext를 스프링 컨테이너라고 한다.
    • ApplicationContext는 인터페이스이다.
    • 스프링 컨테이너는 XML을 기반으로 만들 수 있고, 애노테이션 기반의 자바 설정 클래스로 만들 수 있다.
    • 직전에 AppConfig를 사용했던 방식이 애노테이션 기반의 자바 설정 클래스로 스프링 컨테이너를 만든 것
    • 자바 설정 클래스를 기반으로 스프링 컨테이너 제작
      • new AnnotationConfigApplicationContext(AppConfig.class);
      • 해당 클래스는 ApplicationContext 인터페이스의 구현체
      • BeanFactory의 기능을 전부 상속
      • 빈을 관리하고 조회하는 기능은 몰론, 수 많은 부가기능이 추가되어있음
        • 메시지소스를 활용한 국제화 기능
          • 예로 한국에서 들어오면 한국어, 영어로들어오면 영어..
        • 환경변수
          • 로컬, 개발, 운영 구분하여 처리 가능
        • 애플리케이션 이벤트
          • 이벤트를 발행하고 구독하는 모델을 편리하게 지원
        • 편리한 리소스 조회

Java Annotation을 이용한 Spring Container 생성

@Configuration
public class AppConfig {
	@Bean
    public AService aService() {
    	return new AServiceImpl(aRepository());
    }
    @Bean
    public aRepository() {
    	return new mARepository();
    }
}
  • 우선 위와 같은 DI 주입 클래스를 작성한다.
  • 그리고 일반적인 DI 주입 클래스와는 달리 스프링에서는 @Configuration,@Bean이란 Annotation을 추가시키는 것을 볼 수 있다.
  • 해당 Annotation을 사용하게 된다면 Spring Container를 생성하고 그 내부에 Bean들을 집어넣게 된다.
  • 스프링 컨테이너를 사용하게 된다면 컨테이너의 내부 객체들은 처음 호출 될 당시 1회만 객체를 생성하여 관리하는 싱글톤 형태로 관리하게 된다(스프링 싱글톤 컨테이너 포스팅에 상세 설명 )

XML을 이용한 Spring Container 생성

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  <bean id="aService" class="package.package....AServiceImpl">
    <constructor-arg name="aRepository" ref="mARepository"/>
  </bean>
  <bean id="aRepository" class="package.package...mARepository"/>
</beans>
  • XML 파일을 이용해서 Spring Container를 생성할 수 있다.
  • 기본적인 컨테이너 생성 방법은 비슷하다.
  • XML 파일로 컨테이너를 관리하기 때문에, 컴파일에서 비교적 자유롭다.
  • bean 안에 id, class를 작성하면 bean 생성이 된다.
    • id: java class를 이용하여 생성할 때 메서드의 이름과 같다.
    • class: 생성할 객체, 구체적인 경로까지 전부 작성해야한다.
    • constructor-arg
      • 생성할 객체 내부의 파라미터를 작성
        • 해당 코드에서는 bean을 호출, 따라서 아래에 있는 bean을 호출한다.

Spring Container 조회 방법

Spring Container 생성

//Annotation
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

//XML
GenericXmlApplicationContext genericXmlApplicationContext = new GenericXmlApplicationContext("appConfig.xml");
  • 해당 두 객체를 생성하면 스프링 컨테이너가 생성된다.
  • DI 주입할 클래스를 바이트 형태로 입력받는데, 이 것은 CGLIB 클래스가 상속하여 해당 객체가 스프링 컨테이너를 만드는데, 자세한 내용은 스프링 싱글톤 컨테이너에서 설명

Bean 조회(AnnotationContextApplication)

/*1. bean 이름으로 조회*/
AService aService = ac.getBean("aService",AService.class);

/*2. 이름없이 타입으로 조회*/
AService aService = ac.getBean(AService.class);

/*3. 구체 타입으로 조회 -> 좋은 방법은 아니다.*/
AService aService = ac.getBean(AService.class,AServiceImpl.class);

/*4. 조회 실패 NoSuchBeanDefinitionException error*/
Aservice aService = ac.getBean("xxxxx",AService.class);

/*5. 모든 Bean 조회*/
String[] beanNames = ac.getBeanDefinitionNames();

//타입 조회에서 여러개가 조회된다면 NoUniqueBeanDefinitionException Error 발생
//Bean 이름으로 지정해야한다.

/*6. 특정 타입 전부 조회*/
Map<String, AService> beansOfType = ac.getBeansOfType(AService.class);

상속관계에 있는 클래스 중 상위 클래스를 호출 할 경우 그 하위 클래스 까지 전부 호출할 수 있다.

//하위 클래스가 두 개 이상 있을 경우, NoUniqueBeanDefinitionException Error 발생
//따라서 정확힌 Bean 이름을 지정한다면 해당 에러 해결 가능하다.

//상위 클래스 타입으로 하위 클래스 전부 조회
Map<String, AService> beansOfType = ac.getBeansOfType(AService.class);
profile
Always try to Change and Keep this mind

0개의 댓글