오늘의 우당탕탕은 FastAPI를 활용해서 데이터 전처리 서버를 구현하는 일이다.
여태 계속 jupyter의 도움을 빌리다가 데이터 전처리 자동화 하고 싶어서
fastapi로 자동화를 돕는 api 서버를 만들고 있다.
큰 숲과 작은 나무를 동시에 보면서 설계대로 조립 중.
발단
- fastapi에서 모듈 간 공통으로 쓰이는 전역변수는 어떻게 관리해야 하는지 고민
- .env 말고 다른 방법으로 관리할 수는 없는 걸까? =>
config.py
를 어떻게 지속가능한 방법으로 사용할 수 있을까?
다시 돌아봐야 할 내용
- api 구현 시 다른 서버에서 데이터 받아서 '뭔가 변경점이 생긴다면'
POST
를 생각하자 ->GET
이랑 자꾸 헷갈림 - api에서 라우터와 미들웨어의 차이는?
- api 서버 설계 시 라우터, 모듈, 데이터 모델 간의 유기성 생각하기
의존성 주입
- 의존성 주입이라는 개념을 명확히 이해하려면 이것의 정의를 먼저 얘기하는 거 보다 의존성을 직접 생성하는 경우를 먼저 보여준 후에 설명하는게 더 이해가 빠르겠다.
이제부터 사용할 화살표의 방향은 의존성이 생기는 방향을 나타낸다. 클래스 다이어그램을 떠올릴 것.
- 의존성 주입 : 의존성이 생기는 관계를 물리적으로 분리해서 정의하고, 의존 관계가 B->A로 생긴 경우 의존성 A을 B가 외부에서 건네받으며 객체 A에서 B로 의존성을 주입한다 라고 언급할 수 있다.
- 용어가 'Dependency Injection'이고 이를 그대로 변역하면 의존성 주입이 된다고 하지만, 이 단어를 온전히 이해하려면 클래스 단위 이상의 설계 경험이 필요하다.
- 학부때 자바 수업을 들으면서 Dependency Injection을 배웠는데 정작 실제 이해는 후에 DB수업에서 클래스 다이어그램으로 데이터베이스 설계할 때 의존 관계를 배우면서 이해했다.
- 뱀발 : 클래스 설계는 현실을 정보로 옮기는 과정의 초기 단계라고 생각한다. 학부 때는 자바가 객체 지향 언어의 대표격이라서 자바 습득과 객체 지향 개념을 동시에 배웠는데, 그래서 언어의 특성과 클래스 설계의 특성이 혼합되어서 이해가 매우 어려웠다.
예시
- 의존성을 직접 생성하는 경우 : UserService -> EmailService 인데, UserService는 추상화 단계를 벗어난, 어느 정도 범용성이 있는 상위 개념의 객체이다. EmailService는 UserService의 구체적인 구현이자 하위 개념이다. 의존성이 생기는 경우는 상위 개념이 하위 개념 객체를 직접 다루려고 할 때(생성) 발생한다.
class EmailService:
def send_email(self, recipient: str, content: str):
print(f"Sending email to {recipient}: {content}")
class UserService:
def __init__(self):
# UserService가 직접 EmailService를 생성함
self.email_service = EmailService()
def notify_user(self, user_email: str):
self.email_service.send_email(user_email, "Welcome!")
- 의존성을 주입하는 경우 : UserService와 EmailService간의 개념적인 상하 관계는 변하지 않았다. 하지만 구현에서 UserService는 하위 개념을 자신의 스코프 밖에서 전달(=주입)받는다.
class EmailService:
def send_email(self, recipient: str, content: str):
print(f"Sending email to {recipient}: {content}")
# 의존성 주입 적용
class UserService:
def __init__(self, email_service: EmailService):
# 의존성을 외부에서 주입받음
self.email_service = email_service
def notify_user(self, user_email: str):
self.email_service.send_email(user_email, "Welcome!")
이 상황을 클래스 다이어그램으로 그려봤다.
제대로 정의하기
python class decorator
- @property: 속성처럼 접근할 수 있는 메서드 정의.
- @classmethod: 클래스 레벨에서 동작하는 메서드 정의.
- @staticmethod: 클래스나 인스턴스와 무관한 로직을 수행하는 메서드 정의.
- @abstractmethod: 추상 클래스를 정의할 때 필수 구현 메서드를 강제.
- @singledispatch: 함수 오버로딩을 통한 여러 타입 처리.
- @dataclass: 간결한 데이터 클래스를 정의.
'Develope > 조각모음' 카테고리의 다른 글
우당탕탕 Webpack 사용기 (0) | 2024.10.15 |
---|