* 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(최근 버전)가 있다.
@ 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 |