Spring Context 스프링 컨텍스트? 스프링 컨테이너? 개념 정리
Spring 애플리케이션 컨텍스트(Application Context)는
스프링 프레임워크의 핵심 요소로, 애플리케이션의 모든 구성 요소(빈)들을 생성하고 설정하며, 이들 간의 종속성을 관리하는 역할을 합니다. 스프링 컨테이너라고도 불리며, BeanFactory 인터페이스를 확장한 것으로, 더 많은 기능을 제공합니다.
주요 기능
- 빈 관리: 빈(bean) 객체의 생성, 초기화, 소멸을 관리합니다.
- 종속성 주입: 빈 간의 의존성을 주입하여 객체를 구성합니다.
- 라이프사이클 관리: 빈의 라이프사이클을 관리하며, 빈의 초기화 및 소멸 콜백 메서드를 제공합니다.
- 이벤트 발행: 애플리케이션 이벤트를 발행하고 리스너를 등록하여 이벤트 기반 프로그래밍을 지원합니다.
- 메시지 소스: 국제화(i18n)를 지원하기 위한 메시지 소스를 제공합니다.
- 환경 변수: 환경 변수 및 프로퍼티 파일을 통해 애플리케이션 설정을 관리합니다.
주요 인터페이스와 클래스
- ApplicationContext: 애플리케이션 컨텍스트의 핵심 인터페이스입니다.
- ConfigurableApplicationContext: 애플리케이션 컨텍스트를 설정하고 갱신하는 메서드를 정의합니다.
- GenericApplicationContext: 기본 애플리케이션 컨텍스트 구현체입니다.
- AnnotationConfigApplicationContext: 자바 기반의 설정 클래스를 사용하는 애플리케이션 컨텍스트입니다.
- ClassPathXmlApplicationContext: XML 설정 파일을 사용하는 애플리케이션 컨텍스트입니다.
자바기반 설정
1. 구성 클래스
자바 클래스를 통해 빈을 정의함
빈 이름은 메소드 이름!
package com.example.demo.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyService();
}
}
2. 서비스클래스
package com.example.demo.service;
public class MyService {
public String sayHello() {
return "Hello, Spring!";
}
}
3. 어플리케이션 클래스
package com.example.demo;
import com.example.demo.config.AppConfig;
import com.example.demo.service.MyService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class DemoApplication {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
MyService myService = context.getBean(MyService.class);
System.out.println(myService.sayHello());
}
}
스프링 프레임워크에서 빈(bean)은
스프링 컨테이너가 인스턴스화, 관리, 그리고 조립하는 객체입니다. 스프링은 애플리케이션의 구성 요소를 빈으로 관리하며, 빈 관리 기능은 애플리케이션의 종속성을 설정하고, 객체의 생명주기를 제어하는 중요한 역할을 합니다.
빈 관리의 주요 개념
- 빈 정의: 빈을 스프링 컨테이너에 등록하는 과정입니다. 빈은 XML 파일, 자바 설정 파일, 또는 어노테이션을 통해 정의할 수 있습니다.
- 빈 인스턴스화: 스프링 컨테이너가 빈 정의를 바탕으로 빈을 생성하는 과정입니다.
- 빈 초기화: 빈이 생성된 후 초기화 작업을 수행합니다. 이 단계에서 필요한 설정을 완료합니다.
- 빈 사용: 애플리케이션이 빈을 사용합니다.
- 빈 소멸: 애플리케이션 종료 시 빈의 소멸 작업을 수행합니다.
https://any-ting.tistory.com/144
[Spring Boot] 구조 분석 (2) - 스프링 컨테이너
- 지난 시간 안녕하세요. 지난 시간에는 @SpringBootApplication에 대해 알아봤습니다. @SpringBootApplication에 대해 대한 아주 기본적인 용어와 많은 내용을 담고 있기 때문에 꼭 학습하고 오시는 걸 추천
any-ting.tistory.com
1. 스프링 컨테이너란
스프링 컨테이너는 클래스 객체의 생명 주기를 관리하는 역할을 합니다.
객체의 생명주기?? 말 그대로 Spring Boot 서버가 시작하면 @Bean 어노테이션으로 선언한 객체를 미리 생성하고 소멸시키는 역할을 합니다.
여기서 말하는 @Bean은 바로 클래스 객체입니다. 또한 여기서는 Ioc와 DI의 원리가 적용됩니다.
Java라는 언어는 클래스와 그 클래스를 생성한 객체를 다루는 언어입니다. 그렇기 때문에 개발자는 new 연산자를 통해 해당 클래스를 그때그때 생성합니다. 여기서 new 연산자를 통해 클래스를 생성할 때 많은 리소스가 사용됩니다.
그렇기 때문에 Spring 프레임워크에서 @Bean으로 설정한 부분을 통해 해당 클래스를 객체화해서 Spring Container에 등록하여 new 연산자를 대신에서 수행합니다.
@Bean에 이름은 메서드 이름을 사용합니다. useRepository라고 메서드를 선언했기 때문에 이름이 useRepository입니다.
또한, 이름을 직접 설정할 수 있습니다.
@Bean(name="userMemoryRepository") 이런 식으로 직접 설정할 수 있습니다.
- 주의 사항!! -
Spring Container는 빈 이름을 항상 다르게 설정해야 합니다.
만약 이름이 동일하다면 Spring Container는 이름이 충돌난다고 알려줍니다.
내가 맨날 충돌났던거.... 메소드 이름 생각하는게 제일 어렵다^^
2. BeanFactory와 ApplicationContext
Spring Container는 BeanFactory와 ApplicationContext가 있습니다.
사실 실무에서는 실제 등록된 빈을 조회 하거나 조작하지 않기 때문에 어느 정도 이런 개념이 있다고 생각하시면 좋습니다!
이 두 인터페이스를 설명하는 이유는 우리가 Spring Boot 프로젝트를 생성했을 때 main 메서드가 실행되는 SpringApplication.run(...)
이라는 코드가 있습니다.
SpringApplication 클래스를 확인하면 최상의 주석에 이런 내용이 있습니다.
Class that can be used to bootstrap and launch a Spring application from a Java main method. By default class will perform the following steps to bootstrap your
application: Create an appropriate {@link ApplicationContext} instance (depending on your classpath)
Java 주 메서드에서 Spring 응용 프로그램을 부트스트랩 하고 시작하는 데 사용할 수 있는 클래스입니다. 기본적으로 클래스는 부트스트랩을 위해 다음 단계를 수행합니다.
응용 프로그램: 클래스 경로에 따라 적절한 {@link ApplicationContext} 인스턴스 생성
즉, 우리가 생성한 서버는 결국 ApplicationContext를 참조해서 사용한다는 걸 알 수 있습니다. 그리고 각각의 @Bean을 등록합니다.
BeanFactory는 최상위 인터페이스이며 @Bean을 생성하고 관리합니다. 이 기능을 ApplicationContext는 상속받으며 다른 기능들이 필요하기 때문에 또 다른 인터페이스를 상속받습니다.