PyCon APAC 2023

DjangoRestFrameworkのリファクタリング、レガシーなコードの寿命を延ばすために
2023-10-28 , track 5

Pythonのブームからかなりの年月が経ち、色々なプロジェクトのコードもどんどん負の遺産が貯まっていて来ていると思います。
そんななか、10年近く動いていたモバイルサービスのバックエンドとして使われてきたDjangoRestFrameworkの寿命を延ばすためにやった施策や取り入れたリファクタリング手法について説明していきたいと思います。


私が関わった 10年近く稼働しているDjangoのプロジェクトを改修するために行ったことについて話したいと思います。
このプロジェクトではPython2系の頃からDjangoが使われてきてPython3へのアップデートやDjangoも3系へアップデートしていくなど長く使えているシステムとなっています。
しかし、かなりレガシーな箇所や意図不明な箇所も多く、そんなレガシーコードの一貫性を保ちながら徐々に改善をしてさらに使えるシステムとして改修をしていった話をしようと思います。

①Fat Controller問題

DjangoRestFrameworkでもAPIViewをメインに使っていたため、すべてのビジネスロジックがviewに書かれてしまうと言う欠点がありました。
それに対して行った解決策として Service層を導入した話をしようと思います。

②swagger

モバイルエンジニアとのやりとりはswaggerで行っていましたが、すべて手動で行っていたため、実体と全く合っていないという問題が発生していました。
そのため、自動でswaggerを生成する仕組みの導入しました

③requestのチェック

またswaggerに合わせてrequest bodyやクエリ文字列のチェックのためのSerializerを導入したことも話したいと思います。

④コードの一貫性を保ちながら変えていくこと

既存の(やや微妙な)コードとの一貫性を保ちながら徐々にリファクタリングを入れつつ新規の処理では可読性とコメントを意識しつつ直して行ったという経緯の話もしたいと思います

⑤テストについて

コードの寿命を延ばすためのテストコードで意識したこと、テスト全体の問題点と改善したこと(テストケースが多すぎてciで恐ろしい時間がかかる、subtestの導入、日本語テストケースの導入など)

⑥その他細かいtips

上記には当てはまらない細かい改善(テストの速度改善、pre-commitやblack、poetryの導入など)について述べていこうと思います。