Spring Boot Tips : 最初のSpring Boot Webアプリケーションの作成

Java

Javaの言語知識とWeb系の知識はあるがMavenとSpringBootの初心者である私が最初のWebアプリケーションを作成するまでに行った学習内容をまとめる。

想定の知識レベルは、「Hellow worldを最小構成のpom.xmlでmavenビルド」ぐらいを勉強した程度。SpringBootが何者かについてはざっくりと知っている。この記事を読んでもらえば無知程度がわかると思う。

以下、参考にした情報。

Spring Boot Reference Documentation

WebアプリケーションサーバーとしてTomcatを使用したSpring Bootで「Hello World」Webアプリを作る。

SpringではBuildシステムとしてMavenとGradleが利用できるようだ。今回はMavenでビルドできるように準備する。

以下の内容で理解していく。

  • spring bootを利用する場合のpom.xml
  • spring bootでwebアプリを作成するために必要なライブラリをpom.xmlに追加指定する
  • spring bootを利用したwebアプリJavaコードのお作法

Javaは現役の時のメイン言語だったので新しい言語仕様があっても少し勉強すれば理解できるのだが、MavenとSpringは全くの素人。「Hello World」でも1つ1つの用語やプロセスがわからないので最初はかなりハードルが高く感じる。

Spring Boot用最小構成のpom.xml

Spring Bootを使用する場合、Mavenの最小構成pom.xmlに対して<parent>タグを追加し、Spring Boot関連のプロジェクト設定情報を継承すればよいようだ。

これはプロジェクト設定のみであり、必要となるライブラリなどは後ほど定義していく。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/POM/maven-4.0.0.xsd">

		<!-- pom.xmlの最小構成要素 -->
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>myproject</artifactId>
    <version>0.0.1-SNAPSHOT</version>

		<!-- ここがSpring Bootの親プロジェクトを継承しているところ -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.1</version>
    </parent>

    <!-- Additional lines to be added here... -->
</project>

pom.xmlの最小構成は理解しているが、parentがお初なので少し調べて理解する。

pom.xmlのparentタグ

Maven – POM Reference

上記に理解が難しい内容が書かれているが、まずは以下のように理解しておけば良い。

mavenのpom.xmlファイルではpom.xmlの継承(pom.xmlの親子関係)がサポートされている。Spring Boot用のプロジェクト設定情報は「spring-boot-starter-parent」というプロジェクトに集約されているようで、Spring Bootのアプリケーションを開発する場合はこのプロジェクト情報を継承すれば良い。

Webアプリのためのライブラリを依存関係で定義する

Spring Bootのプロジェクト設定を定義したあと、Webアプリで必要となるクラスライブラリを<dependency>タグで追加定義する。

<?xml version="1.0" encoding="UTF-8" ?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/POM/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>myproject</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.1</version>
    </parent>

    <!-- Additional lines to be added here... -->

	<!-- Spring BootのWEB系クラスライブラリ群を追加-->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
</project>

上記依存関係を追加してmavenの依存関係ツリー表示コマンド「mvn dependency:tree」を実行すると、どのようなjarが依存関係として紐づけられたか確認できる。

