처음부터 차근차근

[Spring] Spring Container와 Spring Bean 본문

FrameWork/Spring

[Spring] Spring Container와 Spring Bean

HangJu_95 2024. 1. 14. 15:24
728x90

저번 포스팅에서는 객체 지향적으로 코드를 작성하고, 연결해봤으며, Spring을 사용할 경우 간단하다는 것을 알게 되었습니다.

이번에는 Spring을 통해 각 객체마다 어떻게 연결이 간편하게 되는지 알아보겠습니다.

Spring Container와 Spring Bean

스프링 컨테이너는 자바 객체의 생명 주기를 관리하며, 생성된 자바 객체들에게 추가적인 기능을 제공합니다. 그리고 스프링에서는 자바 객체를 빈(Bean)이라 합니다.

 

Spring에 있는 자바 객체는 Repository, Service, Controller 등 다양한 객체가 있는데, 이들이 결합하여 하나의 Spring Application을 만드는 것입니다.

이때 이 자바 객체를 Component라고 부르기도 합니다. 

(Component : 하나의 부품이며, 다른 부품과 결합되어 어떠한 큰 것을 만드는 부품이라고 합니다.)

 

스프링 컨테이너는 내부에 존재하는 빈의 생명주기를 관리(빈의 생성, 관리, 제거 등)을 하며, 생성된 빈에게 추가적인 기능을 제공합니다.

 

스프링 컨테이너를 생성하는 방법은 XML, Annotation 등 다양한 기반으로 Config 클래스로 만들 수 있습니다.

Spring Boot가 만들어지기 전에는 XML을 통해 직접적으로 설정해줘야 했지만, 지금은 스프링 부트가 Annotation을 통해 등록할 수 있어서 XML은 잘 사용하지 않습니다.

Spring Container 생성 과정

1. Spring Container 생성

스프링 컨테이너를 먼저 생성합니다. 이때 AppConfig.class 등의 구성 정보를 지정하여 스프링 컨테이너를 생성할 수 있습니다. 이렇게 만들어진 스프링 컨테이너에 이제 빈을 등록할 차례입니다

2. Spring bean 등록

스프링 컨테이너는 파라미터로 넘어온 설정 클래스 정보를 사용해서 스프링 빈을 등록합니다.

이때 Annotation으로 AppConfig를 설정할 경우, 빈 이름에 기본적으로 메서드 이름이 등록되지만, 빈 이름을 직접 부여할 수 있습니다.

Ex) @Bean(name="memberService2")

  • 여기서 주의할 점은 빈 이름은 항상 다른 이름을 부여해야 합니다. 같은 이름을 부여하면, 다른 빈이 무시되거나, 기존 빈을 덮어버리거나 설정에 따라 오류가 발생합니다.

3. 스프링 빈 의존 관계 설정

이렇게 등록된 빈 저장소의 빈은 객체로 생성되고, 이후 의존 관계를 자동으로 설정합니다. 이때 빈에 대한 메타데이터를 통해 빈을 먼저 등록한 다음, 의존 관계를 아래와 같이 연결해줍니다.

참고 : 스프링은 빈을 생성하고, 의존관계를 주입하는 단계가 나누어져 있습니다. 그런데 이렇게 자바 코드로 스프링 빈을 등록하면 생성자를 호출하면서 의존관계 주입도 한번에 처리됩니다. 

 

스프링 컨테이너는 설정 정보를 참고해서 의존 관계를 자동으로 주입해줍니다.

스프링 컨테이너의 종류

 

스프링 컨테이너는 BeanFactoryApplicationContext 두 종류의 인터페이스로 구현되어 있습니다.

빈 팩토리는 빈의 생성과 관계 설정 같은 제어를 담당하는 IoC 인터페이스며, 빈 팩토리를 상속받은 것이 ApplicationContext입니다.

스프링은 컨테이너는 다양한 형식의 설정 정보를 받아 들일 수 있게 설계되어 있으며, 자바 코드 XML, Groovy 등 다양한 형태를 지원합니다.

BeanFactory

빈 팩토리는 스프링 컨테이너의 최상위 인터페이스입니다.

스프링 빈을 등록, 생성, 조회 등 빈을 관리하는 역할을 담당하며, 빈에 관련한 다양한 메서드를 제공합니다.

@Bean을 통해 빈을 등록하거나, getBean() 메서드를 통해 조회할 수 있습니다.

@Bean
public DiscountPolicy rateDiscountPolicy() {
    return new RateDiscountPolicy();
}
<bean id="memberService" class="hello.core.member.MemberServiceImpl">
    <constructor-arg name="memberRepository" ref="memberRepository" />

ApplicationContext

ApplicationContext에 구현되는 인터페이스

ApplicationContexxt는 BeanFactory의 기능을 상속받아 제공합니다.

하지만 BeanFactory와 큰 차이점으로는 BeanFactory 이외에 수 많은 부가 기능들이 구현되어 있습니다.

  • MessageSource : 메세지 다국화를 위한 인터페이스
  • EnvironmentCapable : 개발, 로컬, 환경 변수 등을 나누어 처리하며, 앱 구동 시 필요한 정보를 관리해줍니다.
  • ApplicationEventPublisher : 이벤트 관련 기능을 제공하는 인터페이스
  • ResourceLoader : 파일, 클래스 파일, 외부 등 리소스를 편리하게 조회

BeanDefinition

스프링에서 xml, Groovy, Java등 다양한 설정 형식을 지원하는데, 이는 BeanDefinition이라는 추상화가 존재하기에 가능합니다.

BeanDefinition

BeanDefinition은 빈 설정 메타 정보이며, AppConfig에 있는 빈 정보를 하나씩 읽어 각각의 메타 정보를 생성합니다.

이것들을 통해 스프링 컨테이너에서 메타 정보를 기반으로 스프링 빈을 생성합니다.

BeanDefinition의 원리

BeanDefinition 정보

  • BeanClassName: 생성할 빈의 클래스 명(자바 설정 처럼 팩토리 역할의 빈을 사용하면 없음)
  • factoryBeanName: 팩토리 역할의 빈을 사용할 경우 이름, 예) appConfig
  • factoryMethodName: 빈을 생성할 팩토리 메서드 지정, 예) memberService
  • Scope: 싱글톤(기본값)
  • lazyInit: 스프링 컨테이너를 생성할 때 빈을 생성하는 것이 아니라, 실제 빈을 사용할 때 까지 최대한 생성을 지연 처리 하는지 여부
  • InitMethodName: 빈을 생성하고, 의존관계를 적용한 뒤에 호출되는 초기화 메서드 명
  • DestroyMethodName: 빈의 생명주기가 끝나서 제거하기 직전에 호출되는 메서드 명
  • Constructor arguments, Properties: 의존관계 주입에서 사용한다. (자바 설정 처럼 팩토리 역할의 빈을 사용하면 없음)

참조

 

스프링 핵심 원리 - 기본편 강의 - 인프런

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., 스프링 핵심 원리를 이해하고, 성장하는 백엔드 개발자가 되어보세요! 📢

www.inflearn.com

 

[Spring] 스프링 컨테이너(Spring Container)란 무엇인가?

본 내용은 온라인 강의 사이트 인프런의 김영한 님의 강의 내용이 포함되어 있습니다. '스프링 핵심 원리 - 기본편' 스프링 핵심 원리 - 기본편 - 인프런 | 강의 스프링 입문자가 예제를 만들어가

ittrue.tistory.com