원티드 서버개발자 QnA 1편 ‘원티드 서버 FastAPI 도입 장점과 단점’

Myounghee jang
원티드랩 기술 블로그
9 min readJun 10, 2022

안녕하세요, 원티드 DevRel 매니저 장명희입니다:)

원티드의 메인 서버 개발 언어가 Python이라는 사실, 게다가 Flask나 Django도 아닌 FastAPI를 사용한다는 사실 알고 계셨나요?
약 두 달 전, 베일에 싸여있던 원티드 서버개발 직무를 파헤치기 위해 질문을 수집했습니다.

그 결과 무려 440분께서 670개의 질문을 보내주셨는데요, 공통으로 많이 궁금해하셨던 질문들을 모아서 원티드의 서버 개발자분들이 직접 답변해주는 시간을 가져보았습니다.

서버개발자들이 직접 말하는 원티드 서버개발 이야기, 지금부터 들어볼까요?

🧐원티드 서버개발 미리 엿보기
* Python2.x 버전에서 Python3로 전환
* Flask에서 FastAPI로 이전하며, FastAPI를 활발하게 사용 중
* 각 사업별로 구성된 스쿼드라는 목적조직으로 나눠져 개발 중
* 상황에 맞게 다양한 DB를 사용하며 기술선택에 있어서 유연한 편
* 주요 기술 스펙 : Python, FastAPI, Flask, AWS

Q. 원티드 서버개발자가 사용하는 언어들을 소개해주세요!

(상민) 원티드의 서버는 파이썬(Python)을 메인으로 사용하고 있습니다. 일부 프로젝트에서는 장고(Django)나 노드(Node.js), 자바(JAVA), 그리고 루비(Ruby)같이 다양한 언어도 활용하고 있어요.

Q. 웹 프레임워크 FastAPI를 사용한다고 하셨는데, 간단히 설명해주세요!

(상민) 네, 저희가 사용하는 웹 프레임워크는 ‘FastAPI’라는 프레임워크고요. 이름에 Fast가 들어가있는 것처럼, 성능에 장점을 갖고 있는 웹 프레임워크에요.
비교적 신생 오픈소스 프로젝트임에도 불구하고 플라스크를 대체할 수 있는 모던 웹프레임워크라는 장점으로 빠르게 성장하고 있습니다.

Q. FastAPI는 비교적 최근에 개발된 프레임워크인데요, 원티드는 어떻게 FastAPI를 도입을 결정하게 되었나요?

(영식) 제가 처음 입사했을 때 원티드는 Python2와 플라스크(Flask)를 사용하고 있었고, Python3로 옮겨가려고 마이그레이션을 계획하고 있었을 때였어요.
제가 개인 프로젝트로 운동 기록하는 애플리케이션을 만들어서 지금까지 계속 운영하고 있는데, 백엔드 서버를 FastAPI를 도입해서 사용해보고 있었거든요.
이런 프레임워크 같은 것들이 새롭게 나오면 대부분 굉장히 좋다고 말씀하시지만, 프로덕션 레벨에 적용하는 것은 많은 고민이 필요한 사항들이 많잖아요. 그래서 일단 간단하게나마 제 개인 프로젝트를 통해 실제 프로덕트에 도입을 해봤기 때문에 제안드릴 수 있었던 것 같아요. 타이밍도 운 좋게 맞물렸던 거죠.
“FastAPI를 한번 사용해보면 어떻겠냐”라고 제안을 드릴 때 보일러플레이트같은 걸 만들어서 진만님께 같이 공유를 드려서 더 빨리 도입할 수 있게 됐던 것 같아요.
저희가 고민했던 부분 중 하나가 새로운 툴을 사용할 때 구성원들의 러닝커브도 무시할 수가 없다고 생각하는데요. 당시 모든 구성원들이 Flask를 사용하고 있었는데 FastAPI와 Flask가 어느 정도 비슷한 부분이 많아요. 이런 조건들이 맞물려서 좀 더 빠르게 도입을 할 수 있지 않았을까요?

Q. 처음 FastAPI 도입을 제안한 게 C레벨이 아니었다는 게 놀랍네요! 그러면 실제 마이그레이션은 어떻게 진행되었나요?

