의존성 주입 패턴(Dependency Injection Pattern)은 일반적으로 객체 생성 시, 해당 객체가 의존하는 다른 객체를 직접 생성하는 것이 아니라 외부에서 주입받도록 하는 방법이다. 이를 통해 객체 간의 결합도가 낮아지기 때문에, 유지보수 및 코드 재사용성이 높일 수 있다. Dependency Injector는 Python에서 의존성 주입 패턴을 구현할 수 있게 도와주는 라이브러리 중 하나이다. 이를 사용해 객체 간의 결합도를 낮추고, 코드의 유연성과 확장성을 높일 수 있다.
처음에는 이런 개념이 잘 와닿지 않았다. 이러한 Dependency Injector의 개념과 기능들을 코드 예시와 함께 설명하면 좀 더 쉽게 이해할 수 있다.
class Database:
def __init__(self, connection_string):
self.connection_string = connection_string
...
class UserRepository:
def __init__(self):
self.db = Database("schema://localhost:3306/db")
def get_user(self, user_id):
...
위 코드의 UserRepository
에서는 Database
클래스의 객체를 직접 생성하고 사용한다. 이렇게 되면 UserRepository
와 Database
클래스가 강하게 결합된다. 만약 Database 클래스의 구현이 변경될 경우 이를 사용하고 있는 UserRepository 클래스도 함께 수정해야 하는 문제가 발생한다. 이러한 문제를 해결하기 위해 의존성 주입을 사용할 수 있다.
의존성 주입을 적용하면 UserRepository 클래스가 Database 클래스를 생성하는 것이 아니라, 외부에서 생성된 Database 객체를 주입받도록 변경할 수 있다. 예를 들어 생성자 주입(Constructor Injection) 방식을 사용하여 UserRepository 클래스의 생성자에서 외부에서 생성된 Database 객체를 받도록 수정할 수 있다. 아래는 예시 코드이다.
class UserRepository:
def __init__(self, db):
self.db = db
def get_user(self, user_id):
...
if __name__ == '__main__':
db_connection = Database(connection_string)
user_repository = UserRepository(db_connection)
UserRepository 클래스에서 Database 객체를 생성하는 것이 아니라 외부에서 생성된 객체를 사용하도록 수정했다. 이를 통해 UserRepository와 Database 클래스 간의 결합도가 낮아지고, 유지보수 및 코드 재사용성이 높아진다.