Web

IoC(Inversion of Control)/DI

superbono 2021. 4. 29. 00:43

* IoC(Inversion of Control, 제어의 역행)

 - IoC/DI

 - 객체 지향 언어에서 객체들간의 연결 관계를 런타임에 결정한다. (런타임? =객체를 만든다는 뜻은 new를 이용하여 메모리를 할당한다는 뜻인데 이건 실행될 때 만들어진다는 것)

 - 객체 간의 관계가 느슨하게 연결됨(loose coupling) -> IoC 적용했을 때 얘기

 - IoC의 구현 방법 중 하나가 DI(Dependency Injection) DL도 있음

 

* IoC 유형

 @ DL(Dependency Lookup)

 - 어디에 만들어놓고 필요하면 갖다 쓰고 다 쓰면 다시 반납한다.

 - 컨테이너가 lookup context를 통해서 필요한 resource나 객체를 얻는 방식

 - JNDI 이외의 방법을 사용한다면 JNDI 관련 코드를 오브젝트 내에서 하나하나 변경해주어야 한다. 

 - Lookup한 객체를 필요한 타입으로 캐스팅 해주어야 한다. 

 - Naming Exception을 처리하기 위한 로직이 필요하다. 

 

 @ DI(Dependency Injection)

- 외부에서 만들고 만들자마자 필요한 쪽에 집어넣어서 찾아서 쓸 필요 없이 그냥 필요할 때 내꺼 쓰면 된다. 반납할 필요 없음

 - 객체에 lookup 코드를 사용하지 않고 컨테이너가 직접 의존 구조를 객체에 설정할 수 있도록 지정해주는 방식이다. 

 - 객체가 컨테이너의 존재 여부를 알 필요가 없다. 

 - lookup 관련 코드들이 객체 내에서 사라진다. 

 - setter injection과 constructor injection을 많이 사용한다. 

 

* Container?

 - 객체의 생성, 소멸 등 라이프 사이클을 담당한다. 

 - 라이프 사이클을 기본으로 애플리케이션 사용에 필요한 주요 기능도 제공한다. 

 

 @ Container 기능

 - 라이프 사이클 관리 

 - dependency 객체 제공

 - thread 관리 등등 

 

 @ Container 필요성 

 - 비지니스 로직 외에 부가적인 기능들에 대해서는 독립적으로 관리되기 위함

 - 서비스 객체를 사용하기 전에 각각 factory 또는 singleton 패턴을 직접 구현하지 않아도 된다. 

 

@ IoC Container (= Spring Container)

 - 객체의 생성과 관계 설정, 사용, 제거 등의 작업을 어플리케이션 코드 대신 독립된 컨테이너가 담당한다. 

 - 컨테이너가 코드 대신 오브젝트에 대한 제어권을 갖고 있어 IoC라고 부른다. 

 - 스프링에서 IoC를 담당하는 컨테이너에는 BeanFactory(옛날 버전), ApplicationContext(최근 버전)가 있다.

 

BeanFactory와 ApplicationContext는 interface이다.

@ Spring DI Container

 - Spring DI Container가 관리하는 객체를 bean이라 하며, 이 객체들의 라이프사이클을 관리하는 의미로 BeanFactory라고 한다. 

 - BeanFactory에 여러 가지 컨테이너 기능을 추가하여 ApplicationContext라고 한다. 

 

<interface> BeanFactory 

 - Bean을 등록, 생성, 조회, 반환 관리

 - 일반적으로 BeanFactory보다는 이를 확장한 ApplicationContext를 사용한다. 

 - getBean() 메소드가 정의되어 있다. 

 

<interface> ApplicationContext

 - bean을 등록, 생성, 조회, 반환 관리 기능은 BeanFactory와 같다. 

 - 스프링의 각종 부가 서비스를 추가로 제공한다.  

 

'Web' 카테고리의 다른 글

REST(Representatilnal State Transfer) API  (0) 2021.05.04
메이븐(Maven) 이란?  (0) 2021.04.29
Spring 개요  (0) 2021.04.29
sendRedirect vs forward  (0) 2021.03.31
Web Architecture / Servlet / JSP  (0) 2021.03.31