제어의 역전 ( IoC (Inversion of Control) )
프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것을 제어의 역전(IoC)이라 한다.
스프링 컨테이너가 필요에 따라 개발자 대신 Bean들을 관리(제어)해주는 행위
(내가 뭔가 호출하는게 아니라 객체 관리 프로그램이 내 코드를 대신 호출해줌) 제어권이 뒤바뀐다 !
기존 프로그램은 클라이언트 구현 객체가 스스로 필요한 서버 구현 객체를 생성하고, 연결하고, 실행했다. 한마디로 구현 객체가 프로그램의 제어 흐름을 스스로 조종했다.
하지만 Spring에서는 xml파일 또는 어노테이션 방식으로 스프링 컨테너에 Bean(객체)를 등록하기만 하면, 스프링 컨테이너에서 Bean의 생명주기(생명 -> 의존성 설정 -> 초기화 -> 소멸)를 전부 관리해준다.
따라서, 객체에 대한 제어권이 컨테이너로 역전되기 때문에 제어의 역전이라고 하는 것이다.
✔︎ 프레임워크 vs 라이브러리
- 프레임워크가 내가 작성한 코드를 제어하고, 대신 실행하면 그것은 프레임워크가 맞다. (JUnit)
- 반면에 내가 작성한 코드가 직접 제어의 흐름을 담당한다면 그것은 프레임워크가 아니라 라이브러리다. (xml, json 불러와서 쓰는거)
✔︎ Ioc가 필요한 이유
- 객체 지향 원칙을 잘 지키기 위함
- 객체를 관리해주는 프레임워크와 내가 구현하고자 하는 부분으로 역할과 관심을 분리해 응집도를 높이고 결합도를 낮추며, 이에 따라 변경에 유연한 코드를 작성 할 수 있는 구조가 될 수 있기 때문에 제어를 역전한 것이다.
의존성 주입 ( DI (Dependency Injection) )
애플리케이션 실행 시점에 외부에서 실현 구현 객체를 생성하고 클라이언트에 전달해서 클라이언트와 서버의 실존 관계가 연결 되는 것. 객체 인스턴스를 생성하고, 그 참조값을 전달해서 연결된다.
어떤 객체에 스프링 컨테이너가 또 다른 객체와 의존성을 맺어주는 행위
의존성 주입은 제어의 역전의 하위 개념이다.
★ 의존관계는 정적인 클래스 의존 관계와, 실행 시점에 결정되는 동적인 객체(인스턴스) 의존 관계 둘을 분리해서 생각해야 한다.
장점
- 의존관계 주입을 사용하면 클라이언트 코드를 변경하지 않고, 클라이언트가 호출하는 대상의 타입 인스턴스를 변경할 수 있다.
- 의존관계 주입을 사용하면 정적인 클래스 의존관계를 변경하지 않고, 동적인 객체 인스턴스 의존관계를 쉽게 변경할 수 있다.
정적인 클래스 의존관계
- 클래스가 사용하는 import 코드만 보고 의존관계를 쉽게 판단할 수 있다. 정적인 의존관계는 애플리케이션을 실행하지 않아도 분석할 수 있다.
- 아래의 클래스 다이어그램을 보면
OrderServiceImpl
은MemberRepository
,DiscountPolicy
에 의존한다는 것을 알 수 있다.
그런데 이러한 클래스 의존관계 만으로는 실제 어떤 객체가OrderServiceImpl
에 주입 될지 알 수 없다.
동적인 객체 인스턴스 의존 관계
- 애플리케이션 실행 시점에 실제 생성된 객체 인스턴스의 참조가 연결된 의존 관계다.
- 애플리케이션 실행 시점(런타임)에 외부에서 실제 구현 객체를 생성하고 클라이언트에 전달해서 클라이언 트와 서버의 실제 의존관계가 연결 되는 것을 의존관계 주입(DI)이라 한다.
- 객체 인스턴스를 생성하고, 그 참조값을 전달해서 연결된다.
- ★ 의존관계 주입을 사용하면 클라이언트 코드를 변경하지 않고, 클라이언트가 호출하는 대상의 타입 인스턴스를 변경할 수 있다.
- ★ 의존관계 주입을 사용하면 정적인 클래스 의존관계를 변경하지 않고, 동적인 객체 인스턴스 의존관계를 쉽게 변경할 수 있다.
DI 컨테이너 (IoC 컨테이너)
- 객체를 생성하고 관리하면서 의존관계를 연결해 주는 것을 DI 컨테이너 또는 IoC 컨테이너
(IoC 컨테이너는 범용적인 언어)라고 한다. - 의존관계 주입에 초점을 맞춰, 최근에는 주로 DI 컨테이너라 한다. 또는 어샘블러(블럭처럼 조립을 한다고 하여), 오브젝트 팩토리(오브젝트를 만들어야 한다고 하여) 등으로 불리기도 한다.
참조
이 게시물은 인프런 - 김영한님의 강의 / 스프링 핵심 원리 - 기본편을 바탕으로 제작된 게시물입니다.
https://velog.io/@damiano1027/Spring-의존성-주입-제어의-역전
https://beststar-1.tistory.com/33
'Web > Spring' 카테고리의 다른 글
Page scope (0) | 2021.06.24 |
---|---|
Scope (0) | 2021.06.24 |
객체 지향 설계와 스프링 (0) | 2021.06.01 |
좋은 객체 지향 프로그래밍이란? (1) | 2021.06.01 |
Spring (스프링)이란 ? (0) | 2021.06.01 |