reference 링크 :
https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/html/spring-boot-features.html#boot-features
HelloSpringApplication.java
package hello.hellospring;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class HelloSpringApplication {
// main() 메소드 -> 프로젝트 시작 구간
public static void main(String[] args) {
// @SpringBootApplication 어노테이션에 의해
// 파라미터로 넣어준 HelloSpringApplication 클래스를 스프링부트 애플리케이션 실행
// 내장된 톰캣 웹서버를 띄우면서 스프링부트 함께 실행
SpringApplication.run(HelloSpringApplication.class, args);
}
}
어플리케이션 실행의 시작 부분은 늘 그렇듯 메인 메소드가 자리한 곳이다.
스프링부트 프로젝트를 생성하면 자동으로 해당 프로젝트명 + Application 의 이름을 가진 클래스와 메인 메소드가 생성된다.
그렇게 생성된 클래스에는 @SpringBootApplication 어노테이션이 붙는데, 이 어노테이션을 기준으로 필요한 여러 설정들을 불러온다.

프로젝트 세팅이 정상적으로 된 경우, localhost:포트번호 로 접속 시 다음과 같은 화면을 볼 수 있다.
그렇다면 화면에 띄울 인덱스 페이지를 만들어보자.
스프링부트는 resources/static 하위 index.html 파일을 찾아 해당 파일을 웰컴 페이지로 사용한다.
- 스프링부트의 웰컴페이지
- resources/static/index.html
index.html
<!DOCTYPE HTML>
<html>
<head>
<title>Hello</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
Hello
<a href="/hello">hello</a>
</body>
</html>
resources/static 경로 하위 index.html 파일을 생성하고, 코드를 작성한다.

다시 접속해보면 작성해둔 코드에 따라 화면에 나타나는 것을 확인할 수 있다.
이제 실제 작동하는 화면을 만들어보자.
인덱스 페이지의 Hello 링크를 클릭하면 해당 페이지로 넘어가도록 만들 것이다.
index.html
<a href="/hello">hello</a>
먼저 /hello 요청을 받을 컨트롤러를 작성한다.

HelloController.java
package hello.hellospring.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloController {
// /hello url 요청을 받으면 실행
@GetMapping("hello")
// Model: 스프링이 Model을 만들어서 넣어줌
public String hello(Model model) {
// model.addAttribute(attributeName, attributeValue): model에 전달하고자 하는 속성 추가
model.addAttribute("data", "hello!!");
// return : 리턴하는 이름의 페이지 렌더링
return "hello";
}
}
Controller 어노테이션을 통해 해당 클래스가 웹 어플리케이션의 컨트롤러 역할을 하는 클래스임을 명시한다.
GetMapping 어노테이션을 통해 해당 메소드가 GET 요청을 처리하는 API임을 명시하며, 파라미터로 요청 받을 url을 작성한다.
@GetMapping("hello")라고 함은 클라이언트로부터 "/hello" GET 요청이 들어온 경우 해당 메소드를 찾는 것이다.
컨트롤러의 메소드는 요청이 들어오면 스프링에게 Model 객체를 파라미터로 전달받는다.
이 Model 객체에 addAttribute() 메소드를 사용하여 view단에 데이터를 전달한다.
컨트롤러의 return값은 view단에 보내는 신호이다.
view단에서 http로 변환할 수 있는 주소값을 return값으로 설정하면, 해당 주소의 페이지가 렌더링된다.
return값으로 hello 페이지를 전달하므로, 이제 hello 페이지를 만들어보자.
컨트롤러에서 만들어준 데이터를 동적으로 화면에 뿌려줄 페이지를 만들 것이다.
hello.html
<!DOCTYPE HTML>
<!-- 템플릿 엔진으로 thymeleaf를 사용하겠다는 설정-->
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Hello</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p th:text="'안녕하세요. ' + ${data}" >안녕하세요. 손님</p>
</body>
</html>
우리는 Thymeleaf 의존성을 추가해준 바 있다.
build.gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
...
}
index.html 인덱스 페이지는 정적 페이지에 불과하다.
작성한 파일을 그대로 웹 브라우저에 넘겨주기 때문이다.
템플릿 엔진을 사용하면 html을 동적으로 렌더링할 수 있다.
템플릿 엔진은 서버사이드 템플릿 엔진과 클라이언트사이드 템플릿 엔진으로 구분된다.
템플릿 엔진은 미리 정의된 템플릿과 데이터를 합성하여 html을 생성하는 소프트웨어이다.
미리 정의된 템플릿이 있고, 그 위에 서버에서 가져온 데이터를 동적으로 넣어 html 페이지를 완성시킨 후 클라이언트에 전달하는 방식이다.
고정적으로 사용되는 부분은 html을 사용하여 그려놓고, 동적으로 생성되는 부분만 미리 정의된 템플릿에 넣어 전달한다.
클라이언트사이드 템플릿 엔진과 차이점은 서버에서 화면을 생성한다는 것이다.
서버사이드 템플릿 엔진이 요청을 받아 html을 그려내는 과정은 다음과 같다.
스프링부트에서 사용할 수 있는 서버사이드 템플릿 엔진 종류는 다음과 같고, 그 중 우리는 Thymeleaf를 사용할 것이다.
Thymeleaf 공식페이지 : https://www.thymeleaf.org/
서버에서 화면을 렌더링하는 서버사이드 템플릿 엔진과 달리 클라이언트 측에서 화면을 생성한다.
클라이언트 측에서 화면을 생성하기 때문에 서버 측에서는 단지 데이터만 전달하며, 클라이언트 측에서 서버에서 받은 데이터를 합성해 화면을 만드는 것이다.
데이터를 받아서 DOM 객체에 동적으로 html 코드를 작성해주는 역할을 한다.
클라이언트사이드 템플릿 엔진이 요청을 받아 html을 그려내는 과정은 다음과 같다.
서버사이드 템플릿 엔진이 먼저 생성되고, 클라이언트사이드 템플릿 엔진이 이후에 생성된다.
템플릿 엔진을 함께 사용한다고 했을 때, 서버사이드 템플릿 엔진에서 클라이언트 엔진의 데이터를 사용할 수 없다.
<html xmlns:th="http://www.thymeleaf.org">
Thymeleaf의 th속성을 이용하기 위해 네임스페이스를 추가한다.
<p th:text="'안녕하세요. ' + ${data}" >안녕하세요. 손님</p>
컨트롤러에서 전달받은 데이터로 변환하여 텍스트로 출력한다.
컨트롤러에서 전달받은 데이터 중 'data'라는 attributeName의 attributeValue인 'hello!!'를 찾아서 변환한다.

localhost:8080/hello 요청을 보낸 후, 데이터를 받아 만들어진 화면은 이러하다.
요청을 받아 데이터를 가공하고 클라이언트에 html을 다시 전달하기까지의 과정을 살펴보자.

resources/templates + {ViewName} + '.html' 페이지를 찾는다.