Java
MyBatis
Thymeleaf
SpringBoot

【社内用】Spring Bootのプロジェクトにアサインされた方へ(作成中)

Spring Bootに初めてアサインされた社員に向けた方へ、説明する際に使うアジェンダです。

前提知識

  • Java8の基本構文
  • HTML5, CSS3, JavaScript(ES5)
  • Servlet3.1
  • HTTPのGET, POST

開発環境

  • Eclipse Pleiades 4.7
  • Java8
  • Spring Boot 1.5.10
  • PostgreSQL 9.6
  • superagent.js

目標

以下のことができるようになることを目指す。

  • 画面の追加
  • クライアント-サーバ間の処理の追加(Restful APIの追加)
  • DBにアクセス(MyBatis)
  • 各ファイルの理解
  • MVCに対応するController, Serviceなどの理解
  • Mavenでjarを作成し、デプロイ
  • Mavenからライブラリの追加
  • アクセス権限処理の追加(Spring Security)
  • 設定より規約の考えの理解

ライブラリの説明

Spring Boot

  • 数あるSpring関係のライブラリをまとめたもの
  • 最小構成でHelloWorldが表示できる
    • あらかじめログの設定など、必要な設定がなされている
  • 流行ってきている?

MyBatis

  • O/R Mapper. iBatisのバージョンアップ版
  • XMLだけでなく、アノテーションでもSQLを記述することができる

Thmeleaf

  • テンプレートエンジン。JSPのようなもの。
  • JSPがJSP専用のタグを指定しているのに対して、ThymeleafはThmeleaf専用の属性で指定する。
    • ブラウザは認識できない属性を無視するだけなので、レイアウトが崩れない?
    • デザイナとプログラマで分業できる
  • Spring BootはJSPでなくThymeleafを推奨している

Mavenとは


【超初心者向け】Maven超入門

  • ビルド管理ツール
  • pom.xmlに設定する
  • <dependency>で外部ライブラリを利用できる。

具体的な説明

1. フォルダ構成の説明

SpringとMVC

  • Controller
  • Service
  • Model
  • View

1. 画面の追加

手順

  1. src/main/static/templateフォルダにHTMLを配置する
  2. Controllerクラスに、作成したHTMLを返すメソッドを作成する
SampleController.java
public ModelAndView index(ModelAndView mav) {
    mav.setViewName("sample");
    return mav;
}

ポイント

  • setViewNameに渡すVIEW名は拡張子不要(拡張子があっても問題ない)。JSPとThymeleafどちらでも使えるようにするためらしい。

2. Restful APIの追加

POST API

  • superagentではpost, sendメソッドを使う

POST API(ファイルアップロード)

  • superagentではpost, field, ...メソッドを使う

Restful API

https://qiita.com/TakahiRoyte/items/949f4e88caecb02119aa
* APIの命名規則
* GETとPOSTの使い分け

3. MyBatisでDBにアクセス

MyBatis公式サイト

