IoC
- 객체가 사용할 객체를 스스로 선택하거나 생성하지 않는다.
- 객체 자신도 어떻게 만들어지고 어디서 사용되는지 알 수 없다.
- 모든 제어권을 다른 대상에게 위임한다.
스프링의 IoC
- 빈
- Spring Container가 제어권을 가지고 직접 생성하고 관계를 부여하는
대상
이 되는 객체를 말한다.
- Spring Container가 제어권을 가지고 직접 생성하고 관계를 부여하는
- 빈 팩토리
- Bean을 생성하고 관계를 설정하는 IoC 객체이다.
- Bean을 등록하고 생성하고 반환하고 관리한다.
- 보통 Bean Factory 를 확장한
애플리케이션 컨텍스트를 사용
한다.
- 애플리케이션 컨텍스트
- Bean Factory 를 상속하여 확장한 것으로 IoC 방식을 따라 만들어진 일종의 Bean Factory 이다.
- Bean Factory 가 빈을 제어하는 IoC 기본 기능에 초점을 맞춘것이라면, 애플리케이션 컨텍스트는 애플리케이션 전반에 걸쳐 모든 구성요소의 제어를 담당하는 IoC 엔진에 더 중점을 두고 있다.
IoC 컨테이너 / 스프링 컨테이너
- IoC 컨테이너와 스프링 컨테이너는 다른 것이 아니다. 다만 관점이 조금 다를 뿐이다.
- IoC 컨테이너의 경우 주로 빈 팩토리 관점에서 이야기할 때 쓰인다.
- 컨테이너/스프링 컨테이너라고 할 때는 애플리케이션 컨텍스트를 추상적으로 가리킬 때 사용한다.
- 결론은
컨테이너 == 스프링 컨테이너 == IoC 컨테이너 == 애플리케이션 컨텍스트 == 빈 팩토리 == 스프링
모두 같은 것이라고 생각하면 된다.
애플리케이션 컨텍스트
- 애플리케이션 컨텍스트는 객체를 직접 생성하고 할당하는 코드가 없다.
- 대신 그것에 대한 정보를
설정 정보를 통해서 얻는다
. - 동작방식
@Configuration
등이 붙은 클래스를 설정 정보로 등록해둔다.@Bean
이 붙은 메소드들의 이름을 가져와 이름과 메소드를 매핑해둔 Bean List를 생성해둔다.- getBean()이 호출되면 Bean List에서 해당되는 이름의 메소드를 찾아 호출하고 그 결과를 클라이언트에게 반환한다.
- 장점
- 직접 코드를 작성하는 대신, 어노테이션, XML 등의 간단한 방법으로 IoC 설정을 할 수 있다.
종합적인 IoC 서비스를 제공
한다.- 빈의 생성과 관계 설정 뿐만 아니라 생성 방식이나 생성 시점 그리고 전략까지 설정할 수 있다.
- 빈이 사용할 수 있는 기반 기술 서비스나 외부 시스템과의 연동 등을 컨테이너 차원에서 지원해 줄 수도 있다.
싱글톤 레지스트리
- 스프링이 직접
싱글톤 객체를 만들고 관리하는 기능
을 제공하는 것을 말한다. - 애플리케이션 컨텍스트가 싱글톤을 저장하고 관리하는 싱글톤 레지스트리이다.
- 애플리케이션 컨텍스트가 싱글톤 레지스트리인 이유는 애초에 스프링은 서버 환경을 고려해서 설계되었기 때문이다.
- 초당 수많은 요청이 들어오는 가운데, 요청이 들어올 때마다 객체를 새로 생성하는 것은 엄청난
낭비
이다. - 자바에서는
서블릿 또한 싱글톤으로 존재한다.
- 초당 수많은 요청이 들어오는 가운데, 요청이 들어올 때마다 객체를 새로 생성하는 것은 엄청난
- 빈 객체는 모두 싱글톤으로 만들어진다.
- 디자인 패턴에서의 싱글톤과 개념은 비슷하지만, 구현방식은 완전히 다르다.
- 싱글톤 레지스트리의 장점
- 평범한
public 생성자
를 가진 자바 클래스를 싱글톤으로 활용할 수 있게 만들어준다. - 제어권을 IoC 방식의 컨테이너에게 넘기면 해당 컨테이너가 객체 생성에 대한 모든 권한을 가지고 있기 때문에 객체가 싱글톤으로 존재할 수 있게 관리할 수 있다.
- 평범한
DI 컨테이너
- 두 객체 사이의 런타임 의존관계를 설정해주는 의존 관계 주입 작업을 주도하는 존재이다.
의존관계 주입 (DI)
- 오브젝트 레퍼런스를 외부로부터 주입 받고, 이를 통해 여타 오브젝트와 동적으로 의존관계가 만들어지는 것을 말한다.
- 의존관계 주입이란 의존 오브젝트와 그것을 사용할 주체 오브젝트를 런타임 시에 연결해주는 작업을 말한다.
의존관계 검색 (DL)
- 객체 스스로 검생하여 의존관계를 맺는 것을 말한다.
- 의존관계를 맺을 대상 객체를 결정하고 생성하는 작업은 외부 컨테이너에게 IoC로 맡기지만, 이를 가져올 때는 메소드나 생성자를 통한 주입 대신 스스로 컨테이너에게 요청하는 방법을 사용한다.
context.getBean("connectionMaker", ConnectionMaker.class);
이렇게 컨테이너에게 직접 요청하는 것이다.- DL에서는 검색을 하는 주체 객체는 꼭 스프링 빈일 필요가 없다는 것다.
- 하지만 DI의 경우에는 반드시 스프링 빈 객체여야만 한다.
REFERENCES
- 토비의 스프링 1장
'Books' 카테고리의 다른 글
클린코드 4장 (주석) (0) | 2022.04.23 |
---|---|
클린코드 3장 (함수) (0) | 2022.04.17 |
클린코드 1장, 2장 (0) | 2022.04.17 |
템플릿 콜백 패턴 (토비의 스프링 3장) (0) | 2022.02.28 |
테스트란 (토비의 스프링 2장) (0) | 2022.02.27 |