본문 바로가기
Web 개발/FAST API (인프런 강의 내용)

4 실습2 Refactoring - Dependency Injection 의존성 주입

by yororing 2024. 8. 8.

앞 단계 참조 링크:

 

00 개요

01 의존성 주입이란

1. 정의 및 개념

  • Dependency Injection
  • 다양한 클래스나 함수 간의 강한 결합을 줄이기 위해 사용되는 기술
  • 의존성을 사용하는 component가 직접 정하는 것이 아니라 외부에서 전달 (주입)
  • Injector라고 불리는 별도의 모듈에서 관리
  • 관련 용어
    • coupling (결합): 강하게 결합된 component들은 수정과 변경이 어렵기에 컴퓨터 프로그래밍에서는 일반적으로 느슨한 결합 추구 
    • dependency (의존성): 한 component가 올바르게 동작하기 위해 다른 요소에 의존하는 것 
      • 예) 자동차가 굴러가기 위해 바퀴 필요 → 자동차는 바퀴에 의존적임 
      • 의존적이다 → 어떤 것을 사용한
  • 즉, 의존성 주입이란, 어떤 component가 사용하는 다른 component를 외부에서 결정해주는 것을 의미
  • 일반적으로 framework나 library 단에서 의존성 주입을 처리함
  • 보통 injector라고 불리는 별도의 module 또는 component에 의해 의존성 주입이 처리됨
  • FastAPI 역시 의존성 주입을 지원함
  • 우리가 전에 사용했던 Depends (api/todos.py에서 사용)가 API에서 사용되어야 하는 의존성을 주입해주게 됨

2. 코드 예시

1) Before 의존성 주입

class Body:
    def __init__(self, color):
        self.color = color

class Car:
    def __init__(self):
        self.body = Body(color='red')
    
    def drive(self):
        pass

red_car = Car()
  • Dependenct Injection을 적용하기 전에는 이 body 속성 안에 red 색의 body가 이미 속성 안에 존재하게 됨
  • Car()를 red_car에 저장하여 만들 경우 우리는 red 색의 body를 가진 자동차만 생성할 수 있음.

 

2) After 의존성 주입

class Body:
    def __init__(self, color):
        self.color = color
    
class Car:
    def __init__(self, body):		# 의존성 적용
        self.body = body
    
    def drive(self):
        pass

red_car = Car(body=Body(color='red'))
blue_car = Car(body=Body(color='blue'))
  • 그러나, Dependenct Injection을 적용하면 Car 부분에서 body를 직접 생성하는 것이 아니라 인자로서 전달을 받게 됨
  • 이런 경우 Car() 생성 시 body의 색상을 지정해 줌에 따라 red, blue, 및 다른 자유롭게 Car()의 body 색상을 변경할 수 있게 됨
  • 그러므로 의존성 주입을 사용한다는 의미는, 객체가 생성되는 시점에 외부에서 어떤 속성들을 지정해준다는 의미