[Spring] IoC / DI 컨테이너

2019. 5. 16. 18:32JAVA Back-End/Spring

  • 컨테이너?
  • IoC (Inversion of Control)? 
  • DI (Dependency Injection)?

컨테이너의 역할

인스턴스의 생명주기를 관리합니다

생성된 인스턴스들에게 추가적인 기능을 제공합니다.

 

예로, Servlet클래스에서 정의하긴 하지만 실제 인스턴스화(new)는 Tomcat이 대신해줬습니다. -> 개발자가 작성한 Servlet클래스를 실제 메로리에 올려 실행하는 것은 WAS의 Servlet컨테이너가 해줍니다. WAS는 Servlet컨테이너를 가지고 있다고 말합니다.

IoC란? (제어의 역전)

Inversion of Control.  Inversion은 역전이라는 뜻.

컨테이너가 코드 대신 인스턴스의 제어권을 가지고 있어서 IoC(제어의 역전)이라 합니다.

개발자는 프로그램 흐름을 제어하는 코드를 작성하는데 이 흐름의 제어를 개발자가 하는 게 아니라 다른 프로그램이 제어하는 것을 IoC라고 합니다. 

 

DI란?

DI가 해당하는 객체를 주입받는 방법 중 하나입니다. 의존성을 주입받는 방법입니다. 클래스 사이의 의존 관계를 Bean 설정 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것을 의미합니다.

 

DI적용 안된 경우

class Engine{ 

}

class Car{
	Engine v6 = new Engine();
    // 개발자가 직접 코드에서 인스턴스 생성 - DI적용 하지 안된 예
}

 

DI가 적용된 경우

약속된 Annotation을 사용하면 Spring컨테이너가 스스로 '아! 이 객체!'하고 인스턴스 생성해서 IoC컨테이너가 우리에게 주입(Depedency Injection)해줍니다.

@Component
class Engine{

}
@Component
class Car{
	@Autowired
    Engine v6;
}

 

IoC : 스프링이 개발자에게 고정된 틀을 강요해서 그 형식으로 만들게 하는 것. 

DI : 강요하는 내용들 ex) box의 너비는 50cm 높이는 30cm로 고정해라

장점 : 모양이 정형화 됨으로 유지및 관리가 쉽다

(어떤 분이 이해하기 쉽게 비유해주셨네요 ㅎㅎ)

 

 

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

<스프링이 제공해주는 공장 대표적인 2가지 : BeanFactory / ApplicationContext>

 

BeanFactory : IoC/DI에 대한 기본 기능을 가지고 있습니다.

ApplicationContext : BeanFactory의 모든 기능을 포함하고, 일반적으로 BeanFactory보다 추천됩니다. 트랜잭션 처리/AOP 등을 처리할 수 있습니다. BeanPostProcess , BeanFactoryPostProcessor 등을 자동으로 등록하고, 국제화 처리, 애플리케이션 이벤트 등을 처리할 수 있습니다.

 

 

 

BeanPostProcess : 컨테이너의 기본 로직을 오버라이딩하여 인스턴스화와 의존성 로직 등을 개발자가 원하는 대로 구현할 수 있도록 합니다.

BeanFactoryPostProcessor : 설정된 메타 데이터를 커스터마이징 할 수 있습니다.

 

 

[ edwith - 웹프로그래밍 부스트코스 ] 를 개인적으로 공부하고 정리한 공간입니다. 잘못된 부분은 피드백 주시면 감사하겠습니다

'JAVA Back-End > Spring ' 카테고리의 다른 글

스프링과 객체지향, SOLID  (0) 2023.03.28
[Spring] Spring MVC  (0) 2019.06.08
[Spring] Spring JDBC  (0) 2019.06.07
[Spring] xml파일을 이용한 Spring설정  (0) 2019.05.18
[Spring] Spring Framework?  (0) 2019.05.16