Spring Bootを基本からまとめてみた【JPA・Spring Data JPA】 

## JPA・Spring Data JPAとは？

JPA(Java Persistence API)とは、Jakarta EE(Java EE)標準のORマッパーで、JPAは仕様(Interface)のみ提供し、その実装はJPAプロバイダより提供される。

Spring Data JPAとは、Springフレームワーク群のSpring Dataファミリー内のデータベースプロジェクトの1つで、その名のとおりJPAをベースとしており、JPAを使いやすくラップしたものがSpring Data JPAである。

## 1.プロジェクトを作成する

公式：[spring initializr](https://start.spring.io/)

① ブラウザを開き、(https://start.spring.io/) を入力し、開く
② 下記を入力し、Dependenciesで下記を選択し、『GENERATE』ボタンを押す

- Project: Maven
- Language: Java
- SpringBoot: 3.1.0
- Group: com.springdatajpa
- Artifact: spring-data-jpa-course
- Name : spring-data-jpa-course
- Description: Spring Data JPA with Spring Boot
- Package name: com.springdatajpa.springboot

Dependencies
- Spring Data JPA
- MySQL Driver

## 2. MySQLに接続する

① SpringBootを接続するため、MySQLのDatabaseのプロパティを設定する

```mysql.database
create database ecommerce;
```

② application.propertiesを編集する

```application.properties


```


src/resources/application.propertiesという設定ファイルが存在し、
application.propertiesのファイル名をapplication.ymlに変更する。

②WEBコンテナ(server)の設定する

```src/main/resources/application.yml
server:
  port: 8080
  servlet:
    context-path: /chat-backend
```

③DB接続の設定する

```src/main/resources/application.yml
//WEBコンテナ(server)の設定する
server:
  port: 8080
  servlet:
    context-path: /chat-backend
//DB接続の設定する
spring:
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:mem:testdb;MODE=MySQL
    username: sa
    password:
```
③MyBatisの設定する

```src/main/resources/application.yml
//WEBコンテナ(server)の設定する
server:
  port: 8080
  servlet:
    context-path: /chat-backend
//DB接続の設定する
spring:
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:mem:testdb;MODE=MySQL
    username: sa
    password:
//MyBatisの設定する
mybatis:
  mapper-locations: classpath*:mybatis/*.xml
  configuration:
    map-underscore-to-camel-case: true
```

④gradleでビルドする

```
./gradlew build
```

## 3.Hello worldを動かす

①Controllerのディレクトリを作る
src/main/java/[プロジェクト名]の下に、app/controllerディレクトリを作り、
controllerディレクトリの下にHelloController.javaというファイルを作成する。

②HelloControllerがエンドポイントを持つクラスであることを示すためにクラスに対して@RestControllerアノテーションを付与する。

```app/controller/HelloController.java
package slack_chat.app.controller;

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

@RestController
public class HelloController {

}
```

③エンドポイントを追加する

```app/controller/HelloController.java
package slack_chat.app.controller;

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

@RestController
public class HelloController {
    @RequestMapping(path = "/hello", method = RequestMethod.GET)
    public String hello() {
        return "Hello, world!";
    }
}
```
※ @RestControllerが付与されたクラスの中から@RequestMappingが付与されたpublicメソッドがエンドポイントとして扱われる。@RequestMappingではURLのパスとHTTPメソッドを指定する。

④リファクタリングする
```app/controller/HelloController.java
package slack_chat.app.controller;

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

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello, world!";
    }
}
```
## 4.テスト用に Hello API を拡張する

①Hello クラスを作成する
domain/hello/modelディレクトリを作り、その下にHello.javaを作成します。

```domain/hello/model/Hello.java
package slack_chat.domain.hello.model;

@Data
@AllArgsConstructor
public class Hello {
    private String message;
}
```

②Controller を修正する

```app/controller/HelloController.java
package slack_chat.app.controller;

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

@RestController
public class HelloController {

    @GetMapping("/hello")
    // ↓引数を追加
    public Hello hello(@RequestParam("name") Optional<String> name) {
        // ↓引数未指定時は「world!」とする。
        String resName = name.orElse("world!");
        // ↓引数の値または「world!」を
        return new Hello("Hello, " + resName);
    }
}
```
## 5.API リクエスト送信とレスポンス検証する

①テストクラスを作成する
src/test/java/com/skach_chatに、chat/chatbackendにapiフォルダとHelloApiTest.javaを作成する。

②テストクラスにアノテーションとMockMvc クラスのインスタンス変数追加する

```chat/chatbackend/api/HelloApiTest.java
package slack_chat.chat.chatbackend.api;

@SpringBootTest
@AutoConfigureMockMvc

public class HelloApiTest {
    @Autowired
    private MockMvc mockMvc;
}
```
③テストメソッド作成する

```chat/chatbackend/api/HelloApiTest.java

```

## 参考サイト
[Spring Data JPA Tutorial | Crash Course [New] [2023]](https://www.youtube.com/watch?v=dKK2dZVLFug)
[Spring Data JPAを使用したDBアクセス](https://www.alpha.co.jp/blog/202209_01)