(진만) 사전에 저런 내용은 전혀 몰랐고ㅎㅎㅎ 어느날 갑자기 파이썬2에서 파이썬3로 옮겨야하는데 어떻게 하면 좋을까 하는 이야기를 하고 있었는데, 영식님께서 FastAPI를 하는게 어떻겠냐고 말씀하시더라고요. 당시에 다른 아이디어가 없었기 때문에 FastAPI를 한번 도입해보자 해서 사용하게 되었어요.
영식님께서 말씀하신 것처럼 저희가 바로 프로덕트단에서 적용할 수가 없어서 여러 가지 테스트를 해봤는데요, 기본적으로 저희가 개발할 수 있는 환경을 일단 만드는 게 먼저이기 때문에 환경구축을 가장 먼저 진행했었어요.
FastAPI는 아무것도 없는 웹서비스 API이다보니까 Layered Architecture를 통해서 저희가 어떤 로직을 만들 때 수월하도록 소스 구조적인 부분부터 컨피규레이션(configuration)이나 로깅(logging) 같은 여러 가지 모듈을 추가했어요.
그 이후에는 새로운 피쳐 개발은 무조건 파이썬3 새로운 서버, 새로운 개발환경에서 진행을 했었고, 좀 시간적 여유가 있을 때 여유있는 개발자 분이 구 파이썬2 서버에 있는 내용을 파이썬3 서버로 하나씩 이전하는 방식으로 마이그레이션을 진행했었습니다.

Q. 기존에 사용하던 Flask와 비교했을 때, FastAPI의 장점은 무엇일까요?

(윤재) Flask와 다르게 비동기 프레임워크이다 보니, 기본적으로 속도가 좀 빠른 부분이 있고, Starlette이라는 미들웨어를 쓰고 있는데, 이게 기능을 많이 제공해주고 있어요. Flask를 사용할 때는 익스텐션을 많이 붙여서 썼었거든요. 다른 사람들이 만든 익스텐션을 붙여서 쓰기 때문에 안정성이 조금 떨어지는 부분이 있었는데, 메인 로직들이 중앙집중화되면서 조금 더 안정화되게 프로덕션 환경을 운영할 수 있었던 것 같아요.
그리고, DI패턴 같은 경우도, FastAPI에서 디펜즈 옵션을 사용해서 자유자재로 쓸 수 있거든요. 그런 부분들이 되게 좋은 것 같고, 더 자세한 내용은 원티드 서버개발자로 합류하셔서 함께 다뤄보면 좋을 것 같아요(ㅋㅋㅋㅋㅋㅋ)
혹시 추가 보충 설명해주실 분 계신가요?

(영식) 너무 좋은 점만 이야기하면 안되니까 문제점 관련해서 조금 첨언할게요ㅎㅎㅎㅎ 일반적으로 동기서버로 개발을 진행하잖아요? 그런데 비동기에 대한 이해가 좀 부족해서 발생하는 문제점들이 있었던 것 같아요.
비동기는 하나의 스레드에서 컨텍스트가 왔다 갔다 하며 동작하는데요, 처음에는 이벤트 루프에 관한 그림과 글을 읽으며 조금 단순하게 접근했었던 것 같아요. 그런데, 내부적으로 동작하는 복잡한 컨텍스트 관련 문제들이 발생을 하다보니 서버 코드에도 이러한 문제점들이 반영됐었고요.
음.. 어떻게 보면 처음엔 문제점이라고 생각을 할 수 있지만, 결국 그걸로 인해서 비동기에 대한 많은 이해도와 숙련도를 가지게될 수 있었다고 생각을 해요. 처음에는 문제점이었지만 지금은 장점으로 변하지 않았을까 생각합니다. 오히려 좋아?

(진만) 단점에 대해 한 가지 더 말씀드리고 싶은 게 있는데, FastAPI가 나온지 얼마 안됐어요. 버전도 1.0이 안되고, 아직 초기 버전이다 보니 버그가 상당히 많아요. 게다가 버그패치나 업데이트도 빠르진 않아요. 그렇기 때문에 실서비스에 바로 적용한다고 하면 어떤 문제가 생길지 모르고, FastAPI는 딱 FastAPI로만 이뤄진 게 아니라 Starlette을 가져와서 그대로 사용하거든요. 그래서 Starlette에 버그가 생기면 FastAPI 도 버그가 생겨요 (눈물)
또.. FastAPI는 모델처리에 Pydantic을 사용하고 있는데, 만약 Pydantic의 업데이트에 대해 FastAPI가 처리를 못하면 거기서 또 문제가 생길 수 있죠.
FastAPI 하나만 봐야 하는 게 아니라, 문제가 생길 때마다 관련된 다른 라이브러리도 같이 봐야 하는 골치 아픈 부분이 생길 수 있어요.
처음에는 문제가 너무 많이 생겨서 FastAPI를 포크를 떠서 새로 만들어서 쓰기도 했었거든요. 그런데, 그 방식이 꼭 좋은 방법이 아니더라고요. 저희 나름대로 소스도 관리해야 하는 문제가 있어서 이런저런 노하우를 쌓아가고 있습니다.

