SpringBootでアプリを作成してみた【REST API開発入門】

## RESTとは？
- クライアントから、サーバに実施してほしいことをHTTPプロトコルを用いて依頼する　⇨ （例）http://hostname/yattehosiikoto
- 標準的なHTTPリクエストメソッド(GET/POST/PUT/DELETE)を使用して、APIを実装する
- JSONを使用してやりとり ⇨ JavaScript Object Notationの略。

```Sample.json
[
{"id" : "1" , "name" : "iphone"},
{"id" : "2" , "name" : "Android"},
]
```
## HTTPリクエストメソッドとは？
HTTPリクエストにはいくつかのメソッドが存在し、以下の4種類のメソッドを利用して、APIの処理を区別するように利用する

- GET・・・ID等によって、対象のデータもしくはリストを取得する
- PUT・・・ID等によって、対象のデータを置き換える、データを更新する
- POST・・・対象のデータをサーバ上に送信する時に使用し、データを登録する
- DELETE・・・ID等によって、対象のデータを削除する

## SpringBootとは？
- SpringBootとは、Springアプリケーションを簡単に・迅速に作成する事ができる機能を提供するフレームワーク

## Maven
- Javaプログラムをコンパイル・テスト・パッケージ・デプロイを行うツール（類似：Ant、Gradle）
- 使用するJarライブラリ群の依存性を管理
- pom.xmlという設定ファイルに、プロジェクトの情報、ライブラリ、プラグイン等を記述する

##### <大まかな流れ>
1. Mavenがpom.xmlを読み込む
2. ローカルリポジトリにダウンロードされる
3. ビルドなど、定義されたライフサイクルが実行される
4. プラグインが実行される

## Javaアノテーション[@]
- JDK1.5から追加された機能『注釈』の意、アノテーション型
- 補足として機能したり、フレームワークに意図を伝える（処理を指示）できる
- フレームワークで用意されたアノテーションを使えるようになる事が重要
- クラスやメソッド、フィールドの名の上に、@アノテーション名　で記述
- アノテーションには引数を渡すことができる
```Saple.java
//利用方法(フレームワークが用意されたものを使う)
@AnnotationName(value = "文字列")
public class Sample{

}
```
## Dependency Injection 
- 一般的なJavaプログラムでは、あるクラスから他のクラスを呼び出す時には
new(インスタンス化)する必要があり、これを『依存性のある状態』と呼ぶ。
- インスタンスの生成をspring Boot（DIコンテナ）に任せ、インスタンス生成、参照の解決を自動で行ってもらう事を指す。依存性をDIコンテナが管理し、適用してくれる。
- ＠Autowiredというアノテーションを記述するだけで、SpringBoot管理化にある他のクラスを呼び出す事ができる。

## Controller
Controllerとは、リクエストの受付、必要となる業務のロジックを呼び出し連携させる役割を持つ。つまり、アプリケーション全体の制御処理を受け持つ部分を指す。
- クライアントからのリクエストの受付処理
- 入力データの受付処理
- 入力データの検証
- ビジネスロジックの呼び出し
- エラー処理

## spring initializrとは？
公式：[spring initializr](https://start.spring.io/)

Spring Initializrは条件に合わせてSpring Bootプロジェクトの雛形を生成するWebサービス。Web UIからプロジェクト設定や利用するSpring Projectを指定することで、簡単にSpring Bootプロジェクトの開発を始めることができる。

1. ブラウザを開き、(https://start.spring.io/)を入力し、開く
2. 下記を入力し、『GENERATE』ボタンを押す
- Group:
- Artifact:
- Package name:
- Dependencies:

## Spring BootでHello World！ 
ブラウザからHTTP GETを利用してSpringBootに対してリクエストを送り、単純に文字列を返すだけの簡単なAPIを作成する。

作成するControllerクラス
```
@RestController
public class HelloController {

 @GetMapping(value="/")
 public String index() {
   return "アクセス成功です";
}
@GetMapping(value="/hello")
 public String index() {
   return "Hello World";
}
@GetMapping(value="/welcom")
 public String index() {
   return "SpringBootへようこそ";
} 
}
```
【@RestController】
- 本アノテーションでSpringBootはControllerクラスとして認識
- メソッドの戻り値が、レスポンスの戻り値となる
- Web API用のControllerで利用する

【@GetMapping】
- HTTP Getリクエスト用のアノテーション
- value 属性にURLのパスを指定する
- 紐づいているメソッドが実行される

## 実行するポートを変更する
SpringBootは、デフォルトで8080ポートで起動するが、application.propertiesに設定する事で任意のポートに変更できる
```application.properties
server.port=8081
```
http://localhost:8081 で起動する

① main/java にcontrollerファイルとHelloController.javaを作成する
②controller/HelloController.javaを下記のように編集する
```controller/HelloController.java
package com.udemy.spring1hello1.controller;

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

@RestController
public class HelloController {

@GetMapping(value="/")
 public String index() {
   return "アクセス成功です";
}    

@GetMapping(value="/hello")
 public String hello() {
   return "Hello world!";
}    

@GetMapping(value="/welcome")
 public String welcome() {
   return "SpringBootへようこそ!";
}    
}
```
③ Start Debuggingを行い、ローカルホストで確認する

## Advanced Rest Clientとは？
Advanced Rest Clientは、制作したAPIの動作テストを行うツールで、APIのURLを指定して実行し、簡単にAPIに対し、データを送信、APIから受信したデータを確認できる。作成するAPIに対して、実行結果を確認する際に使用する。

## @Serviceクラスの説明
@Serviceアノテーションを付与したサービスクラスに実装する

■ controllerクラス
リクエストの入口で、必要な業務処理を呼び出す。複雑な処理は基本的には書かない。
■ Serviceクラス
業務処理の元となる箇所。ビジネスロジックはサービスクラスに実装する。
 
## @Autowiredを使う
controllerクラスから、Serviceクラスを呼ぶ時は、@Autowiredアノテーションを使用する。Spring Bootがサービスクラスのインスタンスを自動で注入してくれる。＠Service、＠Rest Controller等、SpringBoot管理のコンポーネントのインスタンスを取得できる。

## @PathVariable
特定の商品番号を取得するケースで、動的にURLに値をしてする仕様を実装する。値の受け取り方として、@PathVariableアノテーションを指定する事で受け取れる。
＠GetMappingアノテーションのURLマッピングを指定する箇所には、動的に変わる部分は中括弧で表す。

```
@RestController
ItemControllerクラス 
・・・
＠GetMapping（"/items/{id}"）
public Item getItem(@PathVariable("id")String id){
   return itemService.getItem(id);
}
・・・
```

## 参考サイト
[【ゼロからスタート】マイクロサービスのためのSpring Bootで始めるREST API入門](https://itplusjp.udemy.com/course/spring-bootrest-api/learn/lecture/33269340#overview)