Study/Java&Spring

Spring, IoC/DI 컨테이너

kdhoooon 2021. 7. 17. 16:51

Spring Framework 란?


  • 엔터프라이즈급 어플리케이션을 구축할 수 있는 가벼운 솔루션이자, 원스-스탑-숍(One-Stop-Shop)
  • 원하는 부분만 가져다 사용할 수 있도록 모듈화가 잘 되어 있다.
  • IoC 컨테이너다.
  • 선언적으로 트랜잭션을 관리할 수 있따.
  • 완전한 기능을 갖춘 MVC Framwork를 제공한다.
  • AOP 지원한다.
  • 도메인 논리 코드와 쉽게 분리될 수 있는 구조로 되어있다.

SpringFramework 구조

 

 

IoC/DI 컨테이너


컨테이너(Container)란?

  • 인스턴스의 생명주기를 관리한다. 
  • 생성된 인스턴스들에게 추가적인 기능을 제공한다.
  • AppConfig 처럼 객체를 생성하고 관리하면서 의존관계를 연결해 주는 것

 ex) Servlet을 실행해주는 WAS는 Servlet 컨테이너를 가지고 있다고 말한다.

 

 

IoC(Inversion of Control)란?

  • inversion은 사전적 의미로는 '도치, 역전'이다. 보통 IoC를 제어의 역전이라고 번역한다.
  • 개발자는 프로그램의 흐름을 제어하는 코드를 작성한다. 그런데, 이 흐름의 제어를 개발자가 하는 것이 아니라 다른 프로그램이 그 흐름을 제어하는 것을 IoC라고 한다.
  • 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것

프레임 워크 vs 라이브러리

  • 프레임워크가 내가 작성한 코드를 제어하고, 대신 실행하면 프레임워크가 맞다. (JUnit)
  • 내가 작성한 코드가 직접 제어의 흐름을 담당한다면 라이브러리다.

 

DI(Dependency Injection)란?

  • Dependency Injection의 약자로, 의존성 주입 또는 의존관계 주입이란 뜻이다.
  • 클래스 사이의 의존 관계를 빈(Bean)설정 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것을 말한다.
  • 의존관계는 정적인 클래스 의존관계와 ,실행시점에 결정되는 동적인 객체(인스턴스) 의존관계를 분리해서 생각해야한다.
  • 정적인 클래스 의존관계
    • 클래스가 사용하는 import 코드만 보고 의존관계를 쉽게 판단할 수 있다. 정적인 의존관계는 애플리케이션을 실행하지 않아도 분석할 수 있다.
  • 동적인 객체 인스턴스 의존관계
    • 애플리케이션 실행 시점에 실제 생성된 객체 인스턴스의 참조가 연결된 의존관계
  • 애플리케이션 실행 시점(런타임)에 외부에서 실제 구현 객체를 생성하고 클라이언트에 전달해서 클라이언트와 서버의 실제 의존관계가 연결되는 것을 의존관계주입이라 한다.
  • 객체 인스턴스를 생성하고, 그 참조값을 전달해서 연결된다.
  • 의존관계 주입을 사용하면 클라이언트 코드를 변경하지 않고, 클라이언트가 호출하는 대상의 타입 인스턴스를 변경할 수 있다.
  • 의존관계주입을 사용하면 정적인 클래스 의존관계를 변경하지 않고, 동적인 객체 인스턴스 의존관계를 쉽게 변경할 수 있다.

 

Spring에서 제공하는 IoC/DI 컨테이너

  • BeanFactory : IoC/DI에 대한 기본 기능을 가지고 있다.
  • AppicationContext : BeanFactory의 모든 기능을 포함하며, 일번적으로 BeanFactory보다 추천 된다. 트랜잭션처리, AOP등에 대한 처리를 할 수 있다. BeanPostProcessor, BeanFactoryPostProcessor등을 자동으로 등록하고, 국제화 처리, 어플리케이션 이벤트 등을 처리 할 수 있다.
  • BeanPostProcessor : 컨테이너의 기본로직을 오버라이딩하여 인스턴스화와 의존성 처리 로직 등을 개발자가 원하는 대로 구현할 수 있도록 한다.
  • BeanFactoryPostProcessor : 설정 된 메타 데이터를 커스터마이징 할 수 있다.