해결된 질문
작성
·
347
·
수정됨
0
(실습) 회원가입 API 구현 강의에서 질문이 있습니다.
Depends가 Request 할때마다 객체를 생성하는 것으로 이해하고 있습니다.
Depends를 테스트를 위해서 활용하는 것으로 이해했었는데, pyTest를 보면 mock.patch라는 기능으로 DI 없이 목킹을 잘 할 수 있는것으로 보았습니다.
UserService를 Depends 처리하면, 요청마다 service를 생성할 것 같은데, 이러면 불필요한 생성과 소멸이 반복될 것 같은데, Depends를 쓰는게 좋을까요? 아니면 싱글톤으로 작성하는게 좋을까요?
답변 1
1
안녕하세요! 매우 합리적인 고민입니다.
먼저 이해하고 계신대로 Depends()에 클래스를 전달하면 요청마다 객체를 생성하고 삭제합니다. 객체의 불필요한 생성과 삭제 과정의 메모리 사용을 최적화하고 싶다면, 싱글톤 형태로 구현하시면 됩니다!
대신 싱글톤 패턴을 적용했을 때는 프로젝트에 필요한 모든 객체를 미리 만들어두는 것이 불필요한 메모리 낭비라고 생각할 수도 있을 것 같습니다. 따라서 이 부분은 명확한 정답이 있기 보다는 각 방식의 장단점을 고려해서 결정하시면 될 것 같습니다.
Dependency Injection을 적용하는 것은 꼭 테스트를 용이하기 위해서만 사용하는 것은 아닙니다. DI를 적용하면 큰 프로젝트를 관리할 때 조금 더 유연하게 의존성 관리를 할 수 있습니다.
현재 코드에서는 DI를 적용하는 것의 효과가 크게 와닿지 않으실 수 있는데요. 만약 UserService 객체가 instantiate 되기 위해 여러 개의 인자를 필요로 한다고 가정했을 때, 해당 클래스를 사용하는 router 마다 직접 객체를 생성하면 인자가 변경되었을 때 이를 수정하는 것이 매우 번거로워집니다. 그래서 이런 경우에 객체를 생성하는 부분과 주입하는 부분을 분리해놓게 되면, 훨씬 유연하게 의존성을 관리할 수 있습니다.
대신 앞서 생각하고 계신대로 싱글톤 패턴을 적용하면 인자가 변경되는 것은 크게 필요 없는 고민일 수도 있습니다. 하지만 싱글톤이라 할지라도 객체를 생성하는 부분과 주입하는 부분이 분리되어 있다면 이는 DI를 적용했다고 볼 수 있습니다.
큰 프로젝트에 DI를 적용할 때는 아래의 라이브러리를 함께 사용하고 있으니, 한 번 참고해보시면 좋을 것 같습니다! https://python-dependency-injector.ets-labs.org/index.html
너무 좋은 답변 감사드립니다 ㅠㅠ.
말씀하신 문서 찾아서 공부하겠습니다.
감사합니다.