Open8

VSCode上でJava+Spring Bootの環境構築~API開発

yosh1yosh1

とりあえず環境準備

  • Windows 11
    • バージョンあとで確認
  • OpenJDK
    • Oracle
    • 17.0.5 LTS
  • Visual Studio Code
    • 何の変哲もないもの

今後の作業の前提はこの環境で進む。
Mavenがよくわからなかったので一旦放置して次に進む。

yosh1yosh1

VSCodeに拡張機能 Spring Boot Extension Pack を入れる

  • Create Java Project する。
    • 順番に、
      • Spring Boot
      • Maven
      • 3.0.2
      • Java
      • 任意の名称
      • Jar
      • Java 17
      • Spring Web
  • プロジェクトが作成できたら右下に出てくる Open からVSCodeでフォルダを開く。

Mavenを別途インストールしなくてもよしなにやってくれるのが非常に快適。

yosh1yosh1

Run しようとしてみる

demo\src\main\java\com\example\sample\demo\DemoApplication.java を開くとこのように main メソッドの上に Run | Debug と出ているのでRunしてみる。

コマンドが走る

が、 8080 にアクセスしてもこのように動作しない。

yosh1yosh1

Controller classを追加する

MVCにおけるController classがないことが原因なので、 demo\src\main\java\com\example\sample\demo\DemoApplicationController.java を作成し、RouteをMappingする。ひとまずHello Worldしたいので、以下のようにする。

package com.example.sample.demo;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;

@RestController
public class DemoApplicationController {
    @RequestMapping("/")
    public String test() {
        return "Hello World!";
    }   
}

再度動かしてみると、無事にHello World! できた。

yosh1yosh1

APIを開発するために書き直す

package com.example.sample.demo;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@RestController
@RequestMapping("/api")
public class DemoApplicationController {
    @GetMapping("/hello")
    public String test() {
        return "Hello World!";
    }
}

これで /api/hello でアクセスできるようになった

yosh1yosh1

Todoアプリ用のAPIを作っていく

DB設定をする

src/main/resources/application.properties に MySQL データベースの設定を追加する。

# MySQL Properties
spring.datasource.url=XXXX
spring.datasource.username=root
spring.datasource.password=password

# JPA Properties
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

# Database Driver
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

適宜置き換え。

タスクのモデルを作成

src/main/java/com/example/sample/demo/model/Task.java を作成する。

package com.example.sample.demo.model;

import javax.persistence.*;
import java.time.LocalDate;

@Entity
@Table(name = "tasks")  // 明示的にテーブル名を指定
public class Task {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;
    private String detail;
    private String category;
    private LocalDate date;
    private boolean completed;

    // Getters and Setters
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDetail() {
        return detail;
    }

    public void setDetail(String detail) {
        this.detail = detail;
    }

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }

    public LocalDate getDate() {
        return date;
    }

    public void setDate(LocalDate date) {
        this.date = date;
    }

    public boolean isCompleted() {
        return completed;
    }

    public void setCompleted(boolean completed) {
        this.completed = completed;
    }
}

リポジトリの作成

src/main/java/com/example/sample/demo/repository/TaskRepository.java を作成する。

package com.example.sample.demo.repository;

import com.example.sample.demo.model.Task;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface TaskRepository extends JpaRepository<Task, Long> {
}

サービスの作成

src/main/java/com/example/sample/demo/service/TaskService.java を作成する。

package com.example.sample.demo.service;

import com.example.sample.demo.model.Task;
import com.example.sample.demo.repository.TaskRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class TaskService {
    @Autowired
    private TaskRepository taskRepository;

    public List<Task> getAllTasks() {
        return taskRepository.findAll();
    }
}

コントローラーの更新

DemoApplicationController.java を更新する。

package com.example.sample.demo;

import com.example.sample.demo.model.Task;
import com.example.sample.demo.service.TaskService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/api")
public class DemoApplicationController {

    @Autowired
    private TaskService taskService;

    @GetMapping("/hello")
    public String test() {
        return "Hello World!";
    }

    @GetMapping("/tasks")
    public List<Task> getTasks() {
        return taskService.getAllTasks();
    }
}

これで GET /api/tasks でAPIが動作するようになる。