본문 바로가기
Spring Study

스프링 IoC(Inversion of Control) 컨테이너

by xogns93 2024. 8. 7.

스프링 IoC(Inversion of Control) 컨테이너는 의존성 주입(Dependency Injection, DI)을 통해 객체의 생성, 구성, 그리고 관리하는 역할을 담당합니다. 이는 주로 애플리케이션 컴포넌트 간의 결합도를 낮추고, 코드의 유연성과 테스트 용이성을 높이기 위해 사용됩니다. 스프링 IoC 컨테이너가 하는 주요 역할은 다음과 같습니다:

1. 객체 생성 및 관리

스프링 IoC 컨테이너는 애플리케이션에서 필요한 객체(빈)를 생성하고, 그 생명주기를 관리합니다. 빈은 주로 XML, 애너테이션, 또는 자바 구성 클래스를 통해 정의됩니다.

2. 의존성 주입

IoC 컨테이너는 객체 간의 의존성을 설정합니다. 이는 주로 생성자 주입(Constructor Injection), 세터 주입(Setter Injection), 그리고 메서드 주입(Method Injection) 방식으로 이루어집니다. 다음은 각각의 의존성 주입 방식입니다:

  • 생성자 주입(Constructor Injection): 생성자를 통해 의존성을 주입합니다.
  • 세터 주입(Setter Injection): 세터 메서드를 통해 의존성을 주입합니다.
  • 메서드 주입(Method Injection): 일반적인 메서드를 통해 의존성을 주입합니다.

3. 제 3자에 의한 객체 관리

스프링 IoC 컨테이너는 개발자가 아닌 프레임워크에 의해 객체를 관리하고 주입합니다. 이는 애플리케이션의 컴포넌트 간의 결합도를 낮추고, 객체의 생성과 의존성 관리의 책임을 프레임워크로 넘겨줍니다.

4. 빈 설정 및 구성

스프링 IoC 컨테이너는 애플리케이션 컨텍스트를 통해 빈의 설정과 구성을 관리합니다. 이는 주로 XML 설정 파일, 애너테이션 기반 설정, 그리고 자바 구성 클래스를 통해 이루어집니다.

5. 빈 생명주기 관리

스프링 IoC 컨테이너는 빈의 생명주기를 관리합니다. 이는 빈의 초기화, 사용, 그리고 소멸 단계로 구성됩니다. 빈 생명주기 콜백 메서드(@PostConstruct, @PreDestroy) 등을 통해 특정 시점에 실행될 로직을 정의할 수 있습니다.

예제 코드

아래는 스프링 IoC 컨테이너를 사용하여 의존성 주입을 구현하는 간단한 예제입니다.

서비스 인터페이스와 구현 클래스

// MessageService 인터페이스
public interface MessageService {
    void sendMessage(String message);
}

// EmailMessageService 클래스
public class EmailMessageService implements MessageService {
    @Override
    public void sendMessage(String message) {
        System.out.println("Email message: " + message);
    }
}

의존성을 주입받는 클래스

// MessageProcessor 클래스
public class MessageProcessor {
    private MessageService messageService;

    // 메서드에 의한 의존성 주입
    public void setMessageService(MessageService messageService) {
        this.messageService = messageService;
    }

    public void processMessage(String message) {
        messageService.sendMessage(message);
    }
}

Spring 설정 파일 (XML)

<!-- applicationContext.xml -->
<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 
                           http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- EmailMessageService 빈 정의 -->
    <bean id="messageService" class="com.example.EmailMessageService"/>

    <!-- MessageProcessor 빈 정의 -->
    <bean id="messageProcessor" class="com.example.MessageProcessor">
        <!-- 메서드를 통한 의존성 주입 -->
        <property name="messageService" ref="messageService"/>
    </bean>

</beans>

애플리케이션 클래스

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Application {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        MessageProcessor processor = context.getBean("messageProcessor", MessageProcessor.class);
        processor.processMessage("Hello, World!");
    }
}

설명

  1. 빈 정의:
    • EmailMessageServiceMessageProcessor 빈을 Spring 설정 파일(XML)에서 정의합니다.
    • MessageProcessor 빈의 messageService 프로퍼티에 EmailMessageService 빈을 주입합니다.
  2. 의존성 주입:
    • MessageProcessor 클래스의 setMessageService 메서드를 통해 MessageService 의존성을 주입받습니다.
    • 이를 통해 MessageProcessor 객체는 EmailMessageService 객체와 결합됩니다.
  3. 애플리케이션 실행:
    • ApplicationContext를 초기화하고, 빈을 가져와서 사용합니다.
    • MessageProcessor 객체의 processMessage 메서드를 호출하여 메시지를 처리합니다.

결론

스프링 IoC 컨테이너는 의존성 주입을 통해 객체의 생성, 구성, 그리고 관리를 담당합니다. 이를 통해 객체 간의 결합도를 낮추고, 애플리케이션의 유연성과 테스트 용이성을 높일 수 있습니다. 스프링 IoC 컨테이너는 객체의 생명주기를 관리하고, 외부 설정 파일(XML, 애너테이션, 자바 구성 클래스)을 통해 빈을 설정하고 구성합니다. 이를 통해 개발자는 비즈니스 로직에 집중할 수 있으며, 코드의 유지보수성과 재사용성이 향상됩니다.