코드 그라데이션

의존성 주입과 제어의 역전 본문

Spring/개념 정리

의존성 주입과 제어의 역전

완벽한 장면 2023. 1. 21. 18:55

의존성 주입 [DI(Dependency Injection)] & 제어의 역전[IoC(Inversion of Control)]

 

👉 IoC(Inversion of Control : 제어의 역전)

- 애플리케이션의 전체 동작 방식을 구성하기 위해 구현 객체를 생성, 연결하는 별도의 설정 클래스인 AppConfig가 있다고 하자.


- 위 그림과 같이 OrderServiceImpl은 필요한 인터페이스(DiscountPolicy)들을 AppConfig로 부터 호출하지만 어떻게 생성 될지는 알 수 없다. 메소드가 실행 됬을때 제어흐름도 AppConfig 가 들고 있던걸 실행하는것이기 때문에 프로그램의 제어 흐름에 대한 모든 권한도 AppConfig가 가지고 있다. 다쓰면 객체도 반납한다.

- 이처럼 프로그램의 제어 흐름을 OrderServiceImpl이 직접 제어하는 것이 아닌 AppConfig와 같이 외부에서 관리하는 것을 IoC(제어의 역전)이라고 한다.

 

🗃️ 컨테이너란?

  • Appconfig와 같이 객체를 생성하고 관리하면서 의존 관계를 연결해 주는 것을 IoC 컨테이너 또는 DI 컨테이너라 한다. 주로 DI 컨테이너라 하지만 어셈블러, Object Factory 등으로 불리기도 한다.

🙂 일반적인 제어흐름: 사용자가 자신이 필요한 객체를 생성해서 사용

🙃 역전된 제어흐름 : 사용자가 자신이 필요한 객체(또는 사용할 객체)에 @ 으로 표시하면 컨테이너에서 꺼내서 넣어주니까 바로 사용하면됨

  • 용도에 맞게 필요한 객체를 생성없이 그냥 가져다 사용
    • "DI (Dependency Injection)" 한국말로 "의존성 주입"
  • 사용할 객체가 어떻게 만들어졌는지는 알 필요 없음
  • 사실 알아야 되긴 하지만, 사용할 객체의 수정내용을 일일이 반영하는 리소스를 아낄 수 있다는 의미)
// 기존 객체 생성
private Object object = new Object();

// 객체 주입 받기 (아래 방법 말고도 많음)
@Autowired
private Object object;

 

  • 객체 생성 방법
    • Setter Injection (수정자 주입)
    • Constructor Injection (생성자 주입) - @RequiredArgsConstructor …
    • Method Injection (필드 주입) - @Autowired … 
728x90
Comments