스프링 컨테이너(Application Context)

고승원·2023년 5월 16일
3

Spring

목록 보기
6/14

스프링 컨테이너는 스프링 프레임워크의 핵심중 핵심 모듈로 객체의 초기화부터 소멸까지 관리해준다.

자바는 객체를 직접 생성하고 호출했었는데 스프링에선 컨테이너 덕분에 비즈니스 로직에 집중할 수 있다.

목차

  • Application Context
    • BeanFactory
    • BeanDefinition
    • DI
  • 스프링에서 Bean 등록하기
    • Configuration
    • ComponentScan
    • EnableAutoConfiguration
    • Component

Application Context

스프링 컨테이너 즉 Application Context의 클래스 다이어그램이다.
여기서 눈여겨 봐야할 것은 BeanFactory이다. 스프링 컨테이너는 기본적으로 BeanFactory와 부가기능으로 이루어져 있다. (이벤트, 환경변수 등등)

BeanFactory

스프링 컨테이너의 최상위 인터페이스로 스프링 빈을 관리 및 조회할 수 있다.

BeanFactory의 설명을 보자 요약하면 다음과 같다.
BeanFactory는 애플리케이션의 중앙 레지스트이며, 객체 생성, 의존성 주입, 소멸을 한 곳에서 관리할 수 있다.
객체를 생성할 땐 BeanDefinition에 따라서 인스턴스화 한 뒤 의존성 주입(DI)을 권장한다. (객체가 필요할때마다 직접 가져오는 pull방식은 권하지 않는다.)
Bean으로 등록될땐 Key Value 형식으로 저장되며 Key는 Bean의 이름, Value는 인스턴스가 저장된다.

BeanDefinition

일반적으로 구성소스(Annotation, XML등)를 읽어 생성된 것이다. 여기서 재밌는점은, 구성소스를 읽고 Java 객체를 반환하기만 하면 되기 때문에 어떻게 이루어져있던지 상관없다.
Definition의 요소는 BeanName, factoryBeanName, factoryMethodName, Scope, lazyInit여부, Constructor argument 등의 정보를 가지고 있다.
Scope는 보통 싱글톤 또는 프로토타입 패턴을 사용한다. (이것 외에도 request, session등 있다.)

DI

한국어로 의존성 주입이라고 하며, 객체간의 의존관계를 정의하고, 의존성을 객체 내부가 아닌 외부에서 주입하는 방법을 뜻한다.
BeanFactory에서 DI를 권장하는 이유는 몇가지 장점이 있기 떄문이다.

  • 의존하는 객체간 결합도를 느슨하게 만들어준다.
  • Mock 객체 또는 다른 구현체를 주입할 수 있어 테스트에 용이하다.
  • 유지보수성. 의존성이 변경되더라도, 컨테이너만 수정하면 된다.
  • 관리가 편해진다. 애플리케이션의 구성요소를 컨테이너에서 중앙 관리한다.

의존성 주입 방법으론 생성자 주입, Setter 주입, 필드 주입이 있다. 보통의 상황에선 생성자 주입을 권장한다.

  • 생성자 주입 (불변성, 일관성, 유지보수성)
  • Setter 주입 (가변성, 유연성이 높다)
  • 필드 주입(간단하다, 유연하지 못하다)

스프링에서 Bean 등록하기

직접 Config 파일을 만들어도 되지만, 어노테이션을 사용하면 별도의 코드 없이 애플리케이션을 구성할 수 있다.
SpringBoot 프로젝트를 생성하면 기본 Application 클래스에 @SpringBootApplication어노테이션이 붙어있다. 이는 의존성에 대한 설정 및 빈 등록을 자동으로 해준다.

SpringBootApplication은 몇가지 어노테이션을 포함한다.

Configuration

해당 클래스가 애플리케이션의 Configuration을 담당하는 클래스임을 나타낸다.

ComponentScan

컴포넌트를 찾고, 빈으로 등록한다. 기본 설정은 주어진 클래스 패키지 및 하위 패키지다.

EnableAutoConfiguration

자바 설정 파일에 있는 빈을 자동으로 구성하고 등록한다.

Component

ComponentScan의 (빈으로 등록될)대상임을 알리는 어노테이션이다.

profile
봄은 영어로 스프링

2개의 댓글

comment-user-thumbnail
2023년 5월 17일

@SpringBootApplication에 붙은 어노테이션을 설명해주신 부분 좋네요! 잘 읽고 갑니다~

1개의 답글