티스토리 뷰
파이썬을 공부하기 위한 글이므로 틀린 부분이 있으면 댓글 부탁드립니다~
회사에서 파이썬 API 백앤드 개발을 진행할 필요가 있어서 FastAPI를 기반으로 어떻게 시스템을 구성할지 많은 고민을 하였다. FastAPI 공식 문서 https://fastapi.tiangolo.com/ko/learn/ 에 보면 api 파일에서 모든 비지니스 로직을 수행하는 방법을 소개하는 것 같다. 하지만 회사에서 SpringBoot로 프로젝트를 진행한 경험을 바탕으로 동일하게 3가지의 레이어로 나눠 개발을 하기로 하였다. 이러한 레이어드 아키텍처 패턴은 유지보수와 코드 재사용이 편하기 때문에 망설일 필요가 없었다.
간단하게 유저를 등록하는 기능을 구현했다. 세가지 레이어는 컨트롤러 역할을 하는 api, service, repository 로 각각 나눴다. create_user 메소드에서 Service 클래스를 직접 인스턴스화 했고, Service 클래스에서는 Repository 클래스를 직접 호출하였다. 이렇게 코드를 하게 되면 클래스간에 의존성이 발생하게 된다. 따라서 의존성을 주입하는 방식으로의 변경이 필요했다.
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
app = FastAPI()
class User(BaseModel):
username: str
email: str
full_name: str = None
@app.post("/users/")
async def create_user(user: User):
service = Service() # Dependency
service.register_user(user.dict())
return {"message": "User created successfully", "user_details": user.dict()}
class Service:
def __init__(self):
self.repository = Repository() # Dependency
def register_user(self, user_data: dict):
self.repository.save(user_data)
class Repository:
def save(self, data: dict) -> None:
print("Saving data to the repository:", data)
의존성 주입을 진행하여 각 클래스가 독립적으로 운영되도록 바꿨다. 예를 들어 아래와 같이 Service 클래스에서 repository를 주입하여 사용할 수 있도록 변경했다. 이렇게 할 경우 내가 원하는 repository를 Service 클래스 수정 없이 바꿔서 주입할 수 있다는 장점이 생긴다.
class Service:
def __init__(self, repository: Repository):
self.repository = repository
하지만 Service 클래스에 어떤 repository를 주입할지는 정의 해줘야한다. 따라서 아래와 같은 코드를 추가해야한다. Spring에서는 config 파일을 정리하여 클래스에 어떤 클래스를 주입할지 정의 하는데 파이썬에서는 어떻게 이를 구현해야하는지 좀 더 공부가 필요해 보인다.
repository = Repository()
service = Service(repository)
의존성 주입 방식으로 완료한 코드
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
app = FastAPI()
repository = Repository()
service = Service(repository)
class User(BaseModel):
username: str
email: str
full_name: str = None
@app.post("/users/")
async def create_user(user: User):
service.register_user(user.dict())
return {"message": "User created successfully", "user_details": user.dict()}
class Service:
def __init__(self, repository: Repository):
self.repository = repository
def register_user(self, user_data: dict):
self.repository.save(user_data)
class Repository:
def save(self, data: dict) -> None:
print("Saving data to the repository:", data)
'Programming > Python' 카테고리의 다른 글
Python과 Numpy Array 차이 (0) | 2024.05.21 |
---|---|
[Python] 반복문 While (0) | 2022.02.01 |
[Python] 파이썬 함수 정의 및 예제 (0) | 2022.01.31 |
[Python] 클래스, 객체, 메소드 개념 (0) | 2022.01.24 |
[Python] 순환하면서 원하는 값을 찾을 필요가 있을 때 (0) | 2021.12.28 |
- Total
- Today
- Yesterday
- lightsail
- 백준
- 프로그래머스
- Ai
- 딥러닝
- synflooding
- 정보보안기사
- LangChain
- 우선순위큐
- 그리디
- 시간초과
- 정보보안
- 자료구조
- 다이나믹프로그래밍
- springboot
- 카카오페이면접후기
- linux
- llm
- java
- FastAPI
- 분산시스템
- 리눅스
- Python
- 코딩테스트
- 보안기사
- 카카오페이
- 파이썬
- 보안
- t-test
- t검정
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |