작성자: 최병윤
2주차 백엔드 스터디에서는 Spring Container(ApplicationContext)에 대해 알아보고자 한다.
Container란?
스프링에서 컨텍스트(Context)는 스프링이 관리하는 빈들이 담겨 있는 컨테이너라고 이해하면 된다.
ApplicationContext란?
ApplicationContext는 BeanFactory의 모든 기능을 포함하며, BeanFactory보다 추천되는 개념이다. 트랜잭션 처리, AOP에 대한 처리를 할 수 있으며 BeanPostProcessor, BeanFactoryPostProcessor 등을 자동으로 등록하고, 국제화 처리, 어플리케이션 이벤트 등을 처리할 수 있다. 스프링 컨테이너라고 말하면 일반적으로 ApplicationContext를 의미한다고 보면 된다. ApplicationContext는 인터페이스이다. 스프링 컨테이너는 xml을 기반으로 만들 수 있고 어노테이션 기반의 자바 설정 클래스로도 만들 수 있다. 사실 정확히 말하면 스프링 컨테이너는 BeanFactory, ApplicationContext로 구분 지을 수 있지만 BeanFactory는 직접 사용할 일이 거의 없어서 일반적으로 ApplicationContext = 스프링 컨테이너다.
ApplicationContext는 최상위 컨텍스트이고 ContextLoaderListener 클래스에 의해 만들어진다.
- ResourcePatternResolver: 리소스를 읽어오기 위한 인터페이스
- EnvironmentCapable: 개발, 운영 등 환경을 분리해서 처리하고, 애플리케이션 구동 시 필요한 정보들을 관리하기 위한 인터페이스 (로컬, 개발, 운영 등을 구분해서 처리할 수 있게 하는 기능이다.)
- MessageSource: 메시지 다국화를 위한 인터페이스 (국가별로 그 나라에 맞는 언어로 나오도록 하는 기능이다.)
- ApplicationEventPublisher: 이벤트 관련 기능들을 제공하는 인터페이스 (이벤트를 발행하고 구독하는 모델을 지원한다.)
BeanFactory란?
스프링 컨테이너의 최상위 인터페이스로 스프링 빈을 조회 및 관리하는 역할을 한다. getBean()메서드를 제공한다.
스프링 컨테이너 생성 과정
- 스프링 컨테이너 생성 (비어있는 스프링 컨테이너가 생성된다.)
- 스프링 빈 등록 (스프링 설정 파일(Java, XML등)을 기반으로 컨테이너에 스프링 빈이 등록된다.)
- 스프링 빈 의존관계 설정 (스프링 설정 파일을 기반으로 스프링 빈의 의존관계를 주입(DI)한다.)
BeanDefinition이란?
빈 메타 설정 정보이다. 즉 인터페이스이다. 스프링은 BeanDefinition을 통해 다양한 형식의 설정 파일을 지원합니다. 이때 어떤 방식을 사용하더라도 BeanDefinition 형식의 메타 정보를 생성해주면 스프링 컨테이너가 설정 파일 형식과는 상관없이 BeanDefinition을 사용해서 빈의 정보를 알아낼 수 있습니다. (스프링 컨테이너는 Groovy를 사용해서 생성하는 경우도 있다.) 우리가 XML, 자바코드 등으로 설정 정보를 전달하면 해당 코드를 읽어서 BeanDefinition을 만든다.
자바에서는 @Bean, XML에서는 <bean>이 부여된 정보로 메타 정보를 생성한다.스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성한다.
설정정보를 BeanDefinition으로 만드는 방법
설정정보 클래스에 맞는 BeanDefinitionReader를 사용해서 해당 설정 정보를 읽어서 빈 메타 정보인 BeanDefinition을 생성해서 전달한다. JSON, TXT등 없는 형식을 쓰고 싶으면 XxxBeanDefinitionReader를 만들어서 쓰면 된다.
WebApplicationContext vs ApplicationContext
WebApplicationContext는 ApplicationContext를 확장한 WebApplicationContext 인터페이스의 구현체를 말한다. WebApplicationContext는 ApplicationContext에 getServletContext()메소드가 추가된 인터페이스이다. 즉 WebApplicationContext는 ApplicationContext의 자식이면서 ServletContext와 연관 관계에 있다.
스프링 컨테이너는 싱글톤 컨테이너
스프링 컨테이너는 객체의 인스턴스를 싱글톤으로 관리하기 때문에 싱글톤 컨테이너라고도 불린다. 그래서 AppConfig 클래스를 읽어 들여서 만든 빈 목록의 임의의 빈은 여러 번 불러서 확인해도 주소가 같다고 한다. 하지만 @Configuration을 사용했을때만 싱글톤이 보장되고, @Bean만 사용하면 싱글톤이 보장되지 않는다고 한다.
즉 스프링 컨테이너는 IoC와 DI의 원리를 이용했고 싱글톤을 유지한다.
면접 예상 질문
- Container란 무엇인가요?
- ApplicationContext가 제공하는 기능 중 하나 이상 말해보세요.
- WebApplicationContext와 ApplicationContext의 차이를 말해보세요.
- BeanDefinition이 무엇인가요?
- 반드시 XML과 Java를 사용하지 않고도 다른 방식을 통해 빈의 정보를 알아낼 수 있나요?
하단의 자료에서 많은 도움을 받았습니다.
감사합니다.
Spring Container
- https://kingofbackend.tistory.com/78
- https://dev-aiden.com/spring/Spring-Container/
- https://steady-coding.tistory.com/459
- https://catsbi.oopy.io/0f28d626-febb-421d-91c8-5d44c6df7d1f
'Group Study (22-23) > Spring-Core-JPA' 카테고리의 다른 글
[Spring-core-JPA] 6주차 - JPA 영속성 컨텍스트 (2) | 2023.02.11 |
---|---|
[Spring-Core-JPA] 5주차 - ORM과 JPA의 추상화 계층 그리고 특징들 (0) | 2023.02.04 |
[Spring-Core-JPA] 4주차 - 컴포넌트 스캔 그리고 의존관계 자동 주입 (0) | 2023.02.04 |
[Spring-Core-JPA] 3주차 - Bean Scope 그리고 Bean 생명주기 (0) | 2023.02.04 |
[Spring-Core-JPA] 1주차 - DI, IoC 그리고 DI Container (0) | 2023.02.04 |