Spring Boot Web アプリケーションの実践的な開発例
従業員情報管理の機能を完成させるために、以下の4つの部分を開発します。
- 従業員情報の追加
- ファイルアップロード
- 従業員情報の更新
- 設定ファイルの最適化
1. 従業員情報の追加
1.1 開発目標
従業員の基本情報と画像を保存する機能を開発します。
1.2 API仕様
以下の仕様に基づいて従業員情報の追加機能を開発します。
| 項目 | 型 | 必須 | 説明 |
|---|---|---|---|
| username | string | 必須 | ユーザー名 |
| name | string | 必須 | 従業員名 |
| gender | number | 必須 | 性別(1:男性, 2:女性) |
| image | string | 任意 | 画像パス |
| deptId | number | 任意 | 部署ID |
| entrydate | string | 任意 | 入社日 |
| job | number | 任意 | 役職(1:主任, 2:講師, 3:学務担当, 4:研究担当, 5:相談員) |
1.3 実装方法
以下に、従業員情報追加機能の実装例を示します。
EmployeeController
@Slf4j
@RestController
@RequestMapping("/employees")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
@PostMapping
public ApiResponse addEmployee(@RequestBody Employee employee) {
log.info("従業員情報の追加: {}", employee);
employeeService.addEmployee(employee);
return ApiResponse.success();
}
}
EmployeeService
public interface EmployeeService {
void addEmployee(Employee employee);
}
EmployeeServiceImpl
@Slf4j
@Service
public class EmployeeServiceImpl implements EmployeeService {
@Autowired
private EmployeeRepository employeeRepository;
@Override
public void addEmployee(Employee employee) {
employee.setCreatedAt(LocalDateTime.now());
employee.setUpdatedAt(LocalDateTime.now());
employeeRepository.save(employee);
}
}
EmployeeRepository
@Mapper
public interface EmployeeRepository {
@Insert("insert into employee (username, name, gender, image, job, entrydate, dept_id, created_at, updated_at) " +
"values (#{username}, #{name}, #{gender}, #{image}, #{job}, #{entrydate}, #{deptId}, #{createdAt}, #{updatedAt})")
void save(Employee employee);
}
2. ファイルアップロード
2.1 概要
従業員の画像をアップロードする機能を実装します。今回は、阿里云OSSを使用します。
2.2 アップロードHTML
以下のHTMLを使用して画像アップロードのテストを行います。
<form action="/upload" method="post" enctype="multipart/form-data">
従業員名: <input type="text" name="name"><br>
性別: <input type="text" name="gender"><br>
画像: <input type="file" name="image"><br>
<input type="submit" value="送信">
</form>
2.3 OSSアップロード機能
以下のコードを使用して阿里云OSSに画像をアップロードします。
AliyunOSSUploader
@Component
public class AliyunOSSUploader {
@Value("${aliyun.oss.endpoint}")
private String endpoint;
@Value("${aliyun.oss.accessKeyId}")
private String accessKeyId;
@Value("${aliyun.oss.accessKeySecret}")
private String accessKeySecret;
@Value("${aliyun.oss.bucket}")
private String bucket;
public String uploadImage(MultipartFile file) throws IOException {
String fileName = UUID.randomUUID().toString() +
file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
ossClient.putObject(bucket, fileName, file.getInputStream());
ossClient.shutdown();
return endpoint.split("//")[0] + "//" + bucket + "." + endpoint.split("//")[1] + "/" + fileName;
}
}
2.4 アップロードAPI
以下のAPIを使用して画像をアップロードします。
UploadController
@Slf4j
@RestController
public class UploadController {
@Autowired
private AliyunOSSUploader ossUploader;
@PostMapping("/upload")
public ApiResponse uploadImage(@RequestParam("image") MultipartFile file) throws IOException {
log.info("画像アップロード開始");
String imageUrl = ossUploader.uploadImage(file);
log.info("画像アップロード完了: {}", imageUrl);
return ApiResponse.success(imageUrl);
}
}
3. 従業員情報の更新
3.1 概要
従業員情報を更新する機能を実装します。
3.2 API仕様
| 項目 | 型 | 必須 | 説明 |
|---|---|---|---|
| id | number | 必須 | 従業員ID |
| username | string | 必須 | ユーザー名 |
| name | string | 必須 | 従業員名 |
| gender | number | 必須 | 性別 |
| image | string | 任意 | 画像パス |
| deptId | number | 任意 | 部署ID |
| entrydate | string | 任意 | 入社日 |
| job | number | 任意 | 役職 |
3.3 実装例
EmployeeController
@PutMapping
public ApiResponse updateEmployee(@RequestBody Employee employee) {
employeeService.updateEmployee(employee);
return ApiResponse.success();
}
EmployeeService
@Override
public void updateEmployee(Employee employee) {
employee.setUpdatedAt(LocalDateTime.now());
employeeRepository.update(employee);
}
EmployeeRepository
@Update("update employee set " +
"username=#{username}, " +
"name=#{name}, " +
"gender=#{gender}, " +
"image=#{image}, " +
"job=#{job}, " +
"entrydate=#{entrydate}, " +
"dept_id=#{deptId}, " +
"updated_at=#{updatedAt} " +
"where id=#{id}")
void update(Employee employee);
4. 設定ファイル
4.1 概要
アプリケーションの設定をファイルに格納します。
4.2 application.yml
以下の設定をapplication.ymlに格納します。
aliyun:
oss:
endpoint: https://oss-cn-hangzhou.aliyuncs.com
accessKeyId: LTAI5t9MZK8iq5T2Av5GLDxX
accessKeySecret: C0IrHzKZGKqU8S7YQcevcotD3Zd5Tc
bucket: web-framework
spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 100MB
4.3 設定値の注入
設定値をJavaクラスに注入します。
AliyunOSSProperties
@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliyunOSSProperties {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucket;
}