스프링 컨테이너

스프링 컨테이너 ? 

스프링 컨테이너는 스프링 프레임워크의 핵심 컴포넌트이며, 스프링에서 자바 객체를 빈(Bean)이라 함

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

스프링 컨테이너는 XML, 어노테이션 기반의 자바 설정 클래스 생성 가능

스프링 부트(Spring Boot)를 사용하기 이전에는 xml을 통해 직접적으로 설정했다면, 스프링 부트가 등장하면서 대부분 사용하지 않게 되었다.

 

스프링 컨테이너의 종류

- BeanFactory는 Bean의 생성 및 관계설정 같은 제어를 담당하는 IoC Object이고, BeanFactory를 좀 더 확장한 것이 ApplicationContext이다

BeanFactory

BeanFactory는 스프링 컨테이너의 최상위 인터페이스이며 Bean의 생성 및 등록, 조회와 같은 관리하는 역할을 하며, getBean() 메서드를 통해 Bean을 인스턴스화 할 수 있다.

@Bean 어노테이션이 붙은 메서드의 이름을 스프링 빈의 이름으로 사용하여 Bean 등록을 한다.

 

ApplicationContext

ApplicationContext는 BeanFactory의 기능을 상속받아 제공하기 Bean을 관리하고 검색하는 기능을 BeanFactory가 제공하고, 그 외의 부가 기능을 제공

 

- 부가 기능

  • MessageSource : 메시지 다국화를 위한 인터페이스
  • EnvironmentCapable : 개발, 운영, 환경변수 등으로 나누어 처리하고, 애플리케이션 구동 시 필요한 정보들을 관리하기 위한 인터페이스
  • ApplicationEventPublisher : 이벤트 관련 기능을 제공하는 인터페이스
  • ResourceLoader : 파일, 클래스 패스, 외부 등 리소스를 편리하게 조회
    스프링 컨테이너의 기능

스프링 컨테이너의 기능

  • 스프링 컨테이너는 빈(Bean)의 인스턴스화, 구성, 전체 생명 주기 및 제거까지 관리한다.
    • 컨테이너는 개발자가 정의한 빈을 객체로 만들어 관리하고 개발자가 필요로 할 때 제공한다.
  • 스프링 컨테이너를 통해 원하는 만큼 많은 객체를 가질 수 있다.
  • 의존성 주입(DI)을 통해 애플리케이션의 컴포넌트를 관리할 수 있다.
  • 스프링 컨테이너는 서로 다른 빈을 연결하여 애플리케이션 빈을 연결하는 역할을 한다.
    • 개발자는 모듈 간에 의존 및 결합으로 인해 발생하는 문제로부터 자유로울 수 있다.
    • 메서드가 언제 어디서 호출되어야 하는지, 메서드를 호출하기 위해 필요한 매개 변수를 준비해서 전달하지 않는다.

 

스프링 컨테이너를 사용하는 이유

  • new 생성자를 통해 객체를 생성 후 사용하며 애플리케이션에서는 수많은 객체가 존재하고 서로간의 참조가 많을수록 의존성이 높아지게 된다.
  • → 낮은 결합도와 높은 캡슐화를 지향하는 객체지향 프로그래밍의 핵심과는 먼 방식이다.
  • 객체 간의 의존성을 낮추어(느슨한 결합) 결합도는 낮추고, 높은 캡슐화를 위해 스프링 컨테이너가 사용
  • 기존의 방식으로는 새로운 기능이 추가 시 변경 사항들을 직접 수정 → 프로젝트가 커질수록 의존도는 높아질 것이고, 그에 따라 코드의 변경도 많아질 것이다.
  • 스프링 컨테이너를 사용하면 구현 클래스에 있는 의존성을 제거하고 인터페이스에만 의존하도록 설계 가능

 

스프링 컨테이너의 생성 과정

  • 기본적으로 스프링 컨테이너는 Configuration Metadata를 사용
  • 스프링 컨테이너는 파라미터로 넘어온 설정 클래스 정보를 사용하여 스프링 빈을 등록
  • 스프링 컨테이너를 만드는 다양한 방법은 ApplicationContext 인터페이스의 구현체
  • AppConfig.class 등의 구성 정보를 지정하여 스프링 컨테이너를 생성할 수 있다.
  • 애플리케이션 클래스는 구성 메타데이터와 결합되어 ApplicationContext를 생성하고 초기화 이후 실행 가능한 시스템 또는 애플리케이션을 갖게 된다.
  • 스프링 빈 조회 시 상속관계에 따라 부모 타입으로 조회하면 자식 타입도 함께 조회 → 즉, Object 타입으로 조회하게 되면 모든 스프링 빈을 조회할 수 있다.

 

스프링 컨테이너 생성과 등록

- 자바 어노테이션을 기반으로 컨테이너를 구성하고 스프링 컨테이너에 등록

@Configuration
public class AppConfig {

    @Bean
    public MemberService memberService() {
        return new MemberServiceImpl(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
}

 

  • 아래 코드는 어노테이션 기반으로 위 코드에서 구성한 스프링 컨테이너를 생성하는 방법
public class MemberApp {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
        MemberService memberService = applicationContext.getBean("memberService", MemberService.class)
    }
}

@ApplicationContext(AppConfig.class)

  • ApplicationContext를 스프링 컨테이너라고 하며, 인터페이스로 구현
    • 다형성이 적용이 되어 있으며, 다양한 구현체가 존재
  • AnnotationConfigApplicationContext는 ApplicationContext 인터페이스의 구현체 중 하나

@Configuration

  • 스프링 컨테이너가 해당 어노테이션이 붙은 클래스를 설정 정보로 사용
  • 클래스 내부에 @Bean 어노테이션이 적힌 메서드를 모두 호출하여 얻은 객체를 스프링 컨테이너에 등록
  • 스프링 컨테이너에 등록된 객체를 **스프링 빈(Bean)**이라 한다.

applicationContext.getBean(”이름”, 타입);

  • 스프링 빈은 getBean() 메서드를 이용하여 얻을 수 있다.

XML 기반 구성 메타데이터의 기본 구조

  • XML 기반으로 만드는 ClassPathXmlApplicationContext도 있다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="..." class="...">
        <!-- collaborators and configuration for this bean go here -->
     </bean>

     <bean id="..." class="...">
         <!-- collaborators and configuration for this bean go here -->
     </bean>

     <!-- more bean definitions go here -->
</beans>
  • <beans /> 태그를 통해 필요한 값들을 설정할 수 있다.
  • <bean id=”…”> 태그는 빈 정의를 식별하는 데 사용하는 문자열이다.
  • <bean class=”…” 태그는 Bean의 유형을 정의하고 클래스 이름을 사용한다.

XML 방법으로 컨테이너 생성

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

 

ApplicationContext 인터페이스의 구현체

  • ApplicationContext 인터페이스에는 수많은 구현체가 존재
  • 다양한 구현체를 통해 스프링 컨테이너 생성할 수 있다.

 

참고자료

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

 

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

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

ittrue.tistory.com

 

'F.W > Spring & Spring Boot' 카테고리의 다른 글

@SpringBootTest, @WebMvcTest  (1) 2023.05.12
스프링 REST 클라이언트  (1) 2023.05.12