시리즈 회고#

이 글은 Django Ninja 시리즈 튜토리얼의 30번째 글이에요.
시리즈의 마지막 장을 맞이하여, 우리의 'Django Ninja 탐험'은 잠시 막을 내리려 해요.
물론 이것이 끝은 아닙니다. 무엇보다 Django Ninja는 여전히 비교적 새로운 프로젝트이고, 저는 그 미래가 무척 기대되거든요.
이 글은 두 부분으로 나뉘어져 있어요:
- 전체 시리즈를 되돌아보며, 각 장에서 배운 개념과 기술을 점검할게요. 가능한 핵심만 짚고 넘어가려 해요.
- 글을 쓰면서 겪었던 가장 큰 어려움과 Django Ninja에 대한 기대, 마지막으로 저의 철인 대회 완주 후기를 공유할게요.
분량 관계상, 더 많은 비하인드 스토리, 창작 과정의 뒷이야기, 개인적인 감상은 본 대회와는 별개로 31, 32번째 글에서 추가로 나누도록 할게요.
이외에도 본편에서 다 풀지 못한 내용들을 보충하기 위해 가끔씩 'Django Ninja 번외편'을 업데이트할 예정이에요. 관심 있는 독자분들은 본 시리즈 구독 또는 제 블로그 이메일 구독을 환영해요.
거두절미하고 바로 시작해볼까요?
GitHub 예제 프로젝트#
1. 시리즈 목표와 주요 학습 성과#
제 1편의 서두로 돌아가 보면, 이 시리즈 전체의 목표는 다음과 같았어요:
30일간 진행되는 이번 시리즈에서는 Django Ninja의 기초 구현을 자세히 다룰 예정이에요. 글로 된 설명과 예제 프로젝트의 코드를 통해, 강력하고 유연한 이 Django API 개발 프레임워크에 한 걸음씩 익숙해지도록 도와드릴게요.
맞아요. 그래서 우리가 구체적으로 어떤 일을 했을까요?
주요 학습 성과#
이 시리즈를 통해 다음과 같은 Django Ninja의 핵심 기술을 익혔어요:
- Django Ninja 라우팅 설정하기. (제 7-8편)
- 경로 매개변수, 쿼리 매개변수, 본문(body) 등 다양한 HTTP 요청과 매개변수 처리하기. (제 9-12편)
- Schema를 사용하여 API 응답의 데이터 구조를 설계하고 정의하기. (제 13-16편)
- 프로젝트 코드에서 자동으로 API 문서 생성하기, Pydantic을 통해 데이터 검증하기, 시스템에서 던진 오류를 효과적으로 처리하기. (제 17-22편)
- 파일 업로드, 페이지네이션, 데이터 필터링을 포함한 고급 기능들을 유연하게 활용하기. (제 23-27편)
마지막으로 인증과 단위 테스트까지 다루었죠. 실로 꽤나 알찬 여정이었다고 할 수 있어요.
그 안의 절묘함과 어려움에 대해서는 여기에서 다시 길게 언급하지 않을게요.
제가 생각하기에 Django Ninja를 배울 때 알아야 할 몇 가지 중요한 포인트들과, 그것이 가져다주는 성취감을 함께 되짚어보아요. 이건 정말 중요한 거거든요!
2. 각 장의 핵심 요약#
각 장에서 특히 언급할 만한 가치가 있는 부분만 골랐어요. 다분히 제 개인적인 관점이 담겨 있답니다.
제 2장: 예제 프로젝트와 환경 설정#
이 장에서 가장 중요했던 건 역시 'Python 최신 개발 도구'에 대한 소개였죠. 거듭 추천드리는 「Python Table Manners」 시리즈도요.
Poetry부터 Mypy까지, 이런 도구들은 현대적인 프로젝트에 있어 필수 요소라고 생각해요. 각자의 대체재가 있으니 선호하는 도구를 선택하셔도 좋아요. 다만 이런 요소들이 개발 워크플로에 확실히 통합되어 있는지 확인해 주세요.
AI가 어떻게 발전하든 프로젝트의 '기반 인프라'는 언제나 없어서는 안 될 것이라 굳게 믿어요.
제 3장 제 1절: 라우팅#
Django Ninja의 라우팅 설정은 기존의 Django, 그리고 Django REST framework와는 많이 달라요.
이 부분에 있어서는 후발주자들이 기본적으로 Flask가 최초로 선보인 '라우팅 데코레이터'를 따르고 있어요. 훌륭한 설계이고, 서로 참고하고 배울 만한 가치가 있죠 🫡
새로운 작성 방식은 더 직관적이고 단순할 뿐만 아니라, 라우팅 설정이 여러 파일에 분산되어 생기는 난감한 상황을 줄여주었어요.
하지만 라우팅은 처음에 Django Ninja를 배울 때 마주하는 작은 진입장벽이 되기도 했죠. 그래서 저는 서로의 차이점을 비교하는 데 자그마치 두 편을 할애하여, 그 이면에 있는 생각과 고려 사항들을 여러분이 더 명확하게 이해하실 수 있도록 노력했답니다.
제 3장 제 3절: HTTP 응답#
표면적으로는 HTTP 응답에 대해 이야기하는 것 같지만, 사실 여기서의 핵심은 Django Ninja Schema, 즉 Pydantic BaseModel을 소개하는 것이었어요.
이 절을 'Pydantic 입문'이라고 불러도 전혀 과언이 아니죠.
게다가 Pydantic에 대한 이해도는 API 문서, 데이터 검증 등 후반부의 내용들까지 중요하게 이어져요. 가히 모든 것의 기초라고 할 수 있어요.
Django Ninja는 Schema를 이용해 HTTP 응답을 조직하고 직렬화하는데요, 이것은 Django REST framework가 사용하는 시리얼라이저(Serializer)와 본질적으로 아무런 차이가 없어요.
그러나 이 둘을 사용하는 사고방식의 차이는 저에게 완전히 다른 경험을 선사했어요. 주요 인사이트는 〈15편: 응답 (3) 왜 ModelSchema를 쓰지 않을까?——DRF와 비교하여 Django Ninja를 더 선호하는 이유〉에 써두었으니 거듭 음미해 보실 만할 거예요.
제 4장: API 문서#
여긴 뭐 두말할 필요가 있나요? 너무 중요하죠!
만약 '코드와 type hints에 기반하여 API 문서를 자동으로 생성하는' 이 킬러 기능이 없었다면, 저처럼 Django REST framework에 익숙해져 있던 개발자가 비슷한 위치에 있는 새로운 프레임워크를 배우려 할 동기가 어디 있었을까요?
게으름이야말로 모든 동력의 원천이에요!
제 5장: 데이터 검증과 오류 처리#
이 장에는 저의 피와 눈물이 서려 있어요 😂
Django Ninja의 데이터 검증과 오류 처리 방식은 Django REST framework와 아주 많이 달라요. 저를 더 골치 아프게 했던 건, 예전 직장에서 제가 '가장 정석적인' 방법으로 실무를 하지 않았다는 사실이었어요. 여전히 Django REST framework의 개발 관행에 영향을 받고 있었죠.
그때는 속으로 '와, 이거 쓰기 너무 힘들잖아!' 생각했는데, 알고 보니 제가 오해하고 있던 거였어요. 이 네 편의 글을 잘 쓰기 위해서 저는 거의 바닥부터 다시 공부해야 했죠. 솔직히 말해서 눈앞이 탁 트이는 느낌이었답니다.
따라서 이 시리즈에서 보게 될 구현 방식은 상당히 합리적이고 정석에 가까운 사용법일 거예요. 제 경험을 비추어 보건대, 제가 먼저 함정을 다 밟아봤으니 안심하셔도 좋아요.
이제부터는 개인적인 감상 부분이에요.
3. 글쓰기에서의 가장 큰 어려움#
제가 생각하기에 이 시리즈를 창작하면서 마주한 가장 큰 난관은, 가능한 한 GitHub 프로젝트의 코드와 조화롭게 어울려서 훌륭하고 일관성 있는 예제를 제공해야 한다는 점이었어요.
(말할 필요도 없지만, 이 프로젝트는 '여러분이 주시는 별(Star)'을 격하게 환영한답니다 🌟)
단순히 예를 드는 것보다 훨씬 번거로운 일이었어요. 전체 시리즈의 진도를 미리 기획해야 했고, API 구현이 각 편의 주제와 어떻게 부합하게 하여 독자들에게 '몰입감'을 줄 수 있을지를 고민해야 했으니까요.
또한 서사의 일관성도 고려해야 했어요. 독자들이 프로젝트와 함께 자연스럽게 학습할 수 있도록 코드는 쉬운 것부터 어려운 것 순으로 차근차근 진행되어야 했지, 그 반대가 되면 안 되었거든요.
이러한 기획에는 기술적 지식뿐만 아니라 교육적인 마인드와 독자를 배려하는 의식(독자가 어디서 막힐지 알아채는 것)이 훨씬 더 많이 필요했어요.
전반적으로 무척 도전적이었지만 대단히 흥미로운 과정이었어요.
4. Django Ninja에 대한 평가와 기대#
Django Ninja는 우크라이나 출신 개발자 Vitaliy Kucheryaviy가 1인 체제로 유지 관리하는 오픈소스 프로젝트예요. 업데이트 빈도수가 그리 높지 않고, 유저들의 기대에 항상 즉각적으로 응답해주진 못하죠.
그럼에도 저는 이렇게 말하고 싶어요: "만약 가능하다면, 저는 정말 다시는 Django REST framework로 돌아가서 코딩하고 싶지 않아요."
이유는 단 하나, 15편에서 언급했던 내용 때문이에요——"명시적인 것이 암시적인 것보다 낫다(Explicit is better than implicit)."
Django Ninja는 개발을 더 '빠르게' 만들어 주진 않았을지 몰라도, 분명 더 투명하고 더 통제 가능하게 만들어 주었어요.
저는 길게 보았을 때 이런 투명성과 통제력이 우리가 디버깅하는 데 아껴주는 시간이, 그저 단순한 '빠름'과는 비교할 수조차 없을 만큼 크다고 믿어요.
미래에 대한 기대#
Django 자체의 비동기(async) 지원이 날로 발전함에 따라, 저는 Django Ninja의 잠재력도 점차 빛을 발하고 있다고 굳게 믿고 있어요.
가까운 미래에 사람들이 'Django로 API 만들기'에 대해 이야기할 때, 더 이상 Django REST framework만 떠올리는 것이 아니라 이 강력하고 유연한 새로운 선택지, Django Ninja도 함께 거론되기를 기대해요.
5. 완주 후기#
후유! 드디어 다 썼네요. 이 과정은 제가 상상했던 것보다 훨씬 더 길고 긴 여정이었어요.
9월 초부터 쌍십절(10월 10일)까지, 글을 준비하던 기간을 포함해 꼬박 40일 동안, 저는 매일 아침 눈을 뜨자마자 글을 썼고 온 마음을 다해 이 축제에 뛰어들었어요. 마침내 스스로도 만족할 만한 결과물을 여러분 앞에 내놓게 되었네요.
제가 보기에 글쓰기가 주는 성취감은 '가치를 제공하고 영향력을 발휘하는 데' 있어요. 이 가치는 독자분들뿐만 아니라 저 자신에게도 해당돼요. 이 30편의 글을 창작하면서 저 또한 Django Ninja에 대한 이해가 한층 깊어졌거든요.
부디 이 시리즈가 여러분에게 조금이나마 가치 있는 무언가를 가져다주었기를 바라고, 앞으로의 개발 여정에서 조금 더 순조롭게 헤쳐나가실 수 있기를 바라요.
글을 쓴다는 것은 매 순간이 배움이고, 그 배움의 매 순간은 다시 성장이 돼요. 이 튜토리얼 시리즈는 여기서 끝이 날지 몰라도, 우리의 소프트웨어 엔지니어로서의 길은 아직 까마득히 멀었으니까요.
할 수만 있다면 평생토록 좇아갈 수 있는 길이었으면 좋겠네요.