SparkFrameworkとSpringBootのHelloWorld比較

軽量なjavaのWebフレームワークのSparkFrameworkと、開発に必要な機能をリッチに提供するSpringBootでHelloWorldプロジェクトを作成し、感じたことを比較してみました。

# 前提

- spark-core 2.8.0
- Springboot-starter 2.1.2 

# SparkFrameworkでHelloWorldの手順

 - eclipseで「File」 → 「New Gradle Project」から適当な名前でGradleプロジェクトを作成
 - `build.gradle`を編集します。

```groovy:build.gradle
dependencies {
    compile 'com.sparkjava:spark-core:2.8.0'
    // Sparkのログ出力に必要なライブラリ
    compile group: 'org.slf4j', name: 'slf4j-log4j12', version: '1.7.25'
}
```

- メインクラスを作成します。

```java:SparkApplication
package spark.sample;

import static spark.Spark.get;
/*
 * This Java source file was generated by the Gradle 'init' task.
 */
public class SparkApplication {
    public static void main(String[] args) {
    	get("/", (req, res) -> {
    		return "HelloWorld Spark";
    	});
    }
}
```

- log4jの設定ファイルを`src/main/resources`に配置

```properties:log4j.properties

log4j.rootCategory=INFO, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n
```

以上でSparkでHelloWorldを行う実装は完了です。
mainクラスを実行すると、組み込みのjettyが起動します。

<img width="1440" alt="スクリーンショット 2019-01-25 0.17.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/301386/4ea79658-7272-5de3-659a-a9dda0d00e44.png">

- ブラウザで確認
<img width="1440" alt="スクリーンショット 2019-01-25 0.19.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/301386/caaad0f0-8794-694e-3efd-7a18b089f1c4.png">

- 起動時間: 約590ms
- 1リクエストあたりのレスポンスタイム: 約7ms

# SpringBootでHelloWorldの手順
- [SpringInitializer](https://start.spring.io/)で雛形を作成してzipをダウンロードします。
 <img width="1440" alt="スクリーンショット 2019-01-25 0.42.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/301386/07c7e249-855c-c071-c3c9-4c7d667514b3.png">

- 先ほどダウンロードしたzipを展開し、eclipseで「File」 → 「import」 → 「Exisiting Gradle Project」でインポートします。
 
- Controllerクラスを作成します。

```java:SampleController
package spring.sample.sample;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SampleController {
	
	@GetMapping("/")
	public String index() {
		return "HelloWorld SpringBoot";
	}
}
```

以上でSpringでHelloWorldを行う実装は完了です。
SpringBootAppで実行すると、組み込みのtomcatが起動します。

<img width="1440" alt="スクリーンショット 2019-01-25 0.48.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/301386/6d31787d-d190-ffa3-bd8b-af4423d9bf6e.png">

- ブラウザで確認
<img width="1440" alt="スクリーンショット 2019-01-25 0.49.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/301386/0beeca00-86a5-bd92-47e6-1d68eeaff5be.png">


- 起動時間: 約6s
- 1リクエストあたりのレスポンスタイム: 約12ms
 - favicon.icoをデフォルトで取得するようになっているため、そこを除けばSparkとほぼ変わらない

# 感想
### SparkFrameworkとSpringBootを比較してみて
 - SpringBootと比べてのメリット
  - 複雑な処理がなければSpringよりも手早く開発が進められそう。
  - java8のラムダ記法さえ知ってれば開発が始められる
  - 依存モジュールが少なく軽量
 - SpringBootと比べてのデメリット
  - MVCパターンを強制するなど良い意味でのフレームワークによる強制がないため、好き放題書けるという意味では大規模開発には向かないかも
  - エンタープライズWebアプリに必要な機能がフルセットであるわけではないから、そこは自分で実装or技術選定が必要 


SpringBootで作成したアプリでは、フレームワーク側で作成されるオブジェクトが発生するため、ピュアなjavaで実装したアプリにくらべて処理速度が遅くなってしまうとの話を耳にして、より軽量なWebフレームワークはないかと思って、Sparkフレームワークを見つけて試してみました。

簡単なビジネスロジックを実装してみて、気付きがあれば、また投稿しようと思います。