๐ ๋ค์ด๊ฐ๋ฉฐ
์ํํธ์จ์ด๋ฅผ ์ค๊ณํ๋ค๋ณด๋ฉด DI ํจํด์ ์ ์ฉํด์ผํ๋ ๊ฒฝ์ฐ ์์ต๋๋ค. python ๊ธฐ์ค์ผ๋ก ๊ฐ์ฒด์ ์์กด์ฑ ์ฃผ์
์ ๋ค์ํ ๋ฐฉ์์ผ๋ก ๊ตฌํํ ์ ์์ง๋ง, Python์์ DI ํจํด์ ํ๋ ์์ํฌ ํํ๋ก ๊ตฌํํ Dependency Injector ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ์์กด์ฑ ์ฃผ์
๊ณผ ์ ์ด์ ์ญ์ (IoC)๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด๋ฒ ํฌ์คํ
์์๋ FastAPI์ Dependency Injector๋ฅผ ํ์ฉํด Layered ์ํคํ์ฒ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
๐ ์์กด์ฑ ์ฃผ์ ์ ๋ํ ๊ฐ๋จ ์ค๋ช
์ด๋ฒ ํฌ์คํ
์์ ์์กด์ฑ ์ฃผ์
์ ๋ํ ๊ฐ๋
์ ๋ํด ์ค๋ช
ํ์ง ์์ง๋ง, ๊ฐ๋จํ ์ง๊ณ ๋์ด๊ฐ๊ฒ ์ต๋๋ค. DI, IoC, DIP์ ๊ฐ์ ๊ฐ๋
์ Spring๊ณผ ๊ฐ์ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ค๊ฑฐ๋, ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ๋ํด ๊ณต๋ถํ์
จ๋ค๋ฉด ๋ง์ด ๋ค์ด๋ดค์ ๋ด์ฉ์ผ ๊ฒ๋๋ค.
์์กด์ฑ ์ฃผ์
์ด๋ ๋ง ๊ทธ๋๋ก ํน์ ๊ฐ์ฒด(A)์์ ํ์ํ ๊ฐ์ฒด(B)๋ฅผ A์์ ํด๋์ค๋ฅผ import ํด์ ๊ฐ์ฒด๋ก ๋ง๋ค์ด ์ฌ์ฉํ๋ ๊ฒ์ด ๋ง๋๋ ๊ฒ์ด ์๋, A๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ์์ฑ์๋ฅผ ํตํด B๊ฐ์ฒด๋ฅผ ์ ๋ฌ(์ฃผ์
)ํด์ฃผ๋ ๋ฐฉ์์
๋๋ค.
IoC ์ฆ ์์กด ์ ์ด ์ญ์ ์ ์์น์ ์ด๋ฌํ ์์กด์ฑ์ ๊ด๋ฆฌ์ ํ๋ฆ ์ ์ด๋ฅผ A๊ฐ์ฒด, B๊ฐ์ฒด๊ฐ ์๋ ์ 3์ ๋ฐฉ์(์์กด ์ ์ด ์ปจํ
์ด๋, ํ๋ ์์ํฌ ๋ฑ)์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ ์
๋๋ค. ์คํ๋ง์์๋ Bean ์ปจํ
์ด๋๊ฐ, ๊ทธ๋ฆฌ๊ณ python Dependency Injector์์ Container๋ผ๋ ๊ฐ์ฒด๋ฅผ ํตํด ์์กด ์ ์ด ์ญ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
๐ฆ Dependency Injector ์๊ฐ
Dependency Injector๋ python ์ํ๊ณ์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ DI ํ๋ ์์ํฌ ์ค ํ๋์
๋๋ค. DI ํจํด์ ์ํ ํต์ฌ ๊ธฐ๋ฅ์ธ IoC ์ปจํ
์ด๋๋ฅผ ์ ๊ณตํ๊ณ ๋ฌธ์๋ฅผ ํตํด ์ ์ฆ์ผ์ด์ค์ ๋ํ ์์ ์ฝ๋๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ๋๋ฌธ์ ํ๋ก์ ํธ์ ์ ์ฉํ๊ธฐ ์ฝ์ต๋๋ค. ๋ํ ๋ง์ ํ๋ก๋์
ํ๊ฒฝ์์ ์ฌ์ฉ๋์ด ์์ ์ฑ์ด ๊ฒ์ฆ๋์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
๐ ์ฃผ์ ๊ฐ๋
Providers: ์ฃผ์
ํ ๊ฐ์ฒด๋ฅผ ์ ๊ณตํ๋ ๊ฐ์ฒด์
๋๋ค. ๊ฐ์ฒด๋ฅผ ์ฃผ์
ํ ๋ฐฉ๋ฒ(Singleton, Factory, Callable, Object...)๋ฑ ๊ฐ์ฒด๋ฅผ ์ฃผ์
ํ ์ ์๋ ๋ค์ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์๋ฅผ๋ค์ด Singleton์ผ๋ก ์ ์๋ Provider๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ปจํ
์ด๋์ ์ ์๋ ํด๋น ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ๋ ๊ฐ์ฒด๊ฐ ๋ค์ ์์ฑ๋์ง ์์ต๋๋ค. ๋ฐ๋ช
Factory๋ก ์ ์๋์๋ค๋ฉด, ์ฃผ์
๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ๋ ๋ง๋ค ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ์์ฑ๋ฉ๋๋ค.
Containers : ์์กด์ฑ์ด ์ ์๋ Provider์ ์งํฉ์
๋๋ค. Container๋ฅผ ํตํด ๊ฐ์ฒด๋ค์ ์์กด์ฑ์ ๋ช
์์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ๋ํ ์์กด์ฑ ์ฃผ์
์ด ํ์ํ ๋ถ๋ถ์์ Container๋ฅผ ํตํด Provider ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํด์ ์์กด์ฑ์ ์ฃผ์
๋ฐ์ ์ ์์ต๋๋ค.
Wiring: ์์กด์ฑ์ ์ฃผ์
ํ๋ ๋ถ๋ถ์
๋๋ค. Provider๋ฅผ ํตํด ๋ช
์๋ ์ฃผ์
๋ฐฉ์์ผ๋ก, ๊ฐ์ฒด๋ฅผ ์ฃผ์
ํ Class์ ์์น๋ฅผ ๋ช
์ํฉ๋๋ค.
๐ง ์์ ์ฝ๋
๊ฐ๋ น ๋ค์๊ณผ ๊ฐ์ ํด๋์ค๊ฐ ๊ด๊ณ๊ฐ ์๋ค๊ณ ํ์ ๋, Dependency Injector๋ฅผ ์ฌ์ฉํด ์์กด์ฑ ์ฃผ์
์ ํ๋ ์ฝ๋๋ฅผ ์์๋ก ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๊ฐ๋จํ ๋ธ๋ก๊ทธ์ ๊ธ์ ํฌ์คํ
ํ๋ ํด๋์ค์ ์์กด๊ด๊ณ๋ฅผ ๊ทธ๋ ค๋ณด๊ฒ ์ต๋๋ค.
BlogService ํด๋์ค๋ PostRepository์ ๊ธฐ๋ฅ์ ์ฌ์ฉํด ํฌ์คํ
์ ๊ด๋ฆฌํ๊ฒ ๋ฉ๋๋ค. ๋จผ์ BlogService ์ฝ๋๋ฅผ ์ดํด๋ณผ๊น์?
class BlogService:
def __init__(self, repository: PostRepository):
self._repository = repository
def create_post(self, title, content):
post = Post(title, content)
self._repository.add_post(post)
def get_posts(self):
return self._repository.list_posts()
BlogService์์๋ Post์ ์์์ฑ์ ๊ด๋ฆฌํ๋ Repository๋ฅผ ์์ฑ์๋ฅผ ํตํด ์ฃผ์
๋ฐ์ต๋๋ค. ํด๋น repository ์์ฑ์ ์ฌ์ฉํด์ post๋ฅผ ์์ฑ(create_post), ์กฐํ(get_posts) ํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํฉ๋๋ค.
PostRepository ์ฝ๋๋ฅผ ํ์ธํด๋ณด๋ฉด
class PostRepository:
def __init__(self):
self._posts = []
def add_post(self, post):
self._posts.append(post)
def list_posts(self):
return self._posts
๊ฐ๋จํ๊ฒ listํํ๋ก Post๋ฅผ ๋๊ฒจ๋ฐ๊ณ ๊ด๋ฆฌํ๋ repository์
๋๋ค. add_post๋ฅผ ํตํด _post๋ณ์์ ์ Post ์ธ์คํด์ค๋ฅผ ์ ์ฅํ๊ณ list_posts ํจ์๋ฅผ ํตํด ๋ถ๋ฌ์ค๋ ์ฝ๋์
๋๋ค.
์ ๋ ํจ์์ ์์กด๊ด๊ณ๋ฅผ Container์ ๋ช
์ํ๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
from dependency_injector import containers, providers
class Container(containers.DeclarativeContainer):
post_repository = providers.Singleton(PostRepository)
blog_service = providers.Factory(BlogService, repository=post_repository)
post_repository๋ฅผ Signleton์ผ๋ก ์ ์ํ๊ณ , blog_service์ ์ฃผ์
์์ผ ์ฃผ์์ต๋๋ค. blog_service๋ Factory๋ก ์ ์๋์ด์์ผ๋ Provicer๋ฅผ ํตํด ๋งค๋ฒ ๋ค๋ฅธ blog_service ์ธ์คํด์ค๋ฅผ ์ป์ ์ ์์ต๋๋ค.
์์กด๊ด๊ณ๋ฅผ ๋ช
์ํ์ผ๋ container๋ฅผ ํตํด blog_service๋ฅผ ์ฃผ์
ํด๋ณผ๊น์?
main ํจ์์์ ํด๋น ์ปจํ ์ด๋๋ฅผ ํตํด ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ํด๋ณด๊ฒ ์ต๋๋ค.
from dependency_injector import containers, providers
from dependency_injector.wiring import Provide, inject
class Container(containers.DeclarativeContainer):
post_repository = providers.Singleton(PostRepository)
blog_service = providers.Factory(BlogService, repository=post_repository)
@inject
def main(blog_service: BlogService = Provide[Container.service]) -> None:
blog_service.creade_post(Post("์ ๋ชฉ", "๋ด์ฉ"))
print(blog_service.get_posts()) # Post(์ ๋ชฉ, ๋ด์ฉ)
if __name__ == "__main__":
container = Container()
container.wire(modules=[__name__])
main()
main ํจ์์ ์ธ์๋ก blog_service๋ฅผ ์ฃผ์
ํด ์คฌ์ต๋๋ค. @inject ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํด์ ์ฃผ์
์ด ๋ main ํจ์์ ์์น๋ฅผ ๋ช
์ํด์ฃผ์๊ณ , container์์๋ inject๋ ๋ชจ๋์ ์์น๋ฅผ ๋ช
์ํ์ต๋๋ค.(@inject ๋ฐ์ฝ๋ ์ดํฐ๋ ์์ด๋ ์ ์๋ํฉ๋๋ค.)
์์ฒ๋ผ main ํจ์์์ ์ธ์๋ฅผ Provide ๋์คํจ์ฒ๋ฅผ ํตํด ์ฃผ์ ํด์ค๋ค๋ฉด, main ํจ์๋ฅผ ์์ฑํ ๋ ์ธ์๋ก blog_service๋ฅผ ๋๊ฒจ์ฃผ์ง ์์๋ Provider๊ฐ ์ ์ ํ blog_service ์ธ์คํด์ค๋ฅผ ์ฃผ์ ์์ผ ์ฃผ๊ฒ ๋ฉ๋๋ค.
๐ FastAPI์ ์์กด์ฑ ์ฃผ์
FastAPI๋ ์์ฒด์ ์ธ ์์กด์ฑ ์ฃผ์
๋์คํจ์ฒ์ธ Depends๊ฐ ์์ต๋๋ค. Depends๋ฅผ ํตํด ์์กด๊ด๊ณ์ ์๋ ์ธ์คํด์ค๋ฅผ ์ฃผ์
ํ๊ฑฐ๋ ์์กด์ฑ์ ์ฃผ์
ํ๋ ๋ฐฉ์์ ๋ช
์์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ค์์ FastAPI์์ Depends๋ฅผ ํตํด ์์กด์ฑ์ ์ฃผ์
ํ๋ ์์์
๋๋ค.
์์์ ์ฌ์ฉํ ๋ธ๋ก๊ทธ ํฌ์คํ
์์ ๋ฅผ FastAPI์ Routerํจ์์์ BlogService์ ์ธ์คํด์ค๋ฅผ ์ฃผ์
๋ฐ์ ์ฌ์ฉํ๋ ์์๋ฅผ ๊ตฌํํด๋ณด์์ต๋๋ค.
from fastapi import FastAPI, Depends
app = FastAPI()
# ์์กด์ฑ์ ์ ์ํ๋ ํจ์
def get_post_repository():
return PostRepository()
def get_blog_service(repository: PostRepository = Depends(get_post_repository)):
return BlogService(repository)
# ๋ผ์ฐํธ ์์
@app.get("/posts")
def list_blog_posts(blog_service: BlogService = Depends(get_blog_service)):
return blog_service.list_posts()
@app.post("/posts")
def create_blog_post(post_data: dict, blog_service: BlogService = Depends(get_blog_service)):
blog_service.add_post(post_data)
FastAPI์ ๋ผ์ฐํฐ ํจ์์ Depends๋ฅผ ์ฌ์ฉํด get_blog_service ํจ์๋ฅผ ํธ์ถํ ์ ์๋๋ก ์ธ์์ ๋์คํจ์ฒ๋ฅผ ์ ์ํฉ๋๋ค.
get_blog_service ํจ์์์๋ BlogService๋ฅผ ๊ฐ์ฒด๋ก ๋ง๋ค๊ณ ํด๋น ํจ์์ ์ธ์์์๋ get_post_repository๋ฅผ ์ ๋ฌ๋ฐ์ต๋๋ค. ์ธ์๋ฅผ ํตํด ๋๊ฒจ๋ฐ์ PostRepository์ ๊ฐ์ฒด๋ฅผ BlogService์ ์์ฑ์๋ก ๋๊ฒจ์ฃผ๋ ์ฝ๋์
๋๋ค.
์ด์ฒ๋ผ FastAPI์ Depends ํจ์๋ฅผ ํตํด ์์กด์ฑ์ ์ฃผ์
ํ ์ ์์ง๋ง, Depends ๋ง์ผ๋ก ์์กด์ฑ์ ๊ด๋ฆฌํ์ ๋ ๋๊ปด์ง๋ ๋ฌธ์ ์ ์ด ์์ต๋๋ค.
- API์ path/query ์ธ์๋ฅผ ํตํด ์์ฑ๋๋ ๊ณต์ ๋ก์ง๊ณผ ์์กด์ฑ ์ฃผ์ ์ ํตํด ์์ฑํด์ผํ๋ ๊ฐ์ฒด ๊ด๊ณ๊ฐ ์ฝํ๊ฒ ๋ฉ๋๋ค.
- ์์กด ๊ด๊ณ๋ฅผ ํ๋ฒ์ ํ์ ํ๊ธฐ ํ๋ญ๋๋ค. Depends๋ฅผ ๊ณ์ ์ฐธ์กฐํ๋ฉฐ ํจ์๋ง๋ค ์ด๋ค ๊ฐ์ฒด๊ฐ ์ฃผ์ ๋์๋์ง ํ์ธํด์ผํฉ๋๋ค.
- ์์กด๊ด๊ณ๋ฅผ ๋ช ์ํ๋ ๋ถ๋ถ๊ณผ ์ค์ ์ฝ๋๋ก์ง์ด ์์ด๊ฒ ๋ฉ๋๋ค.
๐ค FastAPI์ Dependency Injector๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ค๋ฉด?
FastAPI์ ์์กด์ฑ ์ฃผ์ ํ๋ ์์ํฌ๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ค๋ฉด, ์์์ ๋ช ์ํ ๋ฌธ์ ์ ์ ํด๊ฒฐํ ์ ์์ต๋๋ค.
- ์์กด์ฑ ์ฃผ์ Container๋ฅผ ํตํด ์์กด๊ด๊ณ๋ฅผ ํ๋์ ํ์ผ์์ ์์กด๊ด๊ณ๋ฅผ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
- Depends์ ๊ฐ์ ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ํ๋ ๋์คํจ์ฒ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์์ํ ํ์ด์ฌ ํด๋์ค๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
- ํ์ ์ Container๋ฅผ ์์ ํ๊ฑฐ๋ ๋ค๋ฅธ Container๋ฅผ ํตํด ์์กด๊ด๊ณ๋ฅผ ๋ฐ๊ฟ ์ ์์ต๋๋ค.
์ฝ๋๋ฅผ ํตํด์ FastAPI์ ์์กด์ฑ์ Dependency Injector๋ฅผ ์ฌ์ฉํด ์ฃผ์ ํด๋ณด๊ฒ ์ต๋๋ค. ๋ธ๋ก๊ทธ ํฌ์คํ ์์ ๋ฅผ ๊ณ์ ์ฌ์ฉํด๋ณด๊ฒ ์ต๋๋ค.
๐ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ
.
โโโ main.py # ์คํ ์ฝ๋
โโโ container.py # ์์กด์ฑ ์ปจํ
์ด๋
โโโ router.py # fastAPI ๋ผ์ฐํฐ
โโโ service.py # ์๋น์ค ํด๋์ค ๋ชจ๋
โโโ repository.py # ์ ์ฅ์ ํด๋์ค ๋ชจ๋
์์กด๊ด๊ณ๊ฐ ํ์ฑ๋ service, repository ํด๋์ค ์
๋๋ค. ์์กด๊ด๊ณ๋ฅผ ์ธ๋ถ์์ ์ฃผ์
ํ๊ธฐ ๋๋ฌธ์ Depends ๊ฐ์ ๋์คํจ์ฒ๋ฅผ ์ฌ์ฉํ์ง ์์ ์์ํ python ํด๋์ค ์
๋๋ค.
# service.py
class BlogService:
def __init__(self, repository: PostRepository):
self._repository = repository
def create_post(self, title, content):
post = Post(title, content)
self._repository.add_post(post)
def get_posts(self):
return self._repository.list_posts()
# repository.py
class PostRepository:
def __init__(self):
self._posts = []
def add_post(self, post):
self._posts.append(post)
def list_posts(self):
return self._posts
๋ค์์ ์์กด์ฑ ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ๋ Containerํด๋์ค ์
๋๋ค. BlogService์ PostRepository๊ฐ ์ฃผ์
๋์์์ ๋ช
์์ ์ผ๋ก ํ์ธํ ์ ์์ต๋๋ค.
# container.py
from dependency_injector import containers, providers
from repository import PostRepository
from service import BlogService
class Container(containers.DeclarativeContainer):
post_repository = providers.Singleton(PostRepository)
blog_service = providers.Factory(BlogService, repository=post_repository)
@inject๋ฅผ ํตํด fastAPI๋ก ๋ง๋ค์ด์ง Router ํจ์์ ํ์ํ blog_service ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํด์คฌ์ต๋๋ค.
๋์ฌ๊ฒจ๋ด์ผํ๋ ๋ถ๋ถ์ fastAPI์ Depends์ dependency injector์ Provide๋ฅผ ํจ๊ป ์ฌ์ฉํ๊ณ , Provide๋ด์ Container์์ ์ฃผ์
๋ฐ์์ผํ๋ ๊ฐ์ฒด๋ฅผ ๋ช
์ํ ๋ถ๋ถ์
๋๋ค.
# router.py
from fastapi import FastAPI, Depends
from repository import PostRepository
from service import BlogService
from dependency_injector import containers, providers
from dependency_injector.wiring import Provide, inject
from container import Container
router = APIRouter()
# ๋ผ์ฐํธ
@router.get("/posts")
@inject
def list_blog_posts(
blog_service: BlogService = Depends(Provide[Container.blog_service])
):
return blog_service.list_posts()
@router.post("/posts")
@inject
def create_blog_post(
post_data: dict,
blog_service: BlogService = Depends(Provide[Container.blog_service])
):
blog_service.add_post(post_data)
๋ง์ง๋ง์ผ๋ก main.py ์ ๋ํ ์ฝ๋์
๋๋ค.
# main.py
import uvicorn
from fastAPI import FastAPI
from container import Container
from router import router
if __name__ == "__main__":
container = Container()
container.wire(modules=[.router])
app = FastAPI()
app.container = container
app.include_router(router.router)
uvicorn.run(app, host="0.0.0.0", port=8080)
mainํ์ผ์์ container๋ฅผ ์ธ์คํด์คํ ์ํค๊ณ ์์กด์ฑ์ ์ฃผ์
ํ ๋ถ๋ถ์ wiring ํฉ๋๋ค. FastAPI ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ํด๋น ๊ฐ์ฒด์์ ์ฌ์ฉ๋๋ container๋ฅผ Dependency Injector์ Container๋ก ๋ฐ๊ฟ์ค๋๋ค.
๐ ์์กด์ฑ ์ฃผ์ ์ ํตํด ์ป์ ์ ์๋ ์ด์
์ง๊ธ๊น์ง FastAPI์์ Dependency Injector๋ฅผ ์ฌ์ฉํ ์ฝ๋๋ฅผ ์ดํด๋ดค์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์์กด์ฑ ์ฃผ์
, ๊ทธ๋ฆฌ๊ณ ์์กด์ฑ ์ฃผ์
ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ ๋ ์ป์ ์ ์๋ ์ด์ ์ด ๋ญ๊ฐ ์์๊น์?
๋ฎ์ ๊ฒฐํฉ๋ ฅ ๋์ ์์ง๋ ฅ
๊ฐ ๊ฐ์ฒด๊ฐ ๊ด๊ณ๊ฐ ๋ฆ์ ๊ฒฐํฉ์ ๊ฐ๊ฒ๋ฉ๋๋ค. ์์กด์ฑ์ ์ฃผ์ ๋ฐ์ ํด๋์ค์ ์ธ์คํด์ค๋ ์์ฑ์๋ก ๋ถํฐ ์ ๋ฌ๋ฐ์ ๊ฐ์ฒด์ ๊ตฌํ์ ์์กดํ์ง ์์ต๋๋ค. ๋ค๋ง ์ ๋ฌ๋ฐ์ ๊ฐ์ฒด์ ์์ฑ, ํจ์๋ฅผ ์ฌ์ฉํ ๋ฟ ์ ๋๋ค. ๊ฐ๋ฐ์๋ ๊ฐ ํด๋์ค์ ์์กด๊ด๊ณ์ ์ฝ๋งค์ด์ง ์๊ณ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
ํ
์คํธ ๊ฐ๋ฅ์ฑ
์์กด์ฑ์ ์ธ๋ถ์์ ์ฃผ์ ํ๊ธฐ ๋๋ฌธ์ ํ ์คํธ ์์ฑ์ด ์ฉ์ดํฉ๋๋ค. ์๋ฅผ ๋ค์ด ํ ์คํธ ์์ ์ฌ์ฉํ Container๋ฅผ ๋ฐ๋ก ์ ์ํด ์ฌ์ฉํ๋ค๋ฉด, ์์กด์ฑ ์ฃผ์ ์ด ํ์ํ ๋ถ๋ถ์ Stub ๊ฐ์ฒด ํน์ Mock ๊ฐ์ฒด๋ก ๋ฐ๊ฟ์ ๋จ์ํ ์คํธ๋ฅผ ์ํํ ์ ์์ต๋๋ค.
๋ช
์์ ์์กด์ฑ ๊ด๋ฆฌ
DI ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ์์กด๊ด๊ณ๋ฅผ ๋ช ์์ ์ผ๋ก ํ๋์ ํ์ผ๋ด์์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ์ฌ๋ฌ ํ์ผ์์ ์ ์๋์ด์๋ ์์กด๊ด๊ณ๋ฅผ ํ๋์ ํ์ผ์์ ๊ด๋ฆฌํ ์ ์๊ฒ ๋ฉ๋๋ค. Provider๋ฅผ ์ฌ์ฉํด ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ํ๋ ๋ฐฉ์๋ ๋ช ์์ ์ผ๋ก ์ ํํด์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๐ ๋ง์น๋ฉฐ
๋์ ํ์ ์ธ์ด์ธ python์ ์์กด์ฑ์ ์ฃผ์ ํ์ง ์์๋, ๋ฐํ์์ ๊ฐ์ฒด๋ฅผ ๊ฐ์๋ผ์ธ ์ ์๊ธฐ ๋๋ฌธ์ DI ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ ํ์๋ ์์ต๋๋ค. ์ง์ IoC ์ปจํ ์ด๋๋ฅผ ๊ตฌํํ๊ณ , wire ๋ก์ง์ ๊ตฌํํด ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ด์ฃ . ์์กด์ฑ ์ฃผ์ ํ๋ ์์ํฌ๊ฐ ํ์ํ์ง, ํ์ํ์ง ์์์ง๋ ๊ฐ์ธ์ ์ ํ์ด์ง๋ง ์ ๋ ๋ฐํด๋ฅผ ๋ค์ ๋ฐ๋ช ํ๋ ๊ฒ ๋ณด๋ค ์ด๋ฏธ ์กด์ฌํ๋ DI ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๊ณ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํด ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ์์กด์ฑ์ ์ฃผ์ ํ ์ ์๋ ์ฅ์ ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค :)
๐ ์ฐธ๊ณ ์๋ฃ
ํฌ์คํ ์ ์์ฑํ๊ธฐ ์ํด Dependeny Injector ๊ณต์๋ฌธ์์ ํ๋ฐ๋ฆ๋์ ๋ธ๋ก๊ทธ ๊ธ์ ๋ง์ด ์ฐธ๊ณ ํ์ต๋๋ค.
https://python-dependency-injector.ets-labs.org/
https://rumbarum.oopy.io/post/review-python-dependency-injector
'Computer Science > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Python] FastAPI ๋ฏธ๋ค์จ์ด๋ก Sqlalchemy Session ๊ด๋ฆฌํ๊ธฐ (0) | 2024.11.24 |
---|---|
[Python] ๋น๋๊ธฐ ํ ์คํธ๋ฅผ ํ๋ ค๋ฉด? (a.k.a pytest-asyncio) (3) | 2024.04.28 |
[Python] UoW(Unit of Work) ํจํด์ ์์๋ณด์ (0) | 2024.04.14 |
[Python] SqlAlchemy 1.4 -> 2.0 ๋ง์ด๊ทธ๋ ์ด์ ๋จ๊ณ๋ณ ๊ฐ์ด๋ (0) | 2024.03.31 |
[Python] Tox๋ก ์ฌ๋ฌ ํ๊ฒฝ์์ ํ ์คํธํ๊ธฐ (0) | 2023.07.02 |