$ mvn dependency:tree
[INFO] Scanning for projects...
[INFO] 
[INFO] -----------------------< com.example:myproject >------------------------
[INFO] Building myproject 0.0.1-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- dependency:3.6.1:tree (default-cli) @ myproject ---
[INFO] com.example:myproject:jar:0.0.1-SNAPSHOT
[INFO] \\- org.springframework.boot:spring-boot-starter-web:jar:3.2.1:compile
[INFO]    +- org.springframework.boot:spring-boot-starter:jar:3.2.1:compile
[INFO]    |  +- org.springframework.boot:spring-boot:jar:3.2.1:compile
[INFO]    |  +- org.springframework.boot:spring-boot-autoconfigure:jar:3.2.1:compile
[INFO]    |  +- org.springframework.boot:spring-boot-starter-logging:jar:3.2.1:compile
[INFO]    |  |  +- ch.qos.logback:logback-classic:jar:1.4.14:compile
[INFO]    |  |  |  +- ch.qos.logback:logback-core:jar:1.4.14:compile
[INFO]    |  |  |  \\- org.slf4j:slf4j-api:jar:2.0.9:compile
[INFO]    |  |  +- org.apache.logging.log4j:log4j-to-slf4j:jar:2.21.1:compile
[INFO]    |  |  |  \\- org.apache.logging.log4j:log4j-api:jar:2.21.1:compile
[INFO]    |  |  \\- org.slf4j:jul-to-slf4j:jar:2.0.9:compile
[INFO]    |  +- jakarta.annotation:jakarta.annotation-api:jar:2.1.1:compile
[INFO]    |  +- org.springframework:spring-core:jar:6.1.2:compile
[INFO]    |  |  \\- org.springframework:spring-jcl:jar:6.1.2:compile
[INFO]    |  \\- org.yaml:snakeyaml:jar:2.2:compile
[INFO]    +- org.springframework.boot:spring-boot-starter-json:jar:3.2.1:compile
[INFO]    |  +- com.fasterxml.jackson.core:jackson-databind:jar:2.15.3:compile
[INFO]    |  |  +- com.fasterxml.jackson.core:jackson-annotations:jar:2.15.3:compile
[INFO]    |  |  \\- com.fasterxml.jackson.core:jackson-core:jar:2.15.3:compile
[INFO]    |  +- com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:2.15.3:compile
[INFO]    |  +- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.15.3:compile
[INFO]    |  \\- com.fasterxml.jackson.module:jackson-module-parameter-names:jar:2.15.3:compile
[INFO]    +- org.springframework.boot:spring-boot-starter-tomcat:jar:3.2.1:compile
[INFO]    |  +- org.apache.tomcat.embed:tomcat-embed-core:jar:10.1.17:compile
[INFO]    |  +- org.apache.tomcat.embed:tomcat-embed-el:jar:10.1.17:compile
[INFO]    |  \\- org.apache.tomcat.embed:tomcat-embed-websocket:jar:10.1.17:compile
[INFO]    +- org.springframework:spring-web:jar:6.1.2:compile
[INFO]    |  +- org.springframework:spring-beans:jar:6.1.2:compile
[INFO]    |  \\- io.micrometer:micrometer-observation:jar:1.12.1:compile
[INFO]    |     \\- io.micrometer:micrometer-commons:jar:1.12.1:compile
[INFO]    \\- org.springframework:spring-webmvc:jar:6.1.2:compile
[INFO]       +- org.springframework:spring-aop:jar:6.1.2:compile
[INFO]       +- org.springframework:spring-context:jar:6.1.2:compile
[INFO]       \\- org.springframework:spring-expression:jar:6.1.2:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.214 s
[INFO] Finished at: 2024-01-14T17:50:36+09:00
[INFO] ------------------------------------------------------------------------

Spring以外にも、log4j、yaml、json、tomcatなどの関連クラスライブラリが含まれている事が確認できる。

Spring Boot関連ライブラリのdependencyでversionタグを省略している理由

通常、mavenでは以下の3つの要素でライブラリを特定している。

  • groupId
  • artifactId
  • version

だが、今回dependencyタグで指定したspring-boot-starter-webではversionタグを指定していない。これは、spring-boot-starter-parentプロジェクト設定にて、各クラスライブラリのバージョンが定義されており、明示的に指定しない場合はそのバージョンが参照されるようだ。

もちろん指定する事で特定バージョンを参照できるようだが、今のところその必要性がないため、指定は可能ということだけは覚えておく。

Web版の「Hello World」JavaコードをSpring Bootで書く

SpringBootアプリであること、Restアプリであること、この2つをClass Annotationで宣言する事で、昔のデザインパターンであるServletのRequest Handlerの仕組みが出来上がるイメージを持った。

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@SpringBootApplication
public class MyApplication {

