본문 바로가기
스터디/토비의 스프링

[토비의 스프링] 의존 관계 주입 (DI)

by Bhinney 2023. 2. 1.

📚 토비의 스프링 3.1 vol.1 111pg ~ 128pg

📚 계속 수정될 예정


📍들어가기 전에

제어의 역전(IoC)과 의존 관계 주입
  • 스프링을 IoC 컨테이너라고만 해서는 스프링이 제공하는 기능의 특징을 명확하게 설명하지 못함
  • 의도가 좀 더 명확한 의존 관계 주입(Dependency Injection) 용어 사용
  • 스프링이 컨테이너 이며 프레임 워크이기에 기본적인 동작 원리가 모두 IoC 방식이라고 할 수 있음
  • 스프링이 다른 프레임워크와 차별화 할 때에는 의존 관계 주입 컨테이너(DI 컨테이너)라고 하는 것이 더 분명하게 드러남

📍 의존 관계 주입

의존 관계 주입
  • Dependency Injection
  • 오브젝트 레퍼런스를 외부로부터 제공(주입) 받고 이를 통해 다른 오브젝트와 다이나믹하게 의존관계가 만들어 지는 것
  • 구체적인 의존 오브젝트와 그것을 사용할 주체(보통 클라이언트라 부르는 오브젝트)를 연결해주는 작업
의존 관계 조건
  • 클래스의 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않음, 그러기 위해서는 인터페이스에만 의존해야 함
  • 런타임 시점의 의존관계는 컨테어너나 다른 팩토리 같은 제 3의 존재가 결정
  • 의존 관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 주입해 줌으로써 만들어 짐

📁 DI는 자신이 사용할 오브젝트에 대한 선택과 생성 제어권을 외부로 넘기고 자신은 수동적으로 주입받은 오브젝트를 사용, 이는 IoC 개념에 일치


📍 의존 관계 검색

의존 관계 검색
  • Dependency Lookup
  • 구체적인 클래스에 의존하지 않고, 런타임 시에 의존관계 결정 (의존관계 주입과 비슷한 점)
  • 스스로 검색을 이용하여 의존 관계를 맺음
  • 자신이 필요로 하는 의존 오브젝트를 능동적으로 찾음
  • IoC라고 할 수는 없음

📁 런타임 시 의존관계를 맺을 오브젝트를 결정하는 것과 오브젝트의 생성 작업은 외보 컨테이너에 IoC로 맡기지만, 가져올 때에는 스스로 컨테이너에게 요청하는 방법 사용


📍 메서드를 이용한 의존 관계 주입

1️⃣ 수정자 메서드를 이용한 주입

  • 수정자 메서드(setter)는 외부에서 오브젝트 내부의 애트리뷰트 값을 변경하는 용도로 주로 사용
  • 파라미터로 전달된 값을 보통 내부의 인스턴스 변수에 저장하는 것
  • 부가적으로 입력 값에 대한 검증 등을 수행할 수 도 있음
  • 외부로부터 제공받은 오브젝트 레퍼런스를 저장하였다가 내부의 메서드에서 사용하게 하는 DI 방식에서 활용이 적당

2️⃣ 일반 메서드를 이용한 주입

  • 수정자 메서드처럼 set으로 시작해야 함
  • 여러개의 파라미터를 받을 수 있음

 

댓글