[Spring] IoC(Inversion of Control) 컨테이너

tngus2sh·2024년 3월 7일
0

Spring

목록 보기
1/1

IoC(Inversion Of Control)?

IoC(제어의 역전)는 객체의 생성, 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀌었다는 것을 의미합니다.
따라서, 개발자가 아닌 외부의 프레임워크나 라이브러리가 제어의 흐름을 대신하게 되는 것을 말합니다.

이와 관련된 예시를 아래서 다뤄보겠습니다.

일반적으로 의존성에 대한 제어권은 객체 자신이 갖습니다. 아래의 코드는 Sample이라는 클래스에서 Apple 객체를 불러오는 예제입니다. 의존관계는 간단히 말해 new라는 키워드를 통해 생성됩니다.

class Sample{
    private Apple apple = new Apple();
}

아래는 SampleTest라는 클래스에서 Apple 객체를 생성한 뒤 Sample 클래스의 생성자로 주입시켜 줍니다. 여기서는 Sample이 직접 Apple을 생성하는 것이 아니라 생성자로 주입받습니다.

class Sample{
    private Apple apple;
    
    public Sample(Apple apple){
    	this.apple = apple;
    }
}


class SampleTest{
	
    Apple apple = new Apple();
    Sample sample = new Sample(apple);

}

이 처럼 첫 번째 예시에서는 Apple 객체의 제어권이 Sample에게 있었다면, 두 번째 예시에서는 Sample에게 있는 것이 아니라 SampleTest에게 있습니다. 이와 같이 의존성을 역전시켜 제어권을 직접 갖지 않는 것을 IoC라고 하며, 의존성을 외부에서 주입시켜 주는 것을 DI라고 합니다.

DI는 다음장에서 다뤄보겠습니다.

IoC 컨테이너

컨테이너
객체의 생명주기를 관리, 생성된 인스턴스들에게 추가적인 기능을 제공하도록 하는 것

IoC 컨테이너(=스프링 컨테이너)
스프링 프레임워크에서 객체를 생성하고 관리하고 책임지고 의존성을 관리해주는 컨테이너

인스턴스 생성부터 소멸까지의 인스턴스 생명주기 관리를 개발자가 아닌 컨테이너 가 대신 해줍니다.
객체 관리 주체가 프레임워크(Container)가 되기 때문에 개발자는 로직에 집중할 수 있는 장점이 있습니다.

  • IoC 컨테이너는 객체의 생성을 책임지고, 의존성을 관리한다.
  • POJO 의 생성, 초기화, 서비스, 소멸에 대한 권한을 가진다.
  • 개발자들이 직접 POJO 를 생성할 수 있지만 컨테이너에게 맡긴다.
  • 개발자는 비즈니스 로직에 집중할 수 있다.
  • 객체 생성 코드가 없으므로 TDD가 용이하다.

POJO(Plain Old Java Object)란?
주로 특정 자바 모델이나 기능, 프레임워크를 따르지 않는 Java Object를 지칭한다.
ex) getter / setter


IoC 컨테이너(=스프링 컨테이너)의 종류

스프링 컨테이너가 관리하는 객체를 빈(Bean) 이라고 하고,
이 빈들을 관리한다는 의미로 컨테이너를 빈 팩토리(BeanFactory)라고 부릅니다.

  • 객체의 생성과 객체 사이의 런타임 관계를 DI 관점에서 볼 때 컨테이너를 BeanFactory 라고 한다.
  • BeanFactory에 여러가지 컨테이너 기능을 추가한 어플리케이션컨텍스트(ApplicationContext)가 있다.

BeanFactory와 ApplicationContext

1. BeanFactory

  • BeanFactory 계열의 인터페이스만 구현한 클래스는 단순히 컨테이너에서 객체를 생성하고 DI를 처리하는 기능만 제공한다.
  • Bean을 등록, 생성, 조회, 반환 관리를 한다.
  • 팩토리 디자인 패턴을 구현한 것으로 BeanFactory는 빈을 생성하고 분배하는 책임을 지는 클래스이다.
  • Bean을 조회할 수 있는 getBean()메소드가 정의되어 있다.
  • 보통은 BeanFactory를 바로 사용하지 않고, 이를 확장한 ApplicationContext를 사용한다.

2. ApplicationContext

  • Bean을 등록, 생성, 조회, 반환 관리하는 기능은 BeanFactory와 같다.
  • 스프링의 각종 부가 기능을 추가로 제공한다.

추가적으로 제공하는 기능

  • 국제화가 지원되는 텍스트 메시지를 관리해준다.
  • 이미지 같은 파일 자원을 로드할 수 있는 포괄적인 방법을 제공해준다.
  • 리스너로 등록된 빈에게 이벤트 발생을 알려준다.

참고

https://leveloper.tistory.com/33
https://dev-coco.tistory.com/80

profile
백엔드 개발자

0개의 댓글