    @RequestMapping("/")
    String home() {
        return "Hello, World!";
    }

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

クラスのmainメソッドでは、SpringApplicationのrunメソッドに対して自分自身のクラスオブジェクトを引数として指定して実行しているだけ。Webアプリとはいえプログラムの開始ポイントが明確であり、それが昔ながらのmainメソッドであるというのは非常にわかりやすい。あとは必要なHTTPリクエストを受け付けるコールバック関数を書いていく感じ。

Spring Bootではメソッド単位にHTTPリクエストを受け付けるためのマッピングが可能になっている。以前はRequest Handler(HTTPリクエストを処理する)クラスだったが、Spring Bootではメソッド単位にRequest Handler(ハンドラーメソッド)を宣言できる。

それでは、以下Springアノテーションについて調査した内容を記載する。

@RestController アノテーションとは

RestControllerアノテーションは、REST通信を行うサーバーを宣言するためのSpringステレオタイプアノテーションで、宣言されたクラスはWebアプリのリクエストハンドラー(Controller)として機能する。ハンドラーメソッド(サンプルプログラムの”home”メソッド、@RequestMappingが付与されている)を定義する事で、特定URLパスへのHTTPメソッド呼び出しに対応する処理を定義する事ができる。

サーバー側の処理結果データを直接HTTPレスポンスボディとして返却でき、データはJSONやXMLフォーマットでも良いし、テキストでもよい。

通常のHTMLを返却する@Controllerアノテーションとの違いは、モデル・ビューが不要であるところ。

@RestControllerでは、Request Handlerとして宣言したメソッドの戻り値がそのままHTTPレスポンスになるようで、プログラマーはそれがHTTPレスポンスかどうか意識する必要がなく、かつユニットテストが簡単になるのでとても都合がいい。

以下のサイトの説明がわかりやすかったのでリンクを掲載。

誰もが一度はつまずくSpring Bootを解説♪-アノテーション編(Part1)-【若手Javaエンジニア向け】 ‣ ステックアップアカデミー, 誰もが一度はつまずくSpring Bootを解説♪
Spring Bootを使用し始めたときに誰もが共通してつまずきやすいポイントを、Javaのスキルや経験が浅い若手エンジニアでも簡単に理解できるよう極力難しい用語を使わずに解説します。今回はSpring Bootが使用するアノテーションにつ...
アノテーションRestControllerアノテーションの違い

ステレオタイプアノテーションとは

日本語でググっても分かりやすい説明が見つけられず、英語のサイトでようやく腹落ちできる情報に出会った。

https://medium.com/javarevisited/stereotype-annotations-in-spring-the-building-blocks-of-efficient-application-development-710eeb9dfb0a#:~:text=Stereotype annotations are a powerful,a particular role or purpose.

上記の記事では、ステレオタイプアノテーションを以下のように定義している。

ステレオタイプアノテーションは、アプリケーション内のクラスに対して特定の役割を付与することを目的とする。 ステレオタイプアノテーションは、Springコンポーネント構成定義を簡素化するために用いる事ができる。クラスには、ステレオタイプが示す共通のデフォルト値と振る舞いが付与される。

以下にステレオタイプとして定義されているSpringアノテーションの例を示す。WebアプリのMVCパターンをアノテーションで組めるようになっている。

  • @Component:Spring Beanとしてマークする事ができる基本的なアノテーション。これが付与されたクラスは、プログラム実行時にSpringによりインスタンスが生成されアプリケーションコンテキストにSpring Beanとして登録される。登録されたインスタンスは他のクラスにDIする事ができるようになる。
  • @Service:@Componentアノテーションの特化版で、業務ロジックを定義するクラスをDI可能なSpring Beanとして扱う場合に付与する。ControllerクラスとRepositoryクラスの間で使用される。
  • @Repository:@Componentアノテーションの特化版で、データベースアクセス処理を定義するクラスをDI可能なSpring Beanとして扱う場合に付与する。データエンティティに対してCRUD操作を提供する。
  • @Controller:@Componentアノテーションの特化版で、MVCモデルのコントローラーをSpring Beanとして定義する場合に付与する。HTTPリクエストを処理し、適切なHTTPレスポンスを提供する。

@SpringBootApplicationアノテーションとは

18. Using the @SpringBootApplication Annotation

多くのSpring Boot開発者は、自分のアプリケーションに対して以下のSpring機能を有効にする。

  • @EnableAutoConfiguration
  • @ComponentScan
  • @SpringBootConfiguration

@SpringBootApplicationアノテーションは、これら3つの基本的な機能を1つのアノテーションで有効にするメタアノテーションとして利用できる。各アノテーションは今後調査するが、ここで重要なのは@EnableAutoConfiguration。

先ほど作成したpom.xmlの依存関係には「spring-boot-starter-web」を追加した。このコンポーネントにはSpring MVCとTomcatが含まれている。@EnableAutoConfigurationを宣言すると、Springはこれらの依存関係に含まれているコンポーネントを自動検出し、Webアプリケーションを開発するためのコンポーネントを推測して自動構成する。

@RequestMappingアノテーションとは

“/”から始まるHTTPリクエストのルーティング情報を定義するメソッドレベルアノテーション。

サンプルプログラムでは、”/”というURLパスが指定されたら”home”メソッドを実行するように定義している。

このようにRequestMappingアノテーションが定義されたメソッドのことを「ハンドラーメソッド」ともいう。

Mavenを使ったプログラムのビルド

サンプルで使われているゴール「spring-boot:run」はspring-boot-starter-webに含まれているSpring Bootプラグインのゴールで、以下の処理が実行される。

