[Spring] IoC Container란?

지니·2025년 3월 19일

Spring

목록 보기
1/13
post-thumbnail

1. IoC(Inversion of Control)이란?


IoC를 한국어로 해석하면 '제어의 역전'이다. 이것은 메소드나 객체의 호출 작업을 개발자가 결정하는 것이 아니라 프레임워크에서 결정하는 것을 의미한다.

제어의 역전이 없는 경우 자바에서 객체를 생성해 사용하기 위해선 다음과 같이 코드를 작성해야 한다.

@RestController
public class TestController {
	
    private MyService service = new MyServiceImpl();
    
    @GetMapping("/test/hello") 
    public String getHello() {
    	return service.getHello();
    }
}

그런데 '제어의 역전'을 통해 더이상 직접 객체를 생성하지 않고 객체의 생명주기 관리를 외부에 위임하는 것이다. 여기에서 '외부'는 'IoC Container'를 의미한다.

자, 그럼 IoC Container에 대해 알아보자~!

2. IoC Container


2-1. IoC Container란?

IoC를 구현한 구체적인 프레임워크를 의미한다. IoC Container
객체의 생성, 초기화, 의존성 처리 등을 자동으로 수행해준다.
➡️ Spring Framework의 IoC Container는 ApplicationContext이다.

이제 우리는 더 이상 객체를 생성할 때, new를 이용해 생성할 필요 없다. 생성은 IoC Container에서 해준다!

2-2. IoC Container를 사용하는 이유

✅ 객체의 생명 주기 관리

  • 개발자가 직접 객체를 생성하고 소멸시키는 부담 감소
  • 개발자는 서비스 로직에 집중

✅ 의존성 주입

  • IoC 컨테이너가 필요한 객체를 자동으로 주입해 결합도를 낮춤
  • 코드 변경없이 설정만 변경하면 다른 구현체를 주입할 수 있어 확장성이 높아짐

✅ 결합도 감소 및 유지보수성 증가

  • 객체 간의 결합을 줄이고, 유연하게 교체 가능

✅ 코드 재사용 및 테스트 용이

  • Mock 객체를 주입해 단위 테스트가 쉬워짐
  • 예를 들어, Service를 테스트 한다고 하자. 이 때, Service와 Respository가 강한 결합이 있다면 Service를 테스트할 때 실제 DB와 연결되게 된다.
  • 그런데 의존성 주입을 통해 테스트 하면, RepositoryMock 객체로 교체하고, 실제 DB나 외부 API와 연결 없이 테스트를 진행할 수 잇는 것이다.

3. Spring IoC Container


3-1. Bean과 Bean Factory

3-1-1. Bean

IoC Container에서 관리되는 객체로 재사용 가능한 소프트웨어 컴포넌트이다. 이 말은 Bean이란 게 단순히 new로 만든 객체가 아니라, 스프링이 관리해주는 특별한 객체라는 뜻이다.

❓그렇다면 Bean을 사용하는 이유가 무엇일까?
IoC 컨테이너가 객체 간의 의존관계를 직접 관리해주기 때문이다. 스프링은 Bean 생성, 초기화, 의존성 주입, 제거하는 등의 일을 IoC Container를 통해 자동으로 처리할 수 있는 것이다.

3-1-2. Bean Factory

Spring IoC Container의 가장 기본적인 형태로, Bean의 라이프 사이클을 관리한다. (단순히 객체를 생성하고 DI를 처리하는 기능만 제공)

  • 팩토리 디자인 패턴을 구현한것으로 빈을 생성하고 분배하는 책임을 지는 클래스이다.
  • getBean()이라는 메소드를 통해 Bean을 조회할 수 있다.

3-2. IoC Container에게 알려줘야 하는 정보

지금까지 Spring IoC Container에서 객체(Bean)을 생성하고 관리한다고 했다. 그렇다면 객체는 어떤 정보를 바탕으로 만드는 것일까? 우리는 우리가 원하는 기능과 동작에 따라 POJOConfiguration Metadata이 2개를 전달해줘야 한다.

3-2-1. POJO

Plain Old Java Object의 약자로 어떠한 인터페이스/클래스를 구현이나 상속하지 않는 순수한 자바 클래스를 의미한다.

3-2-2. Configuration Metadata

BeanFactory가 IoC를 적용하기 위해 사용하는 설정 정보이다. 이 정보는 IoC 컨테이너에 의해 관리되는 Bean 객체를 생성하고 구성할 때 사용된다.

🔎 Configuration Metadata의 종류

  • XML 설정 (applicationContext.xml)
    : 많이 사용되진 않는다.

  • Java 설정 (@Configuration 사용)

  • Annotation 기반 설정 (@Component, @Service, @Repository 등 사용)


3-3. Applicaton Context

BeanFactory를 확장한 IoC Container이다. BeanFactory에 스프링이 제공하는 부가 기능이 추가로 제공된다.

밑에 2개의 구현 클래스의 경우 Configuration Metadata를 XML로 전달하는지, JAVA 코드로 전달하는지에 대한 차이에 따라 다르게 클래스를 만든 것이다.

  • GenericXmlApplicationContext : XML MetaData Configuration을 읽어 컨테이너 역할을 수행한다.
  • AnnotationConfigApplicationContext : Java MetaData Configuration을 읽어 컨테이너 역할을 수행한다.

4. 전체 내용 간단 요약


  • IoC(Inversion of Control)
    : 객체 생성과 관리 제어권을 개발자가 아닌 스프링에게 넘겨줌

  • IoC의 장점

    • 결합도 ↓ 유지보수·확장성 ↑
    • 테스트 시 Mock 교체 용이
    • 개발자는 비즈니스 로직에 집중 가능
  • IoC 컨테이너(ApplicationContext)
    : Bean(스프링이 관리하는 객체)을 생성·관리

  • POJO와 Configuration Metadata
    : Bean 생성을 위해 POJO와 Configuration Metadata 정보를 넘겨줘야 한다.

  • 설정 정보 전달 방법

    • XML (applicationContext.xml)
    • 어노테이션 & 자바 설정 (@Configuration, @Bean, @Component 등)

0개의 댓글