Post-IT

스프링 컨테이너와 IoC 본문

스프링

스프링 컨테이너와 IoC

생각없는 개발자 2025. 2. 14. 16:02

스프링에서 가장 핵심적인 개념 중 하나가 스프링 컨테이너와 IoC(Inversion of Control, 제어의 역전)입니다. 이를 이해하면 스프링이 어떻게 객체를 관리하고 애플리케이션을 효율적으로 도작시키는지 알 수 있습니다.

 


1. IoC(Inversion of Control, 제어의 역전)란?

IoC는 객체의 생성과 생명 주기 관리를 개발자가 직접하는 것이 아니라, 컨테이너(프레임워크)가 대신 처리하는 개념을 의미합니다

a. 기존 방식

자바에서 객체를 생성하고 관리하는 일반적인 방식은 다음과 같습니다.

public class Car {
    private Engine engine;

    public Car() {
        this.engine = new Engine(); // 직접 객체 생성
    }

    public void drive() {
        engine.start();
        System.out.println("Driving...");
    }
}
  • Car 클래스가 Engine 객체를 직접 생성하고 있습니다.
  • 의존성(Dependency)이 직접 설정되어 있어, Engine 클래스가 변경되면 Car 클래스도 수정해야합니다.

b. IoC 방식

스프링에서는 객체 생성과 의존성 주입을 개발자가 하지 않고 스프링 컨테이너가 처리합니다.

@Component
public class Engine {
    public void start() {
        System.out.println("Engine started...");
    }
}

@Component
public class Car {
    private final Engine engine;

    @Autowired
    public Car(Engine engine) { // 생성자를 통해 의존성 주입
        this.engine = engine;
    }

    public void drive() {
        engine.start();
        System.out.println("Driving...");
    }
}
  • Car 클래스에서 Engine 객체를 직접 생성하지 않고, 외부에서 주입(Dependency Injection) 받음
  • 객체의 생성과 관계 설정은 스프링 컨테이너가 자동으로 처리

2. 스프링 컨테이너란?

스프링 컨테이너는 객체(Bean)의 생성, 관리, 소멸을 책임지는 역할을 하는 컨테이너(관리 시스템)입니다.

  1. 객체(Bean) 생성 : 개발자가 new 키워드를 사용하지 않아도 객체를 생성
  2. 의존성 주입(DI, Dependency Injection) : 객체들 간의 의존 관계를 자동으로 설정
  3. 객체 생명 주기 관리 : 객체 생성 -> 초기화 ->사용 -> 소멸 과정을 관리
  4. 객체를 싱글톤(Singleton)으로 관리 : 기본적으로 하나의 객체만 생성하여 공유

3. IoC 컨테이너의 동작 과정

  1. 설정 정보 읽기
    • @ComponentScan, @Configuration 등을 통해 Bean 정보를 설정
    • XML 기반이라면 beans.xml 로드
  2. Bean 객체 생성 및 등록
    • 설정된 클래스를 바탕으로 객체를 생성하고, 스프링 컨테이너가 관리
  3. 의존성 주입(DI, Dependency Injection) 수행
    • @AutoWired, @Qualifier 등을 통해 필요한 객체를 자동으로 주입
  4. 객체 사용
    • 개발자는 context.getBean(ClassName.class) 등을 통해 객체를 사용
  5. 객체 소멸
    • 컨테이너가 종료되면, @PreDestroy 등을 통해 정리 작업을 수행

제어의 역전(Inversion of Control)는 객체의 생성 및 관리 권한을 개발자가 아닌 스프링 컨테이너가 전적으로 담당하는 것을 말한다. 객체의 성성 관리 소멸은 스프링 컨테이너가 맡게 되며, 그 관계를 만드는 것을 의존성 주입(Dependency Injection)이라고 한다.

'스프링' 카테고리의 다른 글

스프링 빈과 빈 스코프  (0) 2025.02.14
의존성 주입(Dependcy Injection)  (1) 2025.02.14
빌드 파일(build.gradle)  (1) 2024.10.17
Spring이란?  (0) 2024.06.12
JUnitTest  (0) 2024.02.27