Spring Boot Web アプリケーションの実践的な開発例

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;
}

タグ: Spring Boot RESTful API ファイルアップロード OSS(阿里云) マッパーインターフェイス

7月5日 19:55 投稿