파이썬에게 클래스는 계륵일까
0. FastAPI 문서를 보면, 대부분의 코드 샘플이 함수로 되어있다. 클래스를 선언해서 로직을 만드는 부분은 거의 못본거 같다. 이건 FastAPI 뿐만 아니라 파이썬으로 되어있는 많은 예제들에서도 쉽게 발견할수 있다.
대체 왜그럴까.
1. 조금 공부를 해봤는데, 파이썬에서 함수는 그 자체가 객체로 취급된다 카더라. 그렇기 때문에 함수 자체를 인스턴스 처럼 사용할수 있다. 가령 자료 구조형에 쑤셔넣는다거나, 다른 함수의 인자로 함수를 넘겨준다라거나.
이거 자체는 다른 언어에서도 많이 볼수 있는 모양이므로 이질적인것은 아니다. 오히려, 객체 생명주기가 Request로 시작되서 Response로 끝나는 RestAPI 호출에 있어서는 차라리 함수 단위로 처리하는게 더 깔끔하고 경제적일 수 있다.
2. 이걸 그림으로 그려보자면 아래와 같을거 같은데....좀 이상하다 싶으면 필자의 이해가 부족한 탓이니 양해 바랍니다.
여튼, 로직을 돌리는데 필요한 DB 연결이나 Auth token같은것에 대해서 FastAPI는 의존성을 주입해줄때 사용할수 있도록 Dependencies를 제공해준다. 어짜피 저 의존성은 하나의 요청이 끝날때까지만 그 상태가 유지되면 되는 것이고, 하나의 요청마다 함수가 Controller -> Service -> Model로 이어지는 코드가 돌아간다고 하면 각각의 단계에서 호출되는 함수들이 독립적인 인스턴스가 되는것이다.
더구나, 함수 로직 안에 모든 인스턴스-그게 함수든 변수든 클래스든간에-가 존재한다면, 함수가 종료되는 순간 모든 인스턴스들이 사용중인 자원이 반환되니 수명주기 관리도 매우 깔끔해 질것이다.
3. 그럼에도 불구하고, 현재 이 프로젝트의 코드에서 Service는 클래스로 만들어져 있다. 그러다보니 Controller에서 Service를 부를때는 아래와 같은 코드 꼬라지가 작성된다.
user_data =tUserService.get_user(
UserService(
db_session=db_session,
user_auth=user_auth
),
user_id
)
볼때마다 이게 뭐하는 짓인가...싶은 코드인데 이 구조에 대해서는 지금도 고민이 많다. 여차하면 갈아 엎어버리면 되기 때문에 일단 냅두고 있기는 하지만.
그럼 여기까지 왔으니 그럴싸한 Python + FastAPI 개발자가 된걸까? 그랬으면 이 시리즈를 연재하지도 않았것지....