IoC
Inversion of Control(제어의 역전)
- 어플리케이션 안에서 객체가 생성/해제 및 참조하는 작업을 전적으로 프레임워크가 관리하는 형태
스프링 애플리케이션에서는
오브젝트(빈)의 생성과 의존 관계 설정, 사용, 제거 등의 작업을
애플리케이션 코드 대신 스프링 컨테이너
가 담당한다.
이를 스프링 컨테이너가 코드 대신 오브젝트에 대한 제어권을 갖고 있다고 해서 IoC라고 부른다.
스프링 컨테이너를 IoC 컨테이너라고도 부른다.
IoC 의 개념은
꼭 스프링 프레임워크 뿐만 아니라 타 프레임워크 및 디자인 패턴과 같이 범용적인 곳에서 사용되는데,
어떤 객체의 사용 여부가 타 객체에의해 수동적으로 결정되어 사용되는 방식도
IoC 의 개념이 적용된 거라고 볼 수 있다.
- 특징
- 제어의 흐름을 바꿔줌
- 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라,
외부에서 결정되는 것 - IoC를 사용하면 객체의 의존성을 역전시켜 객체 간의 결합도를 줄여줌
- 유연한 코드를 작성 할 수 있게 하여
가독성 및 코드 중복, 유지 보수를 편하게 할 수 있음
DI
Dependency Injection(의존성 주입)
- 특징
- 스프링이 다른 프레임워크와 차별화하여 제공하는 의존 관계 주입 기능
- 객체를 직접 생성하는 게 아니라, 외부에서 생성한 후 주입 시켜주는 방식
- Bean 설정 정보를 바탕으로 컨테이너가 자동으로 연결해주는 방식 (DL의 컨테이너 의존성을 줄인 방식)
- DI(의존성 주입)을 사용하면 모듈 간의 결합도가 낮아지고 유연성이 높아짐
- DI 기반으로 개발을 하면 특정 인터페이스 규격만 맞추면 다양한 형태의 결과 생성 가능
의존 관계
- 의존 관계라는건
A 가 B 타입 클래스 내에 메서드를 사용하는 경우 클래스 간의 의존관계가 있다 라고 표현한다.
이는 결국 B 클래스 내부의 기능이 추가/수정되는 경우 A 타입 객체에게도 영향이 가는 것을 의미한다. - 이때 A 클래스와 B 클래스 간의 의존관계를 느슨하게 할 수 있는 방법이
A 클래스가 B 클래스를 직접 참조하는 것이 아닌 C 인터페이스를 참조하도록 하고,
B 클래스는 C 인터페이스를 구현하도록 하는 것이다. - 이렇게 인터페이스를 통해 구현 클래스간의 직접적인 의존 관계를 없애주게 되면
B 클래스 내부 변경에 대한 영향을 덜 받게 된다.
- 의존 관계라는건
- 인터페이스를 통한 느슨한 의존 관계에서는
클래스 다이어그램만으로는 실제 A 클래스가
런타임 시점에 C 인터페이스를 구현한 어떤 구현 클래스를 사용할지 알 수 없다. - 사전에 설정을 통해 어떤 클래스의 객체를 쓸지 정해둘 수는 있으나
그 내용이 설계나 코드 상에는 나타나지 않는다. - 결국 컨테이너 설정에 따라 구체적인 사용 클래스를 지정해주고,
런타임 시점에 객체간의 의존 관계를 연결해주는 작업이 바로 의존관계주입이다.
- 인터페이스를 통한 느슨한 의존 관계에서는
설계 시점에서 알 수 없는 런타임 시점에 객체간의 의존관계를 제3자(스프링 컨테이너)가 결정하고,
컨테이너가 객체 레퍼런스를 제공해주는 것! 그것이 의존관계 주입의 핵심!
DL
Dependency Lookup, 의존성 검색
- 의존관계가 있는 객체를 외부에서 주입 받는 것이 아닌,
의존관계가 필요한 객체에서 직접 검색하는 방식 - 저장소에 저장되어 있는 Bean에 접근하기 위해
개발자들이 컨테이너에서 제공하는 API를 이용해서 Bean을 검색하는 방식 - 클라이언트 객체(의존관계가 필요한 객체)에서는 의존하고자 하는 인터페이스 타입만 지정해서 검색할 뿐
해당 인터페이스를 구현한 구체적인 클래스 객체에 대한 결정과 해당 객체에 대한 생명 주기는
IoC 컨테이너에서 책임진다.
IoC 컨테이너????????
스프링에서는 IoC를 담당하는 컨테이너를
빈 팩토리, DI 컨테이너, 애플리케이션 컨텍스트라고 부른다.오브젝트의 생성과 오브젝트 사이의 런타임 관계를 설정하는 DI 관점으로 보면,
컨테이너를 빈 팩토리 또는 DI 컨테이너라고 부른다.
+ 애플리케이션 컨텍스트
application context
스프링 컨테이너
는 단순한 DI 작업보다 더 많은 일을 하는데,
DI를 위한 빈 팩토리에 여러 가지 기능을 추가한 것애플리케이션 컨텍스트는 그 자체로 IoC와 DI 그 이상의 기능을 가진것과 마찬가지
(참고)
공부한 내용을 여러글과 책 읽은 내용을 바탕으로 정리하고 있습니다.
좋은 글로 저의 공부에 도움을 주시는 분들께 감사드립니다.