본문 바로가기
스프링 공부

Spring Context 스프링 컨텍스트? 스프링 컨테이너? 개념 정리

by 코딩마스터^^ 2024. 8. 6.

Spring 애플리케이션 컨텍스트(Application Context)는

 

스프링 프레임워크의 핵심 요소로, 애플리케이션의 모든 구성 요소(빈)들을 생성하고 설정하며, 이들 간의 종속성을 관리하는 역할을 합니다. 스프링 컨테이너라고도 불리며, BeanFactory 인터페이스를 확장한 것으로, 더 많은 기능을 제공합니다.

 

 

주요 기능

  1. 빈 관리: 빈(bean) 객체의 생성, 초기화, 소멸을 관리합니다.
  2. 종속성 주입: 빈 간의 의존성을 주입하여 객체를 구성합니다.
  3. 라이프사이클 관리: 빈의 라이프사이클을 관리하며, 빈의 초기화 및 소멸 콜백 메서드를 제공합니다.
  4. 이벤트 발행: 애플리케이션 이벤트를 발행하고 리스너를 등록하여 이벤트 기반 프로그래밍을 지원합니다.
  5. 메시지 소스: 국제화(i18n)를 지원하기 위한 메시지 소스를 제공합니다.
  6. 환경 변수: 환경 변수 및 프로퍼티 파일을 통해 애플리케이션 설정을 관리합니다.

주요 인터페이스와 클래스

  1. ApplicationContext: 애플리케이션 컨텍스트의 핵심 인터페이스입니다.
  2. ConfigurableApplicationContext: 애플리케이션 컨텍스트를 설정하고 갱신하는 메서드를 정의합니다.
  3. GenericApplicationContext: 기본 애플리케이션 컨텍스트 구현체입니다.
  4. AnnotationConfigApplicationContext: 자바 기반의 설정 클래스를 사용하는 애플리케이션 컨텍스트입니다.
  5. 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)

스프링 컨테이너가 인스턴스화, 관리, 그리고 조립하는 객체입니다. 스프링은 애플리케이션의 구성 요소를 빈으로 관리하며, 빈 관리 기능은 애플리케이션의 종속성을 설정하고, 객체의 생명주기를 제어하는 중요한 역할을 합니다.

빈 관리의 주요 개념

  1. 빈 정의: 빈을 스프링 컨테이너에 등록하는 과정입니다. 빈은 XML 파일, 자바 설정 파일, 또는 어노테이션을 통해 정의할 수 있습니다.
  2. 빈 인스턴스화: 스프링 컨테이너가 빈 정의를 바탕으로 빈을 생성하는 과정입니다.
  3. 빈 초기화: 빈이 생성된 후 초기화 작업을 수행합니다. 이 단계에서 필요한 설정을 완료합니다.
  4. 빈 사용: 애플리케이션이 빈을 사용합니다.
  5. 빈 소멸: 애플리케이션 종료 시 빈의 소멸 작업을 수행합니다.

 

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는 상속받으며 다른 기능들이 필요하기 때문에 또 다른 인터페이스를 상속받습니다.

댓글