스프링 컨테이너와 빈

SionBackEnd·2022년 8월 15일
0

Spring(봄)

목록 보기
4/22
post-thumbnail

스프링 컨테이너는 스프링 프레임워크의 핵심 컴포넌트이다.

스프링 컨테이너는 내부에 존재하는 애플리케이션 빈의 생명주기를 관리한다.
BEAN 생성, 관리, 제거 등의 역활을 담당한다.

스프링컨테이너가 우리를 대신하여 객체를 관리해주는 핵심 컴포넌트였다.

스프링 컨테이너

스프링 컨테이너는 ApplicationContext이고, 인터페이스로 구현되어있다. (다형성 적용)

public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,  
      MessageSource, ApplicationEventPublisher, ResourcePatternResolver {

스프링 컨테이너는 XML, 애너테이션 기반의 자바 설정 클래스로 만들수 있다. 또한 컨테이너는 개발자가 정의한 Bean을 객체로 만들어 관리하다가 개발자가 필요로 할 때 제공해준다.

의존성 주입을 통해 애플리케이션의 컴포넌트를 관리힌다

-   스프링 컨테이너는 서로 다른 빈을 연결해 애플리케이션의 빈을 연결하는 역할을 한다.
-   개발자는 모듈 간에 의존 및 결합으로 인해 발생하는 문제로부터 자유로울 수 있다.
-   메서드가 언제, 어디서 호출되어야 하는지, 메서드를 호출하기 위해 필요한 매개 변수를 준비해서 전달하지 않는다.

빈은 컨테이너가 만들고 관리하는 객체를 부르는 별명이고 이전에 제어의 역전에서 말했던 것 처럼 컨테이너가 제어를 하는것이다.

스프링 컨테이션 생성 코드

// Spring Container 생성
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);

스프링 컨테이너의 대단한 점은 스프링 빈 조회에서 상속관계가 있을 시 부모타입으로 조회하면 자식 타입도 함께 조회한다는 점이다. 스프링이 알아서 자식객체까지 찾아서 정확한 정보를 가져다 준다는게 참으로 신기하다.

스프링 컨테이너의 종류

BeanFactoroy

  • 스프링 컨테이너의 최상위 인터페이스로서 빈을 등록하고 생성하고 조회하고 돌려주는 등 빈을 관리하는 역활을한다.
  • getBean()메서드를 통해 빈을 인스턴스화할 수 있다.
  • @Bean이 붙은 메서드의 명을 스프링 빈의 이름으로 사용해 빈을 등록한다.
    - 이말을 통해 빈은 이름을 가지고 있고 빈의 이름은 메서드 명을 그대로 사용한다라고 이해할 수 있다.

ApplicationContext

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

컨테이너 인스턴스화

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

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

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

스프링 빈

스프링 컨테이너에 의해 관리되는 재사용 소프트웨어 컴포넌트이다. 또한 Spring컨테이너가 관리하는 자바 객체를 의미하고 하나 이상의 빈을 관리한다.

내가 헷갈린 이유는 빈과 스프링 빈이 다르다는 점을 모른것같다.
빈은 자바 빈, 스프링 빈 이렇게 두개로 나눌수 있는데 두개는 분명하게 다르다.

자바 빈의 경우 단순하게 클래스에서 Getter / Setter만 가지고 있는 클래스를 의미한다. 게터세터외 다른 것을 가지고 있다면, 그것은 자바빈이라고 말하지 않는다.

스프링 빈의 경우는 위에서 말했듯이 스프링 컨테이너에 의해 관리되는 재사용 소프트웨어 컴포넌트이다. 또한 Spring컨테이너가 관리하는 자바 객체를 의미하고 하나 이상의 빈을 관리한다.

  • 빈은 인스턴스화된 객체를 의미한다.
  • 스프링 컨테이너가 관리하는 객체를 스프링 빈이라고 부른다.
  • 자바 빈은 게터와 세터만 존재하는 클래스를 의미한다.

알아둘 애너테이션

  • @Configuration : 구성정보를 담당하는것을 설정할때 @Configuration 을 붙여줍니다.
  • @Bean : 각 메서드에 @Bean을 붙이면 스프링 컨테이너에 자동으로 등록이 됩니다.
// AppConfig 클래스
컨텍스트를 인스턴스화할 때
@Configuration
public class AppConfig {

    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}
profile
많은 도움 얻어가시길 바랍니다!

0개의 댓글