XML

  • mybatis-config.xml
  • src/main/resources/mybatis/mapper/*.xml
  • タグを使ってSQLを動的に生成できる
    • <if>, <foreach>, <where>など
  • MyBatisが受け取る情報を推測するので、parameterType属性はたぶん不要。

DAOクラス

  • @Componentを付与する
  • sqlSessionselectOneselectListなどのメソッドを呼ぶ

4. Spring Security

Spring Security Reference
Thymeleaf + Spring Security integration basics

SecurityConfig.java

以下の項目などを設定する

  • ログインしなくてもアクセスできるURL
  • ロールがないと、アクセスできないURL

Thymeleaf

  • sec:authorize="hasRole('ROLE_USER')"のような記述ができる

5. Mavenの使い方

既存システムでの設定

  • Spring Boot用のpom.xml(spring-boot-starter-parent)を<parent>で指定している
    • 利用する外部ライブラリのバージョンも定義されている。
    • バージョンを指定したい場合は、<properties>で指定する。
  • 自社ライブラリの利用
  • JavaDocの生成

EclipseでMaven更新

pom.xmlを修正したら、「プロジェクトを右クリック > Maven > プロジェクトの更新」で更新する。

jarファイルの生成(デプロイ用)

  • mvn installコマンドを実行すると、jarファイルがプロジェクト配下/targetフォルダに生成される。
  • テストコードの実行をスキップする場合は、mvn install -Dmaven.test.skip=trueを実行する。

6. Spring Boot関係

application.properties

https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

Profile

https://area-b.com/blog/2015/01/30/2316/
http://endok.hatenablog.com/entry/2016/06/12/181900
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html

既存システムでの設定

  • 既存システムでは3種類のプロファイルを定義する

    • local: ローカル環境で起動
    • test: 開発環境のサーバで起動
    • release: 本番環境のサーバで起動
  • javaコマンドの引数で--spring.profiles.active=localのようにプロファイルを指定

  • 各プロファイルに対応したapplication.propertiesを用意している

    • application.properties : デフォルトの設定値。
    • application-test.properties : テスト環境用の設定値。
    • application-release.properties: 本番環境用の設定値。Swaggerなどのツールの無効化、キャッシュの有効化
    • application-local.properties : 個人用の設定。コミットしないこと前提。

デプロイ方法

  1. コマンドでmvn install -Dmaven.test.skip=trueを実行して、jarファイルを生成する
    • プロジェクト配下/targetフォルダに生成される
  2. javaコマンドでサーバを起動する
    • 起動用のバッチファイルあり(start.bat)

既存プロジェクトのログ設定

  • SLF4J(インターフェイス)とLogback(実装)の組み合わせを採用した
    • 古いシステムだと、commons-logging(インターフェイス)とlog4j(実装)の組み合わせが多い
  • src/main/resources/logbakc.xml
    • 最初から用意されているログフォーマットに、個別の設定を追記
  • Lombokの@Slf4jでフィールドlogを生成
  • 実行したSQL(プリペアドの値も出力された状態)をログに出力するため、log4jdbcを採用した
  • Cntrollerの前後でログを出力(AOP)

JUnit

Springの@autowired


実習課題

前提条件

  • 開発環境が整っている
  • Spring Bootを使った既存プロジェクトに対して、機能を追加する
  • Ajax通信は、superaget.jsを利用する

データベース

create_table.sql
CREATE table user (
  SERIAL user_id NOT NULL,
  TEXT user_name NOT NULL,
  TEXT section NOT NULL,
  PRIMARY KEY (user_id)
);

Controllerクラスの追加

  • ブラウザの開発ツールで、Request/Responseを確認すること

HTMLファイルの作成

sample.htmlを作成して、URL/sample.htmlsample.htmlの中身を表示

  • メッセージファイル(message.properties)の値を参照する

GET APIを作成(パラメータは1個)

  • @RequestParamで、クライアントから数値を1個受け取る。
  • サーバ側で、受け取った数値の2乗を計算して、クライアントに返す

GET APIを作成(1個の情報を渡す)

  • @RequestParamで、クライアントから数値を1個受け取る。
  • サーバ側で、受け取った数値の2乗を計算して、クライアントに返す

GET APIを作成(複数の情報を渡す)

  • Beanクラスを作成して、そのクラスで複数の情報を受け取る。
  • サーバ側で、受け取った情報に何らかの処理を行い、クライアントに返す

POST APIを作成

  • POST APIを作成する。
    • 複数の情報を受け取る
    • 受け取った情報に対して何らかの処理を行い、クライアントに返す
  • JavaScriptで作成したAPIを呼び出す
    • レスポンスの内容を画面に表示する

POST APIを作成(ファイルアップロード)

  • POST APIを作成する
    • 1個のファイルと、1個の文字列を受け取る
    • 受け取ったファイルを保存する
  • JavaScriptで作成したAPIを呼び出す

データベースへのアクセス

  • DAOクラスにメソッドを追加
  • Controllerクラス内のメソッドから、DAOクラスのメソッドを呼び出す

user_idでSELECT

  • DAOクラスにメソッドを作成する
    • user_idで絞り込んだ結果を取得するメソッド

ユーザ名 or 部署でSELECT

  • <if>, <where>を使って、WHERE句を記述
  • SQLに渡す情報がnullならば、絞り込まないこと

userテーブルにINSERT

  • <if>, <where>を使って、WHERE句を記述
  • SQLに渡す情報がnullならば、絞り込まないこと

1回のSELECT文で階層構造のクラスに情報を格納

  • <collection>を使って、SQL文を記述

Maven

pom.xmlを修正して、外部ライブラリを利用する

  • Mavenローカルリポジトリを確認
  • Eclipseのプロジェクトプロパティで確認

jarファイルを生成して、javaコマンドでサーバを起動

  • Eclipseを使わずに、mvnコマンドでjarファイルを生成
  • javaコマンドの引数でポート番号を指定
  • プロファイルを変更して、設定値などが切り替わることを確認

ログの確認

  • logback.xmlでログレベルを変更して、ログの出力される/されないを確認

文章問題

HTTP

  • HTTPのGETとPOSTの違いを説明しなさい。 -リクエスト/レスポンスのヘッダとボディ

データベース

  • O/R Mapperの特徴を、メリット,デメリットをふまえて説明しなさい
  • Javaから情報を受け取るには、# or $が利用できる。その違いを説明しなさい。

HelloWorld

RestfulAPIの追加

@RequestBody, @RequestParamなど

ファイルアップロード

MyBatisの導入

Spring Boot 徹底入門 14章のサンプルWebシステム

Servletの課題

【補足】Terasolunaとの比較