본문 바로가기

Language/파이썬

[Python] Dependency Injector (1)

반응형

의존성 주입 패턴(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 클래스의 객체를 직접 생성하고 사용한다. 이렇게 되면 UserRepositoryDatabase 클래스가 강하게 결합된다. 만약 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 클래스 간의 결합도가 낮아지고, 유지보수 및 코드 재사용성이 높아진다.

반응형

'Language > 파이썬' 카테고리의 다른 글

[Python] pandas  (0) 2023.03.29
[Python] ensure_future  (0) 2021.10.23
[Python] Queue  (0) 2021.03.05
[Python] GIL  (0) 2021.03.04
[Python] Flask  (0) 2021.01.27