
DIフレームワークであるSpring Frameworkwoベースとしたアプリケーションを構築するためのフレームワークです。
Spring Framework에는 개발에 필요한 다양한 기능 (ex.세션, DB엑세스, 시큐리티 등등..)이 정이되어있다. 하지만 이러한 기능을 개발자가 전부 조합해서 사용하는 것은 매우 수고가 드는 일이므로, 각 개발에 필요한 기능들을 정의하여 통합하여 보여주는 것이 SpringBoot라고 할 수 있다.
特に、Webアプリケーションに関しては、MVCアーキテクチャのフレームワークをベースにさまざまな機能を必要に応じて持たせて開発できます。
1.Spring Boot + フレームワーク
Spring Boot만의 기능 뿐 아니라, Spring을 기반으로 한 대부분의 필요한 기능들이 라이브러리화 되서 내장되어있다. 즉, 압도적인 기능 보유
2.DIをベースとする一貫した実装
Spring의 DI, AOP를 기반으로 하기 때문에, 다양한 라이브러리의 기능을 통합해 사용할 때에도, 일관성이 있어 이해하기 쉽다.
3.幅広い利用範囲
Web개발 뿐 아니라, Java개발 전반에 걸쳐서 사용될 수 있다.
4.強力な専用開発ツール「Spring Tool Suite」
보통의 framework들은 본체를 제공할테니 나머지 세부 내용은 알아서 작성해서 사용하라는 경우가 대부분이다.
하지만 Spring Boot는 전용 툴인 STS를 제공함으로써, 개발자가 코드에만 집중하고 나머지 환경설정 부분은 자동적으로 처리될 수 있도록 돕는다.
즉, Spring Boot는 Spring 프레임워크를 이용해 보다 쉽고 빠르게 개발을 할 수 있도록 도와준다.

