特に必要性はないけどAstroとSpringBootをつなげてみた

# はじめに

業務で学んだSpringBootと興味で学んでいるAstroを組み合わせただけのラフな記事です。

以下記事のオマージュになるので、ご了承ください

# 今回メインの参考記事
https://qiita.com/curry__30/items/c91d489551de68adb759#%E5%89%8D%E6%8F%90

https://qiita.com/Haru_3/items/d1644226682dfbc3a9a3

# SpringBootとAstro

### SpringBoot
・Javaを便利に使えるやつ
・カプセル化だったり、色々な周辺技術を少ない力で実装できる非常に便利なフレームワーク

https://spring.pleiades.io/spring-boot/docs/current/reference/html/getting-started.html

### Astro
・SSR重視のMPA設計や、コンポーネントレベルでインタラクティブ性を付与する、アイランドコンポーネントを利用した、高速静的サイトを生成するフレームワーク
・Reactなどの既存モダンフレームワークもアダプター通して導入可能
・ドキュメント充実しているので、読んだほうがいいかも

https://docs.astro.build/ja/concepts/why-astro/

# なんで組み合わせた？
<ul>
<li>Svelte人気など、今後React単体で導入するケースが少なくなりそうという考えがあるため、やってみたかった</li>
<li>SpringBootをAPIサーバのように使って、AstroでFetchするというPJを作ってみたかった</li>
<li>ぶっちゃけ簡単に使えるのがAstroのコンセプトなので、それには反している</li>
</ul>

# PJ構成
```
PJ
├─ astro
│  ├─ src
│  ├─ node_modules
│  ├─ package.json
│  └─ etc...
├─ src
│  ├─ main
│  └─ test
├─ build.gradle
└─ etc...

```
<b>!! Attention !!</b>
PJ直下に移動して、`npm create astro`を実行してください。
PJ名以外はデフォルトの設定になっています。

# 環境
<ul>
<li>vscode</li>
<li>springboot 3.0.0</li>
<li>astro 1.6.14</li>
<li>Java 17</li>
<li>lombok, spring web, spring toolkit</li>
</ul>

# バックエンド

簡単なコントローラーとエンティティを設定します。
別のオリジンからのアクセスを許可するために、`CrossOrigin`をワイルドカードにしてブロックさせない必要があるそうです

```java:src/main/java/com/example/demo/controller/MainController.java
package com.example.demo.controller;

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.example.demo.entity.User;

@RestController
@CrossOrigin(origins = "*")
public class MainController {
  
  @GetMapping("/user/api")
  @ResponseBody
  public User viewUser() {
    User user = new User();
    user.setLastName("山田");
    user.setFirstName("太郎");
    user.setAge(23);
    return user;
  }
}
```
エンティティも簡単なものですね

```java:src/main/java/com/example/demo/Entity/User.java
package com.example.demo.entity;

import lombok.Data;

@Data
public class User {
  private String firstName;

  private String lastName;

  private int age;
}
```

# フロントエンド

レイアウトはデフォルトで生成されるものを使っています。

デフォルトでts使えるのも便利ですね。

スクリプト内(---)でトップダウンのawaitでfetchをして、変数に格納したものを、そのままテンプレートに記述してます。

```json:astro/package.json
{
  "name": "@example/basics",
  "type": "module",
    // api側と同じものにすることでapiを使える
  "proxy": "http://localhost:8080",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "dev": "astro dev",
    "start": "astro dev",
    "build": "astro build",
    "preview": "astro preview",
    "astro": "astro"
  },
  "dependencies": {
    "astro": "^1.6.14"
  }
}

```

```jsx:astro/src/pages/index.astro
---
import Layout from '../layouts/Layout.astro';

type data = {
  firstName: string
  lastName: string
  age: number
}

const response = await fetch("http://localhost:8080/user/api")

const data:data = await response.json()
const userName:string = data.firstName + data.lastName;
const age:number = data.age

---

<Layout title="Welcome to Astro.">
	<main>
		<h2>{userName} <span>{age}歳</span></h2>
	</main>
</Layout>

<style>
	h1 {
		font-size: 3rem;
		font-weight: 800;
		margin: 0;
	}

  span {
    font-size: 0.8rem;
  }
</style>

```

# 実行結果
![スクリーンショット (70).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1047811/7c830e9f-ffa1-4b54-b4af-c3b65992eb2d.png)

参考記事のおかげで結構サクサクいけました。ありがとうございます。

`CORS`と`proxy`さえ設定すれば、フロントエンドのツールが何であれ問題ないですね。

astroのアダプターや他フレームワークの統合が充実しているので、要件によってフレームワーク選定をして、爆速かつリアクティブな開発ができるようになるのかなと思いました。

https://docs.astro.build/ja/guides/integrations-guide/