[TIL]2021.07.26

pbg0205·2021년 7월 26일
0

🤔 Daily Review

1. DI, IoC + DI Container, ApplicationContext

DI를 사용하는 이유는 무엇일까? 보통 어플리케이션을 개발할 때, 하나의 처리를 수행하기 위해 여러 개의 컴포넌트를 조합해 구현해야 한다. 컴포넌트는 기능에 따라 분리한 요소들도 생각하면 쉽다. DB 접근 컴포넌트, 외부 시스템 접속 컴포넌트 등 다양한 컴포넌트들이 존재한다.

그렇다면 여러 개의 컴포넌트는 어떻게 조합할까? 스프링은 DI(Dependency Injection, 의존 관계 주입)을 통해서 컴포넌트를 조합하고 있다. DI란 어떤 클래스를 필요로 하는 컴포넌트를 외부에서 생성하여 필요한 위치에 주입하는 방식을 일컫는 말이다. DI는 IoC라고 하는 소프트웨어 디자인 패턴 중 하나이다.

IoC(Inversion of Control)인스턴스 제어 주도권이 역전됐다 는 의미이다. 그 이유는 기존에 객체를 생성하는 방식은 소스 코드 내부에서 객체를 생성하는 방식이었다. 그런데 IoC는 기존의 방식과 다르다. 객체를 생성하는 장소가 존재하고 객체를 생성한 다음, 필요한 곳에 해당 객체를 전달(주입)한다. 객체를 생성하는 장소를 DI Container라 부른다.

DI Container는 객체를 생성해서 해당 위치로 의존 관계를 주입하는 역할을 한다. 스프링에서는 DI Container 역할은 ApplicationContext담당한다. ApplicationContext는 일련의 과정을 통해 빈을 관리하고 원하는 위치에 빈을 주입하는 역할을 한다.


2. DI 컨테이너의 간단한 빈 관리 및 주입과정

  1. 먼저 컴포넌트를 등록한다. 등록한 컴포넌트는 ApplicationContext 인스턴스를 통해 가져올 수 있으며 스프링 프레임워크은 DI Container에 등록하는 컴포넌트를 빈(Bean), 이 빈에 대한 설정 정보를 빈 정의(Bean Definition), 빈을 꺼내오기 위해 DI Container에서 빈을 조회하는 작업을 룩업(lookup)이라 부른다.
  2. 의존성을 주입한다. 의존성을 주입하기 위해서는 해당 빈이 ApplicationContext에 등록되어 있어야 하며 존재하지 않은 경우, NoUniqueBeanDefinitionException을 발생한다. 의존성을 주입하는 법은 3가지 방법(setter, constructor, field)이 있으며, 빈을 주입하는 방식에는 수동 방식(@Bean, XML)과 자동 방식(@Autowired)가 있다
  3. 의존성을 주입하는데 몇가지 예외 상황이 발생한다. 객체의 타입이 같은 경우, 객체 이름이 같은 경우 등등 겹치는 상황을 대비해 여러가지 방법을 통해 빈을 관리하고 의존성을 주입한다.
profile
🧑‍💻 steady developer

0개의 댓글