はじめに
この記事はDjangoの公式チュートリアル「はじめての Django アプリ作成」と同じものをSpring WebFluxで作成することでDjangoとSpring WebFluxの違いを理解することを目的としています。
違い一覧
DjangoとSpringでは同じコンセプトでも用語が結構違います。
Django | Spring |
---|---|
Model(モデル) | Model(モデル) |
Template(テンプレート) | View(ビュー) |
View(ビュー) | Controller(コントローラ) |
はじめてのアプリ作成、その 1
プロジェクトを作成する
Django
Djangoではdjango-admin
を使ってプロジェクトを作成できます。
django-admin startproject mysite
Spring WebFlux
SpringではSpring Initializrを使ってプロジェクトを作成できます。Spring Initializrの場合はプロジェクト名以外のいくつかの設定を与えることができます。
今回はSpring WebFluxを使うため、dependenciesにSpring Reactive Web
を追加します。
下のGENERATE
を押すとプロジェクトをzipファイルでダウンロードできます。
サーバーを立ち上げる
Djangoのrunserver
の場合、ただの開発用サーバーに過ぎませんがgradleを使ってWebFluxのサーバーを立ち上げるとNettyという実際のプロダクション環境で使えるサーバーが立ち上がります。ログで確認できるように両方ともデフォルトで8080
ポートを使います。
Django
python manage.py runserver
Spring WebFlux
./gradlew bootRun
Polls アプリケーションをつくる
Django
Djangoではmanage.py
を使ってアプリケーションを作成できます。
python manage.py startapp polls
Spring WebFlux
Spring WebFluxではstartapp
のような機能はありません。mysite/src/main/java/com/example/mysite
の中にpolls
というディレクトリーを直接作ります。
cd mysite
mkdir -p src/main/java/com/example/mysite/polls
はじめてのビュー作成
Djangoでのビューを意味するものでSpringではコントローラに該当します。
"Hello, world. You're at the polls index."というHTTPレスポンスは返すコントローラを作ります。
Django
Djangoではviews.py
でファンクションを定義し、Rootからpollsアプリ、pollsアプリからviewに向かうパスを繋げます。
まず、HttpResponse
を返すindex(request)
を定義し、
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")
polls
アプリの''
URLにindex(request)
を紐づけます。
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
あとプロジェクトルートからpolls/
にpolls
アプリを紐づけます。
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('polls/', include('polls.urls')),
path('admin/', admin.site.urls),
]
Spring WebFlux
先に作ったmysite/src/main/java/com/example/mysite/polls
にMyController.java
というJavaクラスファイルを生成します。
cd mysite
touch src/main/java/com/example/mysite/polls/MyController.java
MyController.java
の中身は以下のようになります。
package com.example.mysite.polls;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;
@RestController
@RequestMapping("polls")
public class MyController {
@GetMapping(value = "")
Mono<ResponseEntity<String>> index() {
return Mono.just(ResponseEntity.status(HttpStatus.OK)
.body("Hello, world. You're at the polls index.")
);
}
}
-
@RestController
: SpringにMyController
クラスをアプリとして登録するような効果を持ちます。 -
@RequestMapping("polls")
:mysite/urls.py
にpolls
アプリを登録するような効果を持ちます。クラスの中のURLマッピングはpolls/
URLをベースに持つようになります。 -
@GetMapping(value = "")
: Djangoでindex(request)
をpolls/urls.py
に登録するような効果を持ちます。value = ""
なのでhttp://127.0.0.1:8080/polls
で接続するとindex()
が呼ばれます。 -
Mono<ResponseEntity<String>>
: Spring WebFluxで使うオブジェクトの箱のようなものです。0..1
個のオブジェクトを入れることができます。Mono.just()
関数でMonoのオブジェクトを生成できます。 -
ResponseEntity.status(HttpStatus.OK).body("Hello, world. You're at the polls index.")
: DjangoのHttpResponse("Hello, world. You're at the polls index.")
に該当します。