Spring bootでREST APIを作ってみた。

# Spring bootでREST APIを作ってみた。
Spring boot勉強がてら作成

# 実装内容
マイナンバーをキーに個人情報を取得してくる的なAPI作成

# 使用データ
https://testdata.userlocal.jp/

# パッケージ構成
```
├─java
│  └─com
│      └─example
│          └─api
│              └─demo
│                  │  DemoApiApplication.java
│                  ├─controller
│                  │      MPersonalInfoController.java
│                  ├─data
│                  │  └─dto
│                  │          CommonResponse.java
│                  │          MPersonalInfoDto.java
│                  │          MPersonalInfoErrorDto.java
│                  ├─entity
│                  │      MPersonalInfo.java
│                  │      
│                  ├─infratructure
│                  ├─repository
│                  │      MPersonInfoRepository.java
│                  ├─service
│                  └─usecase
│                      │  MPersonalInfoGetListUseCase.java
│                      │  
│                      └─impl
│                              MPersonalInfoGetListUseCaseImpl.java              
└─resources
        application.properties
        application.yaml
        messages.properties
```
##
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3746721/b2218fcc-37ba-2167-94b4-138d89dab191.png)

Controller
・起動のコントロール

UseCase
・処理のInterface

UseCaseImpl
・処理の実装

CommonResponse
・エラーor正常のレスポンスの継承元とすることでレスポンスの振る舞い方を変える

・Dto
正常時のレスポンス

・ErrorDto
異常時のレスポンス

・Repository
JPAを使用したEntity情報取得

・Entity
その名の通り


# 実装
```DemoApiApplication.java
@RestController
@RequiredArgsConstructor
public class MPersonalInfoController {

    private final MPersonalInfoGetListUseCase mPersonalInfoGetListUseCase;

    //　個人情報リスト取得
    @RequestMapping(value = "/MPersonalInfoListGet", method = RequestMethod.GET)
    public ResponseEntity<CommonResponse> MPersonalInfoListGet(@RequestParam(value = "MyNumber",required = false) String myNumber) {
        return mPersonalInfoGetListUseCase.mPersonalnfoGetList(myNumber);
    }
}
```
アノテーション
----
```@RestController```
WebAPI用のコントローラーに設定する。
Json形式でデータ返却する。

```@RequiredArgsConstructor```
コンストラクタを使う指定。
（MPersonalInfoGetListUseCaseを指定するために必要）

 ```@RequestMapping```
 リクエスト URL に対して、どのメソッドが処理を実行するか定義するアノテーション。
URL「/MPersonalInfoListGet」のGETで受け取る。

```@RequestParam```
ブラウザからのリクエストの値（パラメータ）を取得することができるアノテーション。
「MyNumber」で受け取る。（required = falseでnullを許容する）

```DemoApiApplication.java
@Service
@RequiredArgsConstructor
public class MPersonalInfoGetListUseCaseImpl implements MPersonalInfoGetListUseCase {

    private final MPersonInfoRepository mPersonInfoRepository;
    private final MessageSource messageSource;

    //　個人情報リスト取得API(myNumber)
    public ResponseEntity<CommonResponse> mPersonalnfoGetList(String myNumber) {
        MPersonalInfoErrorDto mPersonalInfoErrorDto = new MPersonalInfoErrorDto();

        try {

            if (Objects.isNull(myNumber)) {
                var args = new Object[]{"マイナンバー"};
                mPersonalInfoErrorDto.setErrorId("W001");
                mPersonalInfoErrorDto.setErrorMessage(messageSource.getMessage("Error.api.W001", args, Locale.JAPANESE));
                return ResponseEntity.badRequest().body(mPersonalInfoErrorDto);
            }

            Optional<MPersonalInfo> mPersonalInfo = mPersonInfoRepository.findByMynumber(myNumber);

            MPersonalInfoDto mPersonalInfoDto = new MPersonalInfoDto();

            // 内部公開してよい個人情報のみ取得
            mPersonalInfoDto.setName(mPersonalInfo.get().getName());
            mPersonalInfoDto.setAge(mPersonalInfo.get().getAge());
            mPersonalInfoDto.setGender(mPersonalInfo.get().getGender());
            mPersonalInfoDto.setBloodType(mPersonalInfo.get().getBloodtype());

            return ResponseEntity.ok(mPersonalInfoDto);
        } catch (Exception e) {
            mPersonalInfoErrorDto.setErrorId("E001");
            mPersonalInfoErrorDto.setErrorMessage(messageSource.getMessage("Error.api.E001", null, Locale.JAPANESE));
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(mPersonalInfoErrorDto);
        }
    }
}
```
アノテーション
----
```@Service```
サービス層のクラス（ビジネスロジック等）に付与する。

### 処理概要
----
URL「/MPersonalInfoListGet」のGETで受付。
想定パラメータ：MyNumber

入力チェック
・myNuberがNullの場合未入力エラーとする

処理
・myNumberをキーにRepositoryにて、EntityのMPesonalInfoから情報取得
・公開してよい情報のみDtoにセットし返却する。