Spring Boot : 빠른 개발 도와줌
Spring Web : 보통 Spring을 이용한 Web개발 시 일반적으로 사용함
Spring WebFlux : 리액티브 웹 개발 시 사용되는 라이브러리.
해당 책에서는 반응형 web어플 개발에서 사용한다.
Spring Data : DB엑세스를 위한 프레임워크. 일반적으로 사용되는 것은 Spring Data JPA와 Spring Data JDBC
Spring Security : Web엑세스 기능을 제공하는 프레임워크.
MVC 아키텍쳐에를 기반으로 설계한다.
Spring Boot로 만들어진 Web어플은 Spring Web MVC를 사용해 만들어진 것이지만, 이거는 기본적으로 [표현층]의 부분만 그렇다.
-> 클라이언트에게 표시되는 부분.
M은(model) DB이용을 위한 프레임워크인 Spring Data을 통해 구현된다.
Spring Data에는 DB종류에 따라 다양한 프레임워크가 구현되어 있지만, 가장 일반적인 SQL에는 Spring Data JPA를 사용한다.
화면표시를 설계할때에는 템플릿엔진이라는 따른 기술을 이해하여야 한다.
즉, Web어플을 만드는 데에는 다양한 기술과 프레임워크를 숙지해야하지만, Spring Boot에서는 이러한 기능들을 모아서 종합적으로 제공함으로써, 쉽고 빠르게 제작할 수 있도록 돕는다.
Spring Boot CLI(명령줄 인터페이스)는 말그대로 명령줄을 이용해 Spring Boot 어플을 개발, 빌드, 실행한다. CLI는 간편한 명령어를 통해 새로운 프로젝트를 생성하고 빠르게 실행할 수 있도록 돕는다.
>spring init --dependencies=web --artifactId=sample1app --groupId=com.example --name=SampleBootApp1 SampleBootApp1
--dependencies=web
dependency는 의존하는 패키지를 지정한다. 여기서 Spring에 구현되어 있는 프레임워크로부터 사용하는 것들을 선택한다.
위 코드는 web이라는 패키지를 선택.
--artifactId=sample1app
어플에서 할당받는 Id.
--groupId=com.example
패키지의 그룹Id. 개발자의 Id이다. 이것과 아티펙트ID를 통해 프로그램이 식별된다.
--name=SampleBootApp1
어플 이름.
실행
gradle파일이 있는 위치에서
gradlew bootRun
mvnw spring-boot:run
다양한 옵션을 설정하여 CLI로 만드는 것은 긴 커맨드가 요구되고, 오탈자가 있어서는 안되기 때문에 상당히 귀찮다.
이를 위해 Spring홈페이지에서 프로젝트 제작을 지원하는 기능이 Initializer라고 할 수 있다.
(https://start.spring.io/)
Maven과 Gradle을 사용하여 프로젝트를 빌드한다는 것을 알 수 있다.
이는 따로 설치하지 않아도 Spring CLI나 Initializer을 통해 프로젝트를 제작하면 내장되어있는 기능이기 때문에 따로 설치하지 않아도 된다. 하지만 더 많은 추가 기능을 사용할 때에는 따로 설치해야 한다.
STS에는 다양한 뷰가 있지만, 각 뷰가 한꺼번에 사용되지는 않는다. 즉, 각 상황에 맞는 뷰가 필요하다. perspective는 편집용 뷰, 디버그용 뷰 등을 각 상활별 뷰를 세트로 조합하여 놓았다.

사용 후에는 Close Perspective를 통해 돌아온다.
- オートインデント
‐ 閉じタグの自動生成
‐ 色分け表示
‐ 候補の表示
‐ XML설정을 GUI를 통해 설정.
각종 에디터 내부에서 프로젝트 제작은 Spring Initializer에 요청을 보내 제작하는 것이다.
Application.java의 이름이 다르다. VSC의 경우 ArticfactId가 그대로 프로젝트 명으로 된다. 반면 STS에서는 따로 분리되어 작성할 수 있다.
즉, 파일 명이 조금 다르게 생성된다.
build.gradle
Groovy라는 언어로 작성되어 있다.
개발에 이용하는 패키지가 등록(저장)되어 있는 곳.
프로젝트에 필요한 패키지를 등록하는 곳.
여기 등록된 패키지는 gradle/maven을 통해 다운로드되어 설치된다.
####spring-boot-starter-web
Web어플기능을 위한 패키지.
Spring Boot어플의 유닛테스트를 위한 패키지.
Spring프로젝트는 자동 추가된다.
pom.xml
XML언어로 작성된다.
build태그와 plugins 태그
build태그는 빌드 시 필요한 정보를 담고있고,
plugins태그는 빌드 후 사용하는 플러그인 정보를 담고 있다.
Model : 데이터를 관리
View : 화면표시
Controller : 전체 처리의 제어
Controller
특정 주소에 접속하며 실행되는 처리.
어플리케이션의 제어
컨트롤러는 Spring Web에 내장되있는 어노테이션을 통해 만든다.
RestController는 REST방식을 위한 컨트롤러이다.
RESTはWeb APIの基本仕様
REST(Representational State Transfer)은 WEB API에서 사용되는 방법이다.
HTTP메소드와 패스를 조합하여 구성된다.
RestController는 특정주소로 접근하면, 데이터를 얻는다 라는 심플한 구조.
@RestController
class 이름
@ReqeustMapping(パス)
public String 메소드명
@RequestMapping("/{num}")
public String index(@PathVariable int num, Model model) {
int res = 0;
model.addAttribute("msg", "total : " + res);
return "index";
}
-html
<p class="h6 alert alert-primary" th:text="${msg}"></p>
//msg에 res가 표시됨.
Model은 템플릿과 별개로 사용했지만, 모델과 템플릿을 함께 처리하기 위해 ModelAndView사용
@RequestMapping(value = "/", method=RequestMethod.POST)
public ModelAndView form(@RequestParam("text1") String str, ModelAndView mv) {
mv.addObject("msg", "こんにちは" + str + "さん!");
mv.addObject("value", str);
mv.setViewName("index");
return mv;
}
value : Mapping주소. 인수가 2개 이상이면 명시적으로 작성.
@RequestParam("text1") : html태그의 name과 매칭되어 param으로 들어옴.
${value} : mv.addObject("value")로 넘긴 값을 표시
(위 코드의 경우 Click버튼을 클릭했을 때 입력값이 사라지지 않게하기 위함)
<input type="text" class="form-control me-1"
name="text1" th:value="${value}" />
@RequestMapping(value = "/", method=RequestMethod.POST)
public ModelAndView form(@RequestParam(value="check1") boolean check1,
ModelAndView mv) {
value는 html태그의 name과 매칭되며, required false를 통해 해당 값이 들어오지 않더라도 애러를 발생시키지 않음.
フォワード:서버 내부의 다른 페이지를 읽어 표시함. 접속하는 주소는 그대로, 표시내용만을 다른 페이지로 대체함
リダイレクト: 다른페이지로 넘김
🔍
@RequestMapping("/other")
public String other() {
return "redirect:/";
}
@RequestMapping("/home")
public String home() {
return "forward:/";
}
포워드

home을 입력하면 "/"페이지로 넘어가지만 주소는 그대로
리다이렉트

/other 를입력하면 변경된 주소 "/"로 리다이렉트됨
MV의 새로운 인스턴스를 만들어 return넘긴다
return new ModelAndView("redirect:/");
Thymeleaf가 다양한 기능으로 알려져있다면, 그 정 반대에 있는 것이 Mustache이다. Mustache는「シンプルさ」을 특징으로한다.
Mustache를 이용하기 위한 기본 설정
-application.properties
spring.mustache.servlet.cache=false
spring.mustache.prefix=classpath:/templates/
spring.mustache.suffix=.html
java
@RequestMapping("/")
public ModelAndView index(ModelAndView mv) {
String msg = """
<div class="border border-primary">
<h2>Message</h2>
<p>This is sample message!</p>
</div>
""";
mv.setViewName("index");
mv.addObject("msg", msg);
return mv;
}
html
<pre>{{msg}}</pre>
<hr>
<pre>{{{msg}}}</pre>
-결과

{{#OO}} true일 경우
{{/OO}} 사이의 내용을 표기한다
{{^OO}} false일 경우
{{/OO}} 사이의 내용을 표기한다.
{{#flag}}
<p class="alert alert-primary">{{msg}}</p>
{{/flag}}
{{^flag}}
<p>no message...</p>
{{/flag}}
include template:
include escaped:
include unescaped:
ex
body(class:"container"){
include template:"content.tpl"
}
bodyContents()에 다른 tpl페이지가 보여진다.
setViewname("index");
index의 bodyContents : contents{}에 해당 페이지 작성
index.tpl
layout 'layout.tpl',
title: title,
bodyContents: contents {
p(msg)
div(class:"alert alert-priary"){
h6("alert")
p("Message: $msg")
}
}
-layout
yieldUnescaped '<!DOCTYPE>'
html {
head {
meta(charset:"UTF-8")
title(title)
link(rel:"stylesheet", type:"text/css",
href:"https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css")
}
body{
h1(class:"display-4", title)
bodyContents()
footer(class:"fixed-bottom p-2"){
hr(class:"m-1")
p(class:"text-center m-0 p-0", "copyright by SYODA-Tuyano 2023.")
}
}
}
💡결과

`
MVC아키텍쳐에서는 데이터를 Model로 다루었다 . Spring We에서 Web어플리의 기본구성인 MVC가 구현되어 있었다.
Spring Web에는 모델에관한 부분은 없다.
그러면 데이터베이스에 엑세스하는 기능은 Spring Boot에는 없는 것인가?
Spring은 여러개의 프레임워크가 통합적으로 구성된 프레임워크이다. 이 안에는 데이터베이스 엑세스 관련된 것도 몇 개인가 들어가있다. 따라서 Spring Web에 굿이 데이터베이스 엑세스 관련 기능을 넣을 필요가 없는 것.
Jakarta EE에는 JPA(Java Persistence API)라는 영속화를 위한 API가 준비되어 있다. 이 기능을 활용해 데이터베이스 엑세스에 관련된 기능을 구현하며 편리하다.
Spring에서는 이 JPA라는 기술을 베이스로 MVC모델이 관한 프레임워크를 독자적으로 개발할 수 있다. 따라서 Spring Web에는 데이터베이스의 기능이 없지만, 따로 존재하는 데이터베이스관련의 Spring프레임워크를 조합함으로서 WEb어플리 내부에서 데이터베이스를 이용할 수 있게 된다.
또한 이러한 데이터베이스관련의 프레임워크는 Spring Web에서 독립되어있기 때문에 Web어플리가 아닌 일반적인 어플리라고해도 이용할 수 있다.
永続化:オブジェクトなどのデータを保存して常に利用できるようにすること
具体的には、オブジェクトの内容をデータベースに保存し、必要に応じて取り出してオブジェクトを再構築する技術です。
Controller -> Model/JPA -> Database
HyperSQL・H2 : 자바개발용의 데이터베이스.
HyperSQL은 규모가 아주 작고 손쉽게 작동해 테스트 등에 적합
H2는 퍼포먼스가 훌륭하고, Java데이터베이스로서 가장 널리 사용됨.(일본에서)
SpringData : Spring의 데이터베이스 관련 프레임워크군, 코어가되는 프레임워크 이외에, JDB를 사용하는 Spring Data JDBC, JPA를 이용하는 Spring Data JPA등 여러 개의 프레임워크로 구성되어있다.
이 Spring Data에서 실제의 데이터베이스엑세스에 사용하는 것을 골라 설치하여 사용한다.
Spring MVC에 의해 자동으로 인스턴스가 생성된다.
@Repository 무명 실행 클래스의 인스턴스.
1.アプリケーション起動時に、@Repositoryをつけられたインターフェースを検索し、自動的にその実装クラスが作成され、更にそのインスタンスがアプリケーションにBeanとして登録されます。
2.コントローラーなどのクラスがロードされる際、@Autowiredが指定されているフィールドがあると、登録済みのBeanから同じクラスのものを検索し、自動的にそのフィールドにインスタンスを割り当てます。
JpaRepositoryni用意されている「saveAndFlush」というメソッドは、引数のエンティティを永続化します。データベースを利用している場合は、データベースにそのまま保存されます。非常に単純ですね。
データベースの変更を伴うときは、@Transactionをつけるのが基本