[Spring Core] Spring Container & Bean

grapefruit·2022년 10월 19일
0

BE 2022-10.10~10.14

목록 보기
7/8

👨🏻‍💻스프링 컨테이너(Spring Container)

스프링 컨테이너는 내부에 존재하는 애플리케이션 빈의 생명주기를 관리한다.
스프링에서 자바 객체들을 관리하는 공간을 말한다. 자바 객체를 스프링에선 빈(Bean)이라고 하는데, 스프링 컨테이너에서는 이 빈의 생성부터 소멸까지를 개발자 대신 관리해주는 곳이라고 할 수 있다.
즉, Bean 생성, 관리, 제거 등의 역할을 담당한다.


👨🏻‍💻스프링 컨테이너 생성

ApplicationContext applicationContext = 
new AnnotationConfigApplicationContext(AppConfig.class);


👨🏻‍💻ApplicationContext 인터페이스 구현체 확인법

스프링 컨테이너를 만드는 다양한 방법은 ApplicationContext 인터페이스의 구현체다.

Mac에서 Cmd + O → 클래스에서 ApplicationContext로 검색
Windows에서 Ctrn + N → 클래스에서 ApplicationContext로 검색
화면에서 가장 첫번째 파일인 ApplicationContext 인터페이스를 구현한 하위 클래스들이 나오는 걸 확인할 수 있다.


👨🏻‍💻스프링 컨테이너의 종류

BeanFactory

스프링 컨테이너의 최상위 인터페이스다.

  • BeanFactory는 빈을 등록하고 생성하고 조회하고 돌려주는 등 빈을 관리하는 역할을 한다.

  • getBean() 메소드를 통해 빈을 인스턴스화할 수 있다.

  • @Bean이 붙은 메서드의 명을 스프링 빈의 이름으로 사용해 빈 등록을 한다.

ApplicationContext

  • BeanFactory의 기능을 상속받아 제공한다.

  • 빈을 관리하고 검색하는 기능을 BeanFactory가 제공하고 그 외에 부가기능을 제공한다.

  • 부가 기능 (참고용)

    • MessageSource: 메세지 다국화를 위한 인터페이스
    • EnvironmentCapable: 개발, 운영 등 환경변수 등으로 나눠 처리하고, 애플리케이션 구동 시 필요한 정보들을 관리하기 위한 인터페이스
    • ApplicationEventPublisher: 이벤트 관련 기능을 제공하는 인터페이스
    • ResourceLoader: 파일, 클래스 패스, 외부 등 리소스를 편리하게 조회

👨🏻‍💻컨테이너 인스턴스화

ApplicationContext 생성자에 제공된 위치 경로 또는 경로는 컨테이너가 로컬 파일 시스템, Java CLASSPATH 등과 같은 다양한 외부 리소스로부터 구성 메타데이터를 로드할 수 있도록 하는 리소스 문자열이다.

// Annotation
ApplicationContext context = new AnnotationConfigApplicationContext(DependencyConfig.class);

// XML
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");

빈(Bean)

  • 빈(bean)은 인스턴스화된 객체를 의미한다.

  • 스프링 컨테이너에 등록된 객체를 스프링 빈이라고 한다.

  • @Bean이 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다.

  • 빈은 클래스의 등록정보, 게터/세터 메서드를 포함한다.

  • 빈은 컨테이너에 사용되는 설정 메타데이터로 생성된다.

👨🏻‍💻bean 접근 방법

ApplicationContext 사용하여 bean 정의를 읽고 액세스할 수 있습니다.

// create and configure beans
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");

// retrieve configured instance
PetStoreService service = context.getBean("memberRepository", memberRepository.class);

// use configured instance
List<String> userList = service.getUsernameList();

👨🏻‍💻BeanDefinition

스프링은 다양한 설정 형식을 BeanDefinition이라는 추상화 덕분에 지원할 수 있는 것이다.

Bean은 BeanDefinition(빈 설정 메타정보)으로 정의되고 BeanDefinition에 따라서 활용하는 방법이 달라지게 된다.

BeanDefinition (빈 설정 메타정보)

  • 속성에 따라 컨테이너가 Bean을 어떻게 생성하고 관리할지 결정한다.
  • @Bean or 당 각 1개씩 메타 정보가 생성된다.
  • Spring이 설정 메타정보를 BeanDefinition 인터페이스를 통해 관리하기 때문에 컨테이너 설정을 XML, Java로 할 수 있는 것이다.
profile
개발자몽

0개의 댓글