오늘은 Spring MVC에서 정적 페이지와 동적 페이지를 처리하는 다양한 방법에 대해 학습했다. 정적 페이지와 동적 페이지가 어떻게 동작하며, 각각의 요청에 따라 Spring Boot에서 어떻게 처리되는지 살펴보자.
정적 페이지는 고정된 HTML 파일을 반환하는 방식으로, Spring Boot에서는 src/main/resources/static
폴더에 파일을 두면 정적 페이지로 제공된다.
http://localhost:8080/hello.html
static
폴더에서 hello.html
파일을 찾아 그대로 반환한다.예시 코드: /static/hello.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello Spring</title>
</head>
<body>
Hello, Spring 정적 웹 페이지!! (static)
</body>
</html>
@GetMapping
을 통해 URL과 메서드를 매핑하여 정적 페이지를 반환할 수 있다.return "hello.html"
처럼 파일명을 직접 반환하여 static
폴더의 파일을 찾게 된다.예시 코드:
@GetMapping("/static-hello")
public String hello() {
return "hello.html"; // static 폴더의 hello.html을 반환
}
http://localhost:8080/static-hello
redirect:/hello.html
과 같이 리다이렉트 문자열을 반환할 수 있다.예시 코드:
@GetMapping("/html/redirect")
public String htmlStatic() {
return "redirect:/hello.html"; // /hello.html로 리다이렉트
}
http://localhost:8080/html/redirect
동적 페이지는 요청에 따라 데이터를 처리하고 이를 템플릿 엔진(Thymeleaf)을 통해 View에 전달하는 방식이다. 데이터는 매번 변경될 수 있으며, 이에 따라 페이지 내용도 동적으로 생성된다.
/html/dynamic
URL로 요청을 보낸다.예시 코드:
@Controller
public class HtmlController {
private static long visitCount = 0;
@GetMapping("/html/dynamic")
public String htmlDynamic(Model model) {
visitCount++;
model.addAttribute("visits", visitCount); // 방문자 수 전달
return "hello-visit"; // /templates/hello-visit.html 파일을 사용
}
}
http://localhost:8080/html/dynamic
동적 HTML 템플릿 (/templates/hello-visit.html
):
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello Spring</title>
</head>
<body>
<div>
Hello, Spring 동적 웹 페이지!!
</div>
<div>
(방문자 수: <span th:text="${visits}"></span>)
</div>
</body>
</html>
th:text="${visits}"
: Controller에서 전달된 visits
값이 동적으로 적용된다. 예를 들어, 방문자 수가 1000000
이라면 <span>1000000</span>
으로 렌더링된다.static
폴더의 파일을 반환하지만, 동적 페이지는 Controller를 거쳐서 데이터를 전달받고 View를 구성한다.Model
에 데이터를 담아 전달하면, Thymeleaf와 같은 템플릿 엔진을 통해 View에 동적으로 적용할 수 있다.src/main/resources/static
에 위치한 HTML 파일은 Controller 없이도 바로 클라이언트에 제공된다.Model
에 담아 Thymeleaf 등의 템플릿 엔진과 함께 동적으로 페이지를 구성한다.redirect:/hello.html
과 같은 방식으로 정적 페이지를 Controller를 통해서도 요청할 수 있다.