Spring BootでRESTなサービスを作ったときの備忘録

## 概要
STSを使ってSpring WebでRESTなサービスを使ったときの備忘録を残しておきます。
主に自分用。
Spring Webとは、Spring Frameworkをベースにした
Webアプリケーションフレームワークです。

開発環境は次の通りです。
OS : Windows 7 Home Edition 64bit
Java : JavaSE 8 update 181
Spring Boot : 2.3.4
STS : 4.6.1

## STSのセットアップ
STSのセットアップは[自分の備忘録](https://qiita.com/harayoshi/items/fca60e68087640b26292)を参考にしました。

## プロジェクトの作成
Create new Spring Starter Projectでプロジェクト作成、
参照したライブラリは以下の通りです。

 - Spring Web
 - Spring Data JPA
 - Oracle Driver
 - Lombok

## アプリケーションの作成
作成したクラス、設定ファイル、用意したデータは次の通りです。

Spring Bootアプリケーション起動時の実行クラスです。

```java:SpringWebSampleApplication.java
package jp.co.illmatics;

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

@SpringBootApplication
public class SpringWebSampleApplication {

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

}
```

REST APIとなるクラスです。

REST APIにするために@RestControllerを、
[CORS](https://developer.mozilla.org/ja/docs/Web/HTTP/CORS)でアクセス権を付与するために@CrossOriginを
それぞれ付与しました。

取得できる値はJSON形式となります。
値の詳細は後程説明します。

```java:UsersController.java
package jp.co.illmatics.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import jp.co.illmatics.dao.UserDao;
import jp.co.illmatics.model.User;

@CrossOrigin
@RestController
public class UsersController {

	@Autowired
	private UserDao userInfoDao;

	@RequestMapping(method = RequestMethod.GET, value = "/users")
	public List<User> get() {
		return userInfoDao.getUserInfoList();
	}
}
```

Data Access Objectです。
実装時にはインターフェースとその実装クラスの両方が必要です。

```java:UserDao.java
package jp.co.illmatics.dao;

import java.util.List;

import jp.co.illmatics.model.User;

public interface UserDao {

	public List<User> getUserInfoList();
}
```

UserDaoの実装クラスです。
Userのリストを取得するメソッドを定義します。
IDカラム昇順で全件取得します。

```java:UserDaoImpl.java
package jp.co.illmatics.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import jp.co.illmatics.model.User;

@Repository
public class UserDaoImpl implements UserDao {

	@Autowired
	private JdbcTemplate jdbcTemplate;

	public List<User> getUserInfoList() {
		List<User> list = jdbcTemplate.query("select * from USER_INFO ORDER BY ID"
			, new Object[] {},
			new RowMapper<User>() {
				public User mapRow(ResultSet rs, int rowNum) throws SQLException {
					User user = new User();
					user.setId(rs.getString("ID"));
					user.setName(rs.getString("NAME"));
					user.setAge(rs.getInt("AGE"));
					return user;
				}
			});
		return list;
	}
}
```

USER_INFOテーブルのモデルクラスです。

```java:User.java
package jp.co.illmatics.model;

import javax.persistence.Table;

import org.springframework.stereotype.Component;

import lombok.Data;

@Data
@Component
@Table(name = "USER_INFO")
public class User {

	private String id;

	private String name;
	
	private Integer age;

}
```

テストデータを格納したDB接続情報です。

```properties:application.properties
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:XE
spring.datasource.username=xxxxxx
spring.datasource.password=xxxxxx
spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect
spring.jpa.show-sql=true
```

作成したテーブルです。
※USERというテーブル名は予約語のため作成できず、
このような名前にしています。

```sql:作成したテーブル
create table USER_INFO (
  "ID" varchar2(20), 
  "NAME" varchar2(20), 
  "AGE" number(3,0), 
  constraint "PK_USER" primary key ("ID")
);
```

USER_INFOテーブルに用意したデータです。

| ID |NAME        |AGE|
|:--------:|:------------:|---|
|user001|userName001|35|
|user002|userName002|30|
|user003|userName003|25|

## 動作確認
実行してみます。
できました。
![実行結果.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533981/bc0c6ecd-36e2-9604-24c4-ccab956e1df8.png)

以上です。最後までお読みいただき、ありがとうございました。