spring

[spring] IoC와 DI?

엄지성 2024. 6. 7. 00:36

백엔드 프레임워크를 Spring으로 선택한다면 안 듣고 싶어도 듣는 이야기가 있다.

IoC와 DI이다.

하지만 듣고 쓰고 싶지 않아도 이 개념을 알아야 Spring을 사용하고 사용할 수 있다.

그래서 이번엔 IoC와 DI에 대해 알아보자!

 

IoC(Inversion Of Controller)

IoC의 풀네임은 Inversion Of Controller로 직역하면 "제어의 역전"이다.

Spring에서 IoC는 Component, Configuration 및 생명주기의 고민을 해결해 주는 디자인 패턴이다.

IoC 컨테이너

Spring에는 객체의 생성과 의존관계를 책임지고 관리해 주는 컨테이너가 있는데 

이를 IoC컨테이너라고 불린다.(IoC 컨테이너 말고도 불리는 이름은 더 있음)

 

IoC 컨테이너는 인스턴스의 생성부터 사라질 때까지의 생명주기를 관리해준다. 

 

개발자 대신.

 

이러한 특징 덕분에 우리에게는 장점으로 돌아오는 것들이 많다.

  • 개발자가 더욱 로직에 집중 가능
  • IoC컨테이너가 객체를 책임지고 관리 또는 의존성 관리
  • POJO를 직접 생성할 수 있지만 컨테이너에게 위임
  • 객체를 생성하는 코드가 없어 TDD에 용이
더보기

POJO란?

POJO(Plain Old Java Object)란 직역한다면 순수하게 오래된 자바 객체라는 뜻이다.

직역한 것으로 이해하기 어려울 수 있다. 사실 그냥 Java로 생성한 순수한 객체이다.

POJO객체는 객체지향에 충실하고 기술이나 환경에 얽매이지 않고 언제든 재활용이 가능하게 설계한 객체를 의미한다.

 

IoC의 종류

아는 사람도 있고 모르는 사람도 있겠지만 IoC의 종류는 두가지가 있다.

DL(Dependency Lookup) | DI(Dependency Injection)

  • DL: 컨테이너에 저장되어 있는 Bean에 접근하기 위해 컨테이너에서 제공하는 API로 Bean을 검색하는 것
  • DI: 각 클래스간의 의존관계를 Bean Definition을 바탕으로 컨테이너에서 자동으로 주입해 주는 것 
    • Setter Injection(세터 주입)
    • Constructor Injection(생성자 주입)
    • Filed Injection(필드 주입)

// 물론 DL보다 DI를 더 사용한다. 왜냐면 DL을 사용하게 된다면 컨테이너에 대한 종속이 증가하기 때문이다.

 

IoC 컨테이너의 종류

IoC 컨테이너가 관리하는 객체를 Bean이라고 부르고,

이것을 관리하는 컨테이너를 BeanFactory라고 부른다.

또한, BeanFactory에서 여러가지 컨테이너의 가능을 추가한 ApplicationContext가 있다.

 

BeanFactory

 

BeanFactory는 단순히 컨테이너에서 객체 생성 및 DI를 하는 기능만 제공한다.

또한 Bean을 등록, 생성, 조회 등 관리를 한다.

BeanFactory는 이름에서도 보이듯이 팩토리 디자인 패턴으로 구현한 것으로 빈을 생성 및 분배하는 클래스이다.

사실 BeanFactory를 바로 사용한다기 보단 ApplicationContext를 사용한다.

 

ApplicationContext

 ApplicationContext는 BeanFactory처럼 Bean을 등록, 생성, 조회 등을 관리하는 것은 똑같다.

하지만 차이점이라고하면 BeanFactory에 없는 컨테이너의 기능을 추가했다는 점인데

 

위에 사진을 보다시피 BeanFactory가 맨 위에 있고 하위 인터페이스가 존재하고 ApplicationContext가 존재하는 것을 볼 수 있다.

ApplicationContext에서도 하위 Context가 존재한다.

 

ApplicationContextBeanFactory보다 추가적으로 제공하는 기능을 말해보자면

  • 국제화가 되는 텍스트 메시지를 관리
  • 파일(이미지 등) 로드할 수 있는 기능을 제공
  • 리스너로 등록되어있는 빈에게 이벤트가 발생했다는 알림 제공

위에 나열한 추가적으로 제공하는 기능이 있다는 것만으로도 BeanFactory보단 ApplicationContext를 사용하는 것이

더 좋다고 생각이 든다.