IoC 그리고 DL 과 DI
IoC의 이해
IoC(Inversion of Control) 이란?
"제어의 역전" 이라는 의미로, 메서드나 객체의 호출을 개발자가 결정하는 것이 아닌, 외부에서 결정되는 것을 의미한다.
간단히 말해 "제어의 흐름을 바꾼다" 라고 한다.
Ioc의 장점
객체의 의존성을 역전시켜 객체 간의 결합도를 줄이고 유연한 코드를 작성할 수 있게 하여 가독성 및 코드 중복, 유지 보수를 편하게 할 수 있게 한다.
IoC의 컨테이너
스프링 프레임워크도 객체에 대한 생성 및 생명주기를 관리할 수 있는 기능을 제공하고 있다.
이때, IoC 컨테이너가 기능을 제공한다.
기존에는 다음과 같은 순서로 객체가 생성되고 실행되었다.
- 객체 생성
- 의존성 객체 생성 - 클래스 내부에서 생성
- 의존성 객체 메서드 호출
하지만, 스프링에서는 다음과 같은 순서로 객체가 생성되고 실행된다.
- 객체 생성
- 의존성 객체 주입 - 스스로 만드는 것이 아닌, 제어권을 스프링에게 위임하여 스프링이 만들어 놓은 객체를 주입
- 의존성 객체 메서드 호출
스프링이 모든 의존성 객체를 스프링이 실행될 때 만들어주고 필요한 곳에 주입시켜줌으로써
Bean들은 싱글턴 패턴의 특징을 가지며, 제어의 흐름을 사용자가 컨트롤하는 것이 아닌 스프링이 처리
IoC의 분류
DL(Dependency Lookup) 과 DI(Dependency Injection)
- DL(Dependency Lookup) 이란?
DL은 "의존성 검색" 이다.
이는 Bean에 접근하기 위해 컨테이너가 제공하는 API를 이용하여 Bean을 Lookup하는 것이다.
아래와 같이 Bean에 대한 정보가 있는 XML파일이 있다고 가정해봅시다.
<beans>
<bean id="myObject" class="com.Moony.MyObject" />
</beans>
Java에서는 해당 XML의 Bean 정보를 보고 검색을 통해 어떤 클래스를 사용할지 주입하게 된다.
String myConfigLoc = "classPath:myAppContext.xml";
AbstractApplicationContext appCtx = new GenericXmlApplicationContext(myConfigLoc);
MyObject myObject = appCtx.getBean("myObject:, MyObject.class);
그 결과 위와 같은 코드를 통해 적절한 MyObject 클래스를 검색하여 가져올 수 있는 것이다.
- DI(Dependency Injection) 이란?
DI는 "의존성 주입" 이다.
이는 각 클래스 간의 의존성을 자신이 아닌 외부(컨테이너)에서 주입하는 것이다.
일반적으로 Bean 설정 파일을 바탕으로 의존관계를 확인하여 주입한다.
이는 객체 레퍼런스를 컨테이너로 부터 주입 받아서, 실행 시에 동적으로 의존 관계가 생성되는 것이다.
따라서 컨테이너가 흐름에 주체가 되어 어플리케이션 코드에 의존 관계를 주입하게 되는 것이다.
'Programming > Spring' 카테고리의 다른 글
[Spring MVC] Dispatcher Servlet 이란? -(FrontController패턴 포함) (2) | 2021.06.15 |
---|---|
[Spring] RestController, ResponseEntity란? (Controller와 RestController의 차이점 포함) (0) | 2021.05.24 |
[Spring] Ajax 활용하여 로그인 처리 (JSON데이터, 로그인 Session 관리) (1) | 2021.03.18 |
[Spring MVC] @ModelAttribute 어노테이션 개념 정리 (0) | 2020.12.24 |
[Spring MVC] <spring:message> 태그로 저장된 문자열 출력 (0) | 2020.12.23 |