티스토리 뷰

Spring

[Spring]IoC Container

retto9522 2024. 9. 9. 21:14

IoC(=Inversion of  Control) Container

IoC란 직역 하자면 "제어의 반전"이라는 뜻이며, 프로그램의 제어를 다른 대상이 맡는 것을 의미합니다.

 

IoC Container는 스프링 컨테이너 또는 DI 컨테이너라고 불립니다.

이 스프링 컨테이너는 스프링 프레임워크의 핵심 컴포넌트입니다.

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

스프링에서는 자바 객체를 빈(Bean)이라고 합니다.

 

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

 

스프링 컨테이너는 XML, 어노테이션 기반의 자바 설정 클래스로 만들 수 있습니다.

Spring Boot를 사용하기 이전에는 xml을 통해 직접 빈을 설정해주어야 했지만, 이후에는 따로 설정하지 않아도 빈을 사용할 수 있게 되었습니다.

 

스프링 컨테이너의 종류

 

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

Beanfactory는 빈의 생성과 관계 설정 같은 제어를 담당하는 IoC 오브젝트이고, Beanfactory를 좀 더 확장한 개념이 ApplicaionContext입니다.

 

ApplicationContext는 IoC 방식을 따라 만들어진 일종의 빈 팩토리로 둘 다 동일한 개념이라 생각하면 됩니다.

Beanfactory와 ApplicationContext 중 주로 사용되는 컨테이너는 ContextApplication입니다.

 

BeanFactory

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

빈 팩토리는 빈을 등록, 생성, 조회 등의 빈을 관리하는 역할을 하며, getBean() 메서드를 통해 빈을 인스턴스화 할 수 있습니다.

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

 

ApplicationContext

어플리케이션 컨텍스트는 BeanFactory의 기능을 상속받아 제공합니다. (BeanFactory의 확장판)

따라서, 빈을 관리하고 검색하는 기능을 BeanFactory가 제공하고, 그 외의 부가 기능을 제공합니다. 

 

부가 기능

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

 

 

 

스프링 컨테이너의 기능

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

 

 

 

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

주로 사용하는 설정 방식은 Java의 어노테이션 기능을 통해 설정하게 됩니다.

하지만, 기존 설정 방식인 XML 방식에 대해서도 알아야 합니다.

 

기본적으로 스프링 컨테이너는 Configuration Metadata를 사용한다.

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

 

스프링 컨테이너를 만드는 다양한 방법은 ApplicationContext 인터페이스의 구현체입니다.

AppConfig.class 등의 구성 정보를 지정하여 스프링 컨테이너를 생성할 수 있습니다.

어플리케이션 클래스는 Configuration Metadata와 결합되어 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="..."> 빈의 유형을 정의하고 클래스 이름을 사용합니다.

XML 방법으로 컨테이너 생성

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

 

 

 

 

ApplicationContext 인터페이스의 구현체

ApplicationContext 인터페이스에는 수많은 구현체가 존재합니다.

이러한 다양한 구현체를 통해 스프링 컨테이너를 다양한 방법으로 생성할 수 있습니다.

ApplicationContext의 구현체

 

공지사항
최근에 올라온 글
Total
Today
Yesterday