🐥

Spring Bootを学習したので忘れたくない

2024/08/01に公開

Spring Frameworkとは?

  • Dependency Injection
  • Spring系のエコシステム
  • @component, @Autowired, component scanとか

Spring MVCとは?

  • web appやREST APIアプリを作成するためのもの
  • @Controller, @RestController, @RequestMapping,,,

Spring Bootとは

  • 素早く簡単に本番環境のようなアプリを作成できる。
  • Spring inicializerというやつですぐプロジェクトを作成できる
  • Spring FrameworkとかSpring MVCにはたくさんのめんどくさい設定があるけどSpring Bootを使えばそれらをまとめて簡単に使えるようにしてくれる。
  • アプリケーションを管理するためのActuaterというものがあり、これでメトリクスとか見れる
  • jarファイルにtomcatなどのサーバが入っている。
  • profilesを使用して、環境ごとの設定が簡単にできる。

Spring Container & Spring Context & Spring IOC

  • これらは全て同じ意味(spring container, spring context, spring IOC)
  • Spring Containerとは?
  • Spring Contextとは?
  • Spring IOCとは?
  • Bean Factoryとは?
  • Application contextとは?

Spring MVC 概念図

  1. Front ControllerがHTTPリクエストを受け取る
  2. httpリクエストを紐付けられたコントローラーメソッドに渡す
  3. コントローラーメソッドを実行
  4. コントローラーメソッドがviewを返し、view resolverが紐づけられたviewを返す
  5. httpレスポンスを返す

トラブルシューティング

ログレベルをDEBUGにする

エラーの内容を見るには下記を設定する。

$ cat application.properties
logging.level.org.springframework=DEBUG

ロギングについて

spring bootにおいてロギングはapplication設定ファイルからパッケージごとにログレベルを設定できる。

# springboot全体でログレベルをDEBUGに設定
logging.level.org.springframework=INFO
# com.ems.ems.helloパッケージのみログレベルをDEBUGに設定
logging.level.com.ems.ems.hello=DEBUG
package com.ems.ems.hello;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class SayHelloController {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

アノテーションについて

@Controller, @RequestMapping

  • @Controller:コントローラークラスには大体つける。これをつけることでSpring BeanにSpringクラスとして登録されるので、つけるの必須。つけないと読み込まれない。
  • @RequestMapping:URLのパスと起動する関数を結びつける。
package com.ems.ems.hello;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class SayHelloController {
    // say hello
    // localhost:8080/say-hello -> "Hello World"
    @RequestMapping("/say-hello")
    @ResponseBody
    public String sayHello() {
        return "Hello World";
    }
}

@RequestParam

/say-hello-name?name=johnにアクセスした場合

@RequestMapping("/say-hello-name")
@ResponseBody
public String sayHelloName(@RequestParam String name) {
    return "Hello World: " + name;
}


/say-hello-name?info=johnにアクセスした場合

ログ

Could not resolve parameter [0] in public java.lang.String com.ems.ems.hello.SayHelloController.sayHelloName(java.lang.String): Required request parameter 'name' for method parameter type String is not present

Discussion