Spring Bootを自分なりにまとめてみた

こんにちは
タタFY26のみうらです。
Spring Bootに関して調べたことを備忘録的にまとめておきます。
概念的な理解を目的としたため厳密性は保証できません。
2partに分けようかな

## Spring Bootとは
Spring Bootとは**Javaでwebアプリを開発できるようにするためのフレームワーク**です。
全体研修の最後で利用したFlaskと似たものであり、あれはpythonでwebアプリを開発できるようにするフレームワークです。比較すると、Spring Bootはデータベース連携や画面遷移などといった機能が最初から組み込みやすく、企業向けのシステム開発で広く使われています。
**とりあえず、webアプリを開発するときに使う、バックエンドの処理をJavaで書けるようにした便利ツールぐらいに思っておけば大丈夫！**

## Spring Bootってなにがすごいの
とりあえず講義の最後のほうにSpring Bootの話を出されたけど、これまでやってきた方法のサーブレット使ってtomcatサーバー立ててってやればwebアプリ作れるじゃんって話になりますよね。でもこれまでの方法って**意外と面倒なことやらないとwebアプリ作れないんですよね**。具体例を挙げると

### これまでの開発方法では
- **web.xmlなどの設定ファイルを沢山記述する必要がある**
- **サーバーを自分で準備(ダウンロード)して、webアプリのフォルダに配置して起動する必要がある**
- **DBなど外部データを利用するとなると接続のために特殊な記述が必要**

### Spring Bootではどう変わるのか
- **web.xmlのような設定ファイルが必要最低限**
- **起動に対する手順が簡潔でわかりやすい**
- **DBを書く際になにかと便利**

これらの理由から快適に開発させてくれるから人気ってわけです！
ここからはそれぞれの面での具体的な違いを説明していきます。

---
### web.xmlなどの設定ファイルが必要最低限
web.xmlではそれぞれのjavaファイルをサーブレットとして明示化しURLパターンと対応付けを行っていました。これによりwebアプリケーションに必要となるサーブレットに対応されたURLたちのリストを作成するような立ち位置となっていました。Spring Bootではアノテーションを使って簡潔に定義できます。

具体的な違いを見ていきましょう。まずは前者の書き方でweb.xmlにHelloServletを定義する方法を下記に示します。
```xml:web.xml // 従来のwebアプリ開発手順
<web-app>
  <servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
</web-app>
```
見覚えありますね。ここの書き方でエラー吐かれた人も一定数いるのではないでしょうか。
ではSpring Bootでの書き方を見てみましょう。

```java:HelloServlet.java // Spring Bootでの開発手順
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {
    response.setContentType("text/plain");
    response.getWriter().println("Hello from annotated servlet!");
  }
}
```
Spring Bootでは処理を書くJavaファイルに対してアノテーションと呼ばれるタグ付けのようなものを行うことによって定義を行います。すなわち定義付けとしてりようされているのは6行目のみなんですね！とても見やすく、編集が楽そうですよね。

---
### 起動に対する手順が簡潔でわかりやすい
これに関しては皆さん感じている方も多いと思いますが、実行手順を実際に振り返ってみるのがいいでしょう。
#### 昔の方の起動方法
```bash
Javaファイル群をコンパイルする
↓
Tomcatサーバーを立てる
↓
WebContentを選択してデプロイする
↓
Javaファイルを実行する
```
結構大変でしたよね。特にデバックしているときに、どこまで戻ればいいのか分からなくなるのがとても多かった気がします。
#### Spring Bootの起動方法
```bash
./mvnw spring-boot:run
```

以上

**マジで楽です**。なぜこのような差が生まれるかというと、Spring BootではTomcatがアプリの中に最初から組み込まれているので、起動のためにサーバーを用意する必要がないからです。

---

#### DBを書く際になにかと便利
めちゃくちゃ濁して書きました。なぜなら僕がまだ理解しきれていないからです...
でも調べた限りなにかと便利そうってことだけはわかります。

とりあえず昔の方法でのDB接続に関して下記に示します。

```java:Jdbc.java
@WebServlet("/users")
public class UserServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        List<String> userList = new ArrayList<>();

        try {
            Class.forName("org.postgresql.Driver");
            Connection conn = DriverManager.getConnection(
                "jdbc:postgresql://localhost:5432/testdb", "postgres", "password");

            String sql = "SELECT name FROM users";
            PreparedStatement stmt = conn.prepareStatement(sql);
            ResultSet rs = stmt.executeQuery();

            while (rs.next()) {
                userList.add(rs.getString("name"));
            }

            rs.close();
            stmt.close();
            conn.close();

        } catch (Exception e) {
            e.printStackTrace();
        }

        response.setContentType("text/plain");
        PrintWriter out = response.getWriter();
        for (String name : userList) {
            out.println(name);
        }
    }
}

```
主にDB操作をしているところはtry文の中なのですが、コード内にごちゃごちゃと色んな情報が存在してしまっているため何しているかよくわかりづらいですよね。
ここでSpring Bootでの書き方を見てみましょう。

```java:MessageRepository.java
package com.example.message.repository;

import com.example.message.model.Message;
import org.springframework.data.jpa.repository.JpaRepository;

public interface MessageRepository extends JpaRepository<Message,Integer> {
    
}
```



```java:MessageService.java
package com.example.message.service;

import com.example.message.model.Message;
import com.example.message.repository.MessageRepository;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class MessageService {
    private final MessageRepository repository;

    public MessageService(MessageRepository repository){
        this.repository = repository;
    }

    public List<Message> getAllMessages(){
        return repository.findAll();
    }

    public void addMessage(String name, String text){
        repository.save(new Message(name,text));
    }
}
```
このほかにも設定ファイルに記述しなければならないことがあるのですが、これを見てとても感じることが、コード内の情報がまとまっているということです。前者ではクライアントのDBに関する情報からSQL文までコード内に記述しています。これは個人的な感覚かもしれませんが、Javaの中にSQL文などの違った文法が入っているの居心地が悪くありませんか？
Spring BootではそれがないのがとてもGoodに感じました。


## まとめ
Spring Bootめっちゃ便利そうじゃねって思えればいいと思います。勉強したらまたいやな部分が見つかるかもですが、自分は最終演習はSpring Bootを使っていこうと思っています。
眠くなったので寝ます。多分最後のほう文章が終わっています。part2ではコードの実行フローをSpring Boot特有のところを中心に説明できるよう頑張って書く。