NoTimeForDawdling

Spring IoC 컨테이너 본문

SpringBoot

Spring IoC 컨테이너

Room_Energy 2021. 2. 19. 17:10

Spring IoC 컨테이너를 알아보기 전에 스프링 컨테이너가 무엇인지에 대해서 알아보겠습니다.

컨테이너

Servlet 컨테이너

  • Servlet 컨테이너는 Servlet의 생성, 초기화, 소멸 등 Servelet의 생명주기를 관리합니다.
  • 개발자들이 직접 Servlet을 생성하고 서비스하지 않습니다.

EJB 컨테이너

  • EJB의 생성, 초기화, 소멸 등 EJB의 생명주기를 관리합니다.

컨테이너란?

  • Servlet, EJB 컨테이너와 같이 컨테이너는 보통 인스턴스 생명주기를 관리하며, 생성된 인스턴스들에게 추가적인 기능을 제공하도록 합니다.
  • 다시 말해, 컨테이너란 프로그래머가 작성한 코드의 처리과정을 위임받은 독립적인 존재입니다.
  • 컨테이너는 프로그래머가 작성한 코드를 스스로 참조한 뒤 알아서 객체의 생성과 소멸을 컨트롤해줍니다.

그렇다면 스프링 컨테이너 무엇일까요? 스프링 컨테이너는 각각의 컴포넌트들에 대한 생명주기를 관리해줍니다.

IoC 컨테이너

IoC 컨테이너는 다른 용어로 빈 팩토리(Bean Factory), 애플리케이션 컨텍스트(Application Context)라고도 불립니다.

스프링의 IoC 컨테이너는 일반적으로 애플리케이션 컨텍스트를 말합니다.

 

빈 팩토리(Bean Factory)

  • 빈팩토리란 DI의 기본사항을 제공하는 가장 단순한 컨테이너입니다.
  • 팩토리 디자인 패턴을 구현한 것으로, 빈 팩토리는 빈을 생성하고 분배하는 책임을 집니다.
  • 빈 팩토리는 빈이 호출되는 시점에 해당 빈을 생성합니다.(Lazy Loading)

애플리케이션 컨텍스트(Application Context)

  • 빈 팩토리와 유사한 기능을 제공하지만 빈 팩토리를 좀 더 확장한 개념입니다.
  • 컨텍스트 초기화 시점에 미리 빈을 생성해 놓고 빈이 필요할 때 즉시 사용할 수 있도록 보장합니다.

IoC(Inversion Of Control, 제어의 역전)

IoC는 기존 자바 기반으로 애플리케이션을 개발할 때 자바 객체를 생성하고 서로 간의 의존관계를 연결시키는 작업에 대한 제어권은 보통 개발되는 애플리케이션에 있었습니다.

 

하지만 객체의 생성에서부터 생명주기의 관리까지 모든 객체에 대한 제어권을 IoC 컨테이너가 위임받으면서 객체의 생명주기에 관한 제어권이 역전되었습니다.

 

다시 말해, 객체에 대한 제어권이 개발자로부터 컨테이너에게 넘어가면서 객체의 생명주기 관리의 모든 것을 컨테이너가 맡아서 하게 됩니다. 이를 제어권이 역전되었다 해서 IoC라고 합니다.

 

IoC 분류

IoC는 크게 2가지로 분류될 수 있습니다.

 

1. DL(Dependency Lookup)

  • 저장소에 의해 관리되고 있는 bean에 접근하기 위해 개발자들이 직접 컨테이너가 제공하는 API를 이용하여 Bean을 Lookup 하는 것을 말합니다.

2. DI(Dependency Injection)

  • 각각의 클래스 사이의 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 자동적으로 연결해 주는 것을 말합니다.
  • 빈 설정 파일에서 의존관계가 필요하다는 정보만 추가하면 되기 때문에 코드가 단순해지고, 컴포넌트 간의 결합도가 제거됩니다.

DI 분류

  • Setter: setter를 통해 필요한 의존성을 주입합니다.
  • Constructor: 생성자를 만들 때 argument로 필요한 의존성을 주입합니다.
  • Method: 일반 메서드를 통해 필요한 의존성을 주입합니다.

IoC와 DI의 관계

DI는 IoC를 실현시키기 위한 방법 중 하나입니다.

  • DI는 오브젝트를 생성하고 오브젝트끼리의 관계를 생성해 소프트웨어의 부품화 및 설계를 가능하게 합니다.
  • DI를 이용하면 인터페이스 기반의 컴포넌트를 쉽게 구현할 수 있습니다.
  • DI를 통해 클래스에서 new 연산자가 사라짐으로써 개발자가 직접 팩토리 메서드 패턴을 구현하지 않아도 DI 컨테이너가 건네주는 인스턴스를 인터페이스로 받아서 인터페이스 기반의 컴포넌트화를 구현할 수 있게 됐습니다,
    • 즉, 의존성 주입의 편리성을 도와줌으로써 개발자는 코드에 대한 로직에 좀 더 집중할 수 있게 됐습니다.

참고