開発環境を作ったので次はWebアプリケーションを作ってみる

### 2023年4月追記
文面の体裁を整えるため更新。新しい情報は何も入っていません。

## 前置き
下の記事の続きです。

https://qiita.com/sykx_16g/items/6dfa48ee22c724f408c6

## ゴール
http://localhost:xxxx/helloにアクセスしてハローワールドする。

## やったこと

### Webアプリケーションフレームワークの選定
今回は直近で使う予定があったので*Spring Boot*を選択。前少し触ったことがあったのですが、もう殆ど覚えてないので…。
Play Frameworkとかも今度使ってみたいです。

### サンプルSpring Boot アプリケーションの作成
「新規プロジェクトを作成」＞(今回は)「Maven」を選択
GroupId,ArcitectIdは適当に

### pom.xmlに設定値を追加
```xml:pom.xml
<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.1.4.RELEASE</version>
  <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
  <java.version>1.8</java.version>
</properties>

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
  </dependency>
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
  </dependency>

  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
  </dependency>
</dependencies>

<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
  </plugins>
</build>
```
プロジェクトを作成するとpom.xmlが作成されているので、それに上記を記載する。

因みに公式では、利用する
* 言語(Java or Scala or Kotlin)
* プロジェクト管理ツール(Maven or Gradle)
を選択して、設定ファイルとプロジェクトファイルを生成してくれる機能を用意してくれています。
詳しくは：

https://start.spring.io/

### ソースを書く
公式のドキュメントを参考に。

https://spring.io/guides/gs/rest-service/

今回は、「リクエストを送るとJSONでレスポンスを返却する」アプリケーションをつくります。

```Java:Greeting.java
package hello;

public class Greeting {

    private final String type;
    private final String value;

    public Greeting(String type, String value){
        this.type = type;
        this.value = value;
    }

    public String getType() {
        return type;
    }

    public String getValue() {
        return value;
    }
}
```

```Java:GreetingController.java
package hello;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GreetingController {

    private static final String TEMPLATE = "Hello, %s!";

    @RequestMapping("/hello")
    public Greeting greeting(@RequestParam(value =  "name",defaultValue = "world") String name){
        return new Greeting( "Greeting",String.format(TEMPLATE,name));
    }

}
```

```Java:Application.java
package hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
```

### IDE上で実行してみる
Application.javaを実行します。
IDEのコンソールにSpringのロゴを模したAAが表示され、特に問題なければ下記URLにアクセス
http://localhost:8080/hello
![スクリーンショット 2019-04-29 0.32.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261258/ebf26008-8c0c-ef11-e1a0-8a7a11bfb41f.png)


できた！

### ターミナルに表示される情報を絞る
Springのアプリケーションを起動した際にロゴと初期化のINFOログが表示されます。
この表示を抑制するためには、`src/main/resources/config/application.yml`配下に以下の記載が必要です。

こちらの記事を参考にしました

https://qiita.com/tag1216/items/5c7271f5a90b7ab258b2

```yaml:application.yml
spring.main:
    # バナーの表示抑止
    banner-mode: "off"
    # 初期化ログの表示抑止
    log-startup-info: false
logging.level:
    # Spring実行時のルートログをWARNにする
    org.springframework: "warn"
```

### 作ったアプリケーションをビルド/実行する
ここまではIDEを活用していましたが、ここからはターミナルで実行してみます
そう言えばmacにビルドツールをまだ入れていないので今更導入する。とりあえずmaven。

```terminal:terminal
brew install maven
```

続いてmavenでビルド。pom.xmlが有るディレクトリまで移動して以下のコマンドを叩く。

```terminal:terminal
mvn package
```

するとtarget配下にjarファイルが出来るので、これを実行。

```Terminal:terminal
java -jar (生成されたjarファイル).jar
```

これで、サンプルSpring Boot アプリケーション作成時と同様にコンテンツが表示されていればOKです。
http://localhost:8080/hello