  1. mavenによりプロジェクトの依存関係を解決し必要なライブラリのダウンロードが実行される。
  2. validate、compile、test-compileフェーズが順次実行され、プロジェクトがビルドされる。
  3. 埋め込み式のサーブレットコンテナ(デフォルトではTomcat)を起動する。 (通常、spring-boot:runはデフォルトのプロファイル(ポート8080)でアプリケーションを起動する。application.propertiesやapplication.ymlファイルがあればこれらのファイルに定義した設定が適用される。)

1つだけ気になったのは、ここではjarやwarといった配布用のファイルは作成していないという事。配布用ファイルの作成(パッケージングというらしい)には、mavenデフォルトのゴールとSpring Bootの再パッケージを行うゴールという2つの方法があるようなので、このあと少し詳細に確認してみる。

以下実行ログにより上記の項目が順次実行されている事がわかる。

$ mvn spring-boot:run
[INFO] Scanning for projects...
Downloading from central: <https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-failsafe-plugin/3.1.2/maven-failsafe-plugin-3.1.2.pom>
Downloaded from central: <https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-failsafe-plugin/3.1.2/maven-failsafe-plugin-3.1.2.pom> (10 kB at 9.8 kB/s)
Downloading from central: <https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-failsafe-plugin/3.1.2/maven-failsafe-plugin-3.1.2.jar>
Downloaded from central: <https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-failsafe-plugin/3.1.2/maven-failsafe-plugin-3.1.2.jar> (54 kB at 598 kB/s)
Downloading from central: <https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-invoker-plugin/3.6.0/maven-invoker-plugin-3.6.0.pom>
Downloaded from central: <https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-invoker-plugin/3.6.0/maven-invoker-plugin-3.6.0.pom> (16 kB at 394 kB/s)
Downloading from central: <https://repo.maven.apache.org/maven2/org/apache/groovy/groovy-bom/4.0.12/groovy-bom-4.0.12.pom>
Downloaded from central: <https://repo.maven.apache.org/maven2/org/apache/groovy/groovy-bom/4.0.12/groovy-bom-4.0.12.pom> (27 kB at 1.2 MB/s)
Downloading from central: <https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-invoker-plugin/3.6.0/maven-invoker-plugin-3.6.0.jar>
Downloaded from central: <https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-invoker-plugin/3.6.0/maven-invoker-plugin-3.6.0.jar> (135 kB at 633 kB/s)
Downloading from central: <https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-javadoc-plugin/3.6.3/maven-javadoc-plugin-3.6.3.pom>
Downloaded from central: <https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-javadoc-plugin/3.6.3/maven-javadoc-plugin-3.6.3.pom> (22 kB at 612 kB/s)
Downloading from central: <https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-plugins/41/maven-plugins-41.pom>
Downloaded from central: <https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-plugins/41/maven-plugins-41.pom> (7.4 kB at 306 kB/s)
Downloading from central: <https://repo.maven.apache.org/maven2/org/apache/maven/maven-parent/41/maven-parent-41.pom>
Downloaded from central: <https://repo.maven.apache.org/maven2/org/apache/maven/maven-parent/41/maven-parent-41.pom> (50 kB at 1.9 MB/s)
Downloading from central: <https://repo.maven.apache.org/maven2/org/apache/apache/31/apache-31.pom>
Downloaded from central: <https://repo.maven.apache.org/maven2/org/apache/apache/31/apache-31.pom> (24 kB at 1.0 MB/s)
Downloading from central: <https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-javadoc-plugin/3.6.3/maven-javadoc-plugin-3.6.3.jar>
Downloaded from central: <https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-javadoc-plugin/3.6.3/maven-javadoc-plugin-3.6.3.jar> (510 kB at 2.8 MB/s)
Downloading from central: <https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-shade-plugin/3.5.1/maven-shade-plugin-3.5.1.pom>
Downloaded from central: <https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-shade-plugin/3.5.1/maven-shade-plugin-3.5.1.pom> (14 kB at 643 kB/s)
Downloading from central: <https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-shade-plugin/3.5.1/maven-shade-plugin-3.5.1.jar>
Downloaded from central: <https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-shade-plugin/3.5.1/maven-shade-plugin-3.5.1.jar> (147 kB at 1.0 MB/s)
Downloading from central: <https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-source-plugin/3.3.0/maven-source-plugin-3.3.0.pom>
Downloaded from central: <https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-source-plugin/3.3.0/maven-source-plugin-3.3.0.pom> (6.7 kB at 337 kB/s)
Downloading from central: <https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-source-plugin/3.3.0/maven-source-plugin-3.3.0.jar>
Downloaded from central: <https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-source-plugin/3.3.0/maven-source-plugin-3.3.0.jar> (32 kB at 703 kB/s)
Downloading from central: <https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-war-plugin/3.4.0/maven-war-plugin-3.4.0.pom>
Downloaded from central: <https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-war-plugin/3.4.0/maven-war-plugin-3.4.0.pom> (8.4 kB at 399 kB/s)
Downloading from central: <https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-war-plugin/3.4.0/maven-war-plugin-3.4.0.jar>
Downloaded from central: <https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-war-plugin/3.4.0/maven-war-plugin-3.4.0.jar> (83 kB at 2.5 MB/s)
[INFO] 
[INFO] -----------------------< com.example:myproject >------------------------
[INFO] Building myproject 0.0.1-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] >>> spring-boot:3.2.1:run (default-cli) > test-compile @ myproject >>>
[INFO] 
[INFO] --- resources:3.3.1:resources (default-resources) @ myproject ---
[INFO] skip non existing resourceDirectory /Users/sato/proj/learn/java/spring/getstartedapp/src/main/resources
[INFO] skip non existing resourceDirectory /Users/sato/proj/learn/java/spring/getstartedapp/src/main/resources
[INFO] 
[INFO] --- compiler:3.11.0:compile (default-compile) @ myproject ---
[INFO] Changes detected - recompiling the module! :input tree
[INFO] Compiling 1 source file with javac [debug release 17] to target/classes
[INFO] 
[INFO] --- resources:3.3.1:testResources (default-testResources) @ myproject ---
[INFO] skip non existing resourceDirectory /Users/sato/proj/learn/java/spring/getstartedapp/src/test/resources
[INFO] 
[INFO] --- compiler:3.11.0:testCompile (default-testCompile) @ myproject ---
[INFO] No sources to compile
[INFO] 
[INFO] <<< spring-boot:3.2.1:run (default-cli) < test-compile @ myproject <<<
[INFO] 
[INFO] 
[INFO] --- spring-boot:3.2.1:run (default-cli) @ myproject ---
[INFO] Attaching agents: []

  .   ____          _            __ _ _
 /\\\\ / ___'_ __ _ _(_)_ __  __ _ \\ \\ \\ \\
