ELW株式会社 テックブログ

リアルなログをそのままお届けします。

Django と Quarkus + Kotlin に学ぶバックエンド開発スタイル比較

1. Djangoとは

  • オープンソースPythonフルスタックWebフレームワーク(初版 2005 年)。
  • MTV構造:Model=DB層、View=ロジック、Template=画面。役割が分かれ保守しやすい。
  • Batteries‑included” フィロソフィ ─ ORM・管理画面・認証・国際化などを標準搭載し 迅速なプロトタイプ開発 が可能。
  • URL ディスパッチャ + テンプレートエンジンにより 疎結合なページ生成CSRF/XSS 対策などセキュリティ機能も内蔵。
  • よく使われる場面CMSや社内システム、スタートアップのMVP、大規模サービス(例:Instagram)。

2. データベース操作比較

2.1 モデル定義

  • Django

    • models.Model を継承してフィールドを宣言。
    • 主キー id は暗黙で自動付与。
    • フィールド引数(max_length など)で制約とバリデーションを同時に宣言。
    • サンプル

         class Book(models.Model):
             title  = models.CharField(max_length=100)
             author = models.CharField(max_length=100)
      
  • Quarkus + Kotlin

    • JPA@Entity でモデルを宣言。Panache (Hibernate ORM の軽量ラッパ) を使うと ID・CRUD が自動付与。
    • 主キーは @Id @GeneratedValue または PanacheEntity 継承で自動化。
    • Bean Validation (@NotNull など) を併用してコンパイル時に型と制約を担保。
    • サンプル

        @Entity
        class Book : PanacheEntity() {
            lateinit var title : String
            lateinit var author: String
        }
      

2.2 マイグレーション

  • Django

    • コマンド python manage.py makemigrations で差分ファイル自動生成。
    • python manage.py migrate で DB へ適用。
    • 自動生成ファイル例

        class Migration(migrations.Migration):
            operations = [
                migrations.CreateModel(
                    name='Book',
                    fields=[
                        ('id', models.AutoField(primary_key=True)),
                        ('title', models.CharField(max_length=100)),
                    ],
                ),
            ]
      
  • Quarkus + Kotlin

    • Flyway / Liquibase の SQL ファイルで明示管理。
    • quarkus.flyway.migrate-at-start=true で起動時に自動適用。
    • Flyway 例

        -- V1__create_book_table.sql
        CREATE TABLE book (
            id BIGSERIAL PRIMARY KEY,
            title  VARCHAR(100) NOT NULL,
            author VARCHAR(100)
        );
      

2.3 クエリ発行 & N+1 対策

  • Django ORM
    • 一覧取得: Book.objects.all()
    • 条件検索: Book.objects.filter(author__icontains="John")
    • N+1 回避: select_related('publisher')prefetch_related('tags')
  • Panache / JPQL
    • 一覧取得: Book.listAll()
    • 条件検索: Book.find("author like ?1", "%John%").list<Book>()
    • N+1 回避: JOIN FETCH or FetchType.EAGER / Batch Fetch 設定

3. API 定義比較

3.1 ルーティング

  • Django

    • URLconf (urls.py) で URL ‑> ビュー関数/クラスをマッピング
    • サンプル

        urlpatterns = [
            path('api/books/', views.book_list),
            path('api/books/<int:pk>/', views.book_detail),
        ]
      
  • Quarkus + Kotlin

    • JAX‑RS アノテーションをメソッドに直接付与。
    • サンプル

        @Path("/api/books")
        class BookResource {
            @GET fun list() = Book.listAll()
      
            @GET
            @Path("/{id}")
            fun one(@PathParam("id") id: Long) = Book.findById(id)
        }
      

3.2 スキーマ管理

  • Django

    • DRF Serializer クラスで入出力フィールドとバリデーションを集中管理。
    • サンプル

        class BookSerializer(serializers.ModelSerializer):
            class Meta:
                model  = Book
                fields = ['id', 'title', 'author']
      
  • Quarkus + Kotlin

    • エンティティ / DTO をそのまま JSON シリアライズ
    • Jackson 注釈で出力制御 or 別 DTO を定義。
    • サンプル DTO

        data class BookDTO(val id: Long?, val title: String)
      
        fun Book.toDto() = BookDTO(id, title)
      

4. Django のメリット / デメリット

メリット

  • バッテリー同梱:認証・管理画面・ORM が最初から使え、MVP を素早く構築。
  • 直感的 ORMPython DSL の QuerySet で複雑クエリが簡潔。
  • 成熟コミュニティ:豊富なプラグインと情報。
  • セキュリティ組込CSRF/XSS 対策がフレームワークで標準。

デメリット

  • 重量級/過剰機能:小規模 API でも多機能が有効化されリソース消費。
  • GIL による性能限界:CPU バウンドな高並列処理はプロセススケール前提。
  • 規約外拡張が難しい:非同期 DB ドライバ全面移行などは難易度高。
  • 型安全でない:大規模コードではテストと型ヒントが必須。

5. Quarkus + Kotlin のメリット / デメリット

メリット

  • 高速起動・低メモリJVM <100 ms、GraalVM ネイティブ数 ms でサーバーレス◎。
  • クラウドネイティブ設計K8s マニフェスト生成、ヘルスチェック標準。
  • ライブリロードquarkus:dev で即ホットリロード + テスト再実行。
  • 型安全:Kotlin の Null 安全 + IDE 補完で堅牢。
  • 公式拡張が豊富Panache、OIDC、Kafka、gRPC などを軽量統合。

デメリット

  • 情報不足:コミュニティが若く、日本語記事や運用例が限定的。
  • 破壊的変更リスク:リリースサイクル速くアップグレード検証コスト大。
  • Kotlin × JPA 設定負荷all-open / no-arg プラグイン必須で言語イディオムが複雑化。
  • ネイティブビルド工数:ビルド時間増大・リフレクション設定漏れエラー。
  • Reactive vs Coroutines ギャップ:Mutiny とコルーチン橋渡しの学習負担。

6. まとめ

  • 最速 MVP / 小規模 CRUD Web → Django
  • クラウドスケール / マイクロサービス → Quarkus + Kotlin

参考リンク