스프링은 객체 컨테이너
package chap02;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx =
new AnnotationConfigApplicationContext(AppContext.class);
Greeter g1 = ctx.getBean("greeter", Greeter.class);
Greeter g2 = ctx.getBean("greeter", Greeter.class);
System.out.println("(g1 == g2) = " + (g1 == g2));
ctx.close();
}
}
스프링의 핵심 기능 중 하나인 객체의 생성과 초기화는 ApplicationContext라는 인터페이스에 정의되어 있다. 코드에 있는 AnnotationConfigApplicationContext 클래스는 이 인터페이스를 알맞게 구현한 클래스(구현체) 중 하나이다. 이 클래스는 자바 클래스에서 정보를 읽어와 객체 생성과 초기화를 수행한다.
계층도를 보면 가장 상위에 BeanFactory 인터페이스가 위치하고 그 아래로 ApplicationContext 인터페이스, 그리고 가장 하단에 AnnotationConfigApplication Context 구현 클래스가 위치한다.
BeanFactory 인터페이스는 객체 생성과 검색에 대한 기능을 정의한다. 예를 들어 생성된 객체를 검색하는데 필요한 getBean() 메서드가 BeanFactory에 정의되어 있ㄷ. 객체를 검색하는 것 이외에 싱글톤/프로토타입 빈인지 확인하는 기능도 제공한다.
ApplicationContext 인터페이스는 메시지, 프로필/환경 변수 등을 처리할 수 있는 기능을 추가로 정의한다.
AnnotationConfigApplicationContext는 자바 어노테이션을 이용한 클래스로부터 객체 설정 정보를 가져온다.
어떤 구현 클래스를 사용하든, 각 구현 클래스는 설정 정보로부터 Bean이라고 불리는 객체를 생성하고 그 객체를 내부에 보관한다.
ApplicaitonContext(혹은 BeanFactory)는 Bean 객체의 생성, 초기화, 보관, 제거 등을 관리하고 있어서 ApplicationContext를 컨테이너라고도 부른다.
스프링 컨테이너는 내부적으로 Bean 객체와 이름을 연결하는 정보를 갖는다. 컨테이너 내부에는 Bean이름으로 된 포인터로 관리한다고 생각하면 된다.
싱글톤 객체
getBean() 메서드를 통해 같은 빈 객체를 두 번 전달 받을 때, 두 객체는 같다. 별도로 설정을 하지 않은 경우에는 스프링은 한 개의 빈 객체만을 생성하고, 이때 빈 객체는 싱글톤 범위를 갖는다고 표현한다. 기본적으로 한 개의 @Bean 어노테이션에 대해 한 개의 빈 객체를 생성한다. 싱글톤 범위 외에 프로토타입 범위도 존재한다.
IoC(Inversion of Control)
IoC를 직역하자면 제어의 역전 정도 되겠다. 이는 제어권이 기존에 비해 뒤바뀌었다는 의미를 갖는다. 그렇다면 기존의 방식은 어떠했을까?
초기 자바 어플리케이션은 객체의 생성과 의존관계 설정 등에 해당하는 제어권을 개발자가 직접 쥐고 있었다. 그러나 서블릿이 등장하면서 개발자가 갖고 있던 제어권을 서블릿을 관리하는 컨테이너로 넘어갔고 객체의 생명주기 관리를 포함한 객체에 대한 모든 제어권이 바뀐 것을 IoC 즉, 제어의 역전이라고 한다.
Container vs Context
스프링 기반의 어플리케이션에서, 어플리케이션 객체들은 스프링 컨테이너 안에 존재한다. 컨테이너는 객체(Bean)를 생성하고, 연결하고, 설정하고 라이프 사이클을 관리한다. 스프링은 한개 이상의 컨테이너로 실행된다. BeanFactory는 가장 간단한 형태의 컨테이너이다. 이 인터페이스는 간단한 DI를 지원한다.
ApplicaitonContext는 표면적으로 봤을 때, 컨테이너와 비슷한 역할을 하지만 추가적인 기능을 더 제공한다. 이러한 이유 때문에 최근에서는 BeanFactory보다 더 선호되는 경향을 보인다.
'Backend > spring' 카테고리의 다른 글
의존 자동 주입과 컴포넌트 스캔 (0) | 2022.01.08 |
---|---|
Spring DI (0) | 2022.01.08 |
스프링 빈과 의존관계 (0) | 2021.11.24 |
스프링 회원 관리 예제 - 백엔드 개발 (0) | 2021.11.22 |
스프링 웹 개발 기초 (0) | 2021.11.22 |