( ( )\\___ | '_ | '_| | '_ \\/ _` | \\ \\ \\ \\
 \\\\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.2.1)

2024-01-22T16:57:40.989+09:00  INFO 2507 --- [           main] com.example.MyApplication                : Starting MyApplication using Java 21.0.1 with PID 2507 (/Users/sato/proj/learn/java/spring/getstartedapp/target/classes started by sato in /Users/sato/proj/learn/java/spring/getstartedapp)
2024-01-22T16:57:40.992+09:00  INFO 2507 --- [           main] com.example.MyApplication                : No active profile set, falling back to 1 default profile: "default"
2024-01-22T16:57:41.662+09:00  INFO 2507 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port 8080 (http)
2024-01-22T16:57:41.677+09:00  INFO 2507 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2024-01-22T16:57:41.677+09:00  INFO 2507 --- [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.17]
2024-01-22T16:57:41.773+09:00  INFO 2507 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2024-01-22T16:57:41.774+09:00  INFO 2507 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 737 ms
2024-01-22T16:57:42.043+09:00  INFO 2507 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 8080 (http) with context path ''
2024-01-22T16:57:42.050+09:00  INFO 2507 --- [           main] com.example.MyApplication                : Started MyApplication in 1.356 seconds (process running for 1.668)
2024-01-22T16:57:55.471+09:00  INFO 2507 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2024-01-22T16:57:55.471+09:00  INFO 2507 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2024-01-22T16:57:55.473+09:00  INFO 2507 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 2 ms
^C[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  30.231 s
[INFO] Finished at: 2024-01-22T16:58:06+09:00
[INFO] ------------------------------------------------------------------------
sato@[16:58:06]:~/proj/learn/java/spring/getstartedapp%

実行まで、やっと辿り着いた。

コメント

タイトルとURLをコピーしました