Q. 그럼, 원티드에 오셔서 FastAPI를 처음 써보셨던 분 계신가요? 어떠셨어요?

(재웅) 저는 장고를 사용하다가 입사해서 처음 써보게 된 케이스인데, FastAPI 자체가 Flask와 거의 유사한 패턴을 사용해요. Flask나 Node.js 관련된 라이브러리들 패턴들과 거의 유사하기 때문에 러닝커브 자체는 상당히 낮은 편이라 이해하기는 어렵진 않았어요!

Q. 원티드 개발팀이 쌓아온 FastAPI에 대한 경험과 노하우들도 기술블로그에 공유해주시면 좋을 것 같아요! 현재 올라와 있는 SQLAlchemy 관련 글 조회수가 굉장히 높아요!

(영식) 최근에 FastAPI랑 SQLAlchemy 연동하는 부분에 대해서 글을 작성했었어요. 기존에 동기서버로 Flask를 사용할 때는 문제가 없었는데, 비동기 서버에서 SQLAlchemy를 적용하면서 컨텍스트 관련 문제가 많이 발생했는데요. 저희가 이해를 잘못하고 있다거나 부족하게 이해하고 있었던 부분에 관련해서 글을 썼어요.
예를 들어서 익셉션(Exception)이 전파가 되는 경우 또는 안되는 경우, 태스크(Task)를 만들면 그게 어떤 식으로 새로운 태스크(Task)로 빠지는지, 하나의 컨텍스트(Context)에 갇히는지, 아니면 요청이 한번 들어오면 그걸 하나의 컨텍스트(Context)로 봐서 컨텍스트(Context) 로컬 상태를 만들어줘야 하는지, 이런 부분들에 대한 고찰들이 담겨있고요, 저희가 실제 프로덕션 레벨에서 라이브러리를 도입하면서 발생했던 문제점들, 간단하게나마 개인적으로 연구했던 내용들이 담겨있어서 FastAPI와 SQLAlchemy 사용하시는 분들은 도움 많이 되실 것 같아요.
저희는 SQLAlchemy 세션 관리를 FastAPI 공식문서에 나와있는 Dependency Injection 형태로 하지 않고 있거든요. 전역적으로 어디서든 세션 객체를 임포트 시켜서 사용하기를 원해서, 원티드만의 독자적인 방법으로 컨텍스트(Context) 로컬이 보장되는 SQLAlchemy 세션을 구성했다고 봐주시면 될 것 같아요.
그에 관련된 내용을 간단하게 기술블로그에 써놨습니다:)
FastAPI에서 SQLAlchemy Session 다루는 방법

원티드에서 사용하고 있는 FastAPI에 대한 이야기 잘 들어보셨나요?
(아, 원티드에서는 Node.js, JAVA, Ruby 등 다른 언어도 사용하고 있습니다. 다음엔, 다른 언어를 사용하고 있는 개발자분들의 이야기도 담아올게요! )

다음 편에서는 원티드 서버개발자들은 어떤 사람들인지, 어떻게 일하는지, 그리고 원티드 자랑부터 면접 꿀팁까지 다뤄보겠습니다🤗

(본 인터뷰는 영상으로도 나올 예정이니, 많은 기대 부탁드려요!)

👉 다음 편 보러가기 : 원티드 서버개발자 QnA 2편 ‘개발문화? 면접꿀팁? 궁금하면 드루와!’

👉 서버 개발자 채용공고 보러가기(많관부!!)
-
서버 개발자 파이썬(Python)[서버팀]
- 서버 개발자 파이썬(Python)[HR솔루션팀]
- 서버 개발자 파이썬(Python)[글로벌팀/영어무관]
- 서버 개발자 파이썬(Node.js)[서버팀]

--

--