8. 정적 페이지와 동적 페이지

2026. 2. 10. 12:53·BackEnd/내일배움캠프

정적 페이지와 동적 페이지

Spring Boot에서 HTML 파일을 다루다 보면 static과 templates 디렉터리의 역할 차이로 인해 혼란을 겪기 쉽다. 이 글에서는 정적 페이지와 동적 페이지의 차이, 그리고 Spring Boot가 HTML을 찾는 방식에 대해 정리한다.


Controller에서 static HTML을 반환할 수 없는 이유

@GetMapping("/static-hello")
public String hello() {
    return "hello.html";
}

위 상태에서 서버를 실행한 뒤 브라우저 주소창에 다음과 같이 입력하면

localhost:8080/static-hello

에러가 발생한다.

그 이유는 Controller에서 반환하는 문자열은 파일 경로가 아니라 View 이름으로 해석되기 때문이다. Spring Boot는 기본적으로 View를 templates 디렉터리에서 찾는다.

즉, 위 코드는 다음 파일을 찾으려고 시도한다.

src/main/resources/templates/hello.html

하지만 hello.html이 static 디렉터리에 있다면 찾지 못하고 404 에러가 발생한다.


static 리소스에 접근하는 올바른 방법

정적 리소스(static)는 Controller를 거치지 않고 직접 접근해야 한다.

localhost:8080/hello.html
  • src/main/resources/static/hello.html
  • Spring이 아무 처리도 하지 않고 그대로 반환

redirect를 이용한 static HTML 접근

Controller를 통해 static 리소스에 접근하고 싶다면 redirect를 사용할 수 있다.

@GetMapping("/html/redirect")
public String htmlStatic() {
    return "redirect:/hello.html";
}

브라우저에서

localhost:8080/html/redirect

로 접근하면 /hello.html로 이동하며 동일한 화면이 출력된다.

redirect의 특징

  • HTTP Status Code: 300번대 (Redirection)
  • 실제 요청 경로가 변경됨
  • 내부 HTML 경로가 변경되더라도 Controller의 redirect 경로만 수정하면 됨
  • 사용자에게 실제 리소스 경로를 직접 노출하지 않을 수 있음

Thymeleaf와 templates 디렉터리

Thymeleaf는 동적인 웹 페이지를 만들기 위한 템플릿 엔진이다.

Thymeleaf 의존성이 추가되어 있으면 Spring Boot는 Controller에서 반환된 문자열을 기준으로 templates 디렉터리에서 HTML 파일을 찾는다.

@GetMapping("/html/templates")
public String htmlTemplates() {
    return "hello";
}

위 코드는 다음 파일을 찾는다.

src/main/resources/templates/hello.html
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Hello Spring</title>
</head>
<body>
Hello, Spring 정적 웹 페이지!! (templates)
</body>
</html>

접속 주소

localhost:8080/html/templates

결과

Hello, Spring 정적 웹 페이지!! (templates)

참고로, HTML이 정적이라고 해서 반드시 static 폴더에만 있어야 하는 것은 아니다. templates에 두고 View 방식으로 반환할 수도 있다.


동적 페이지 예제

이번에는 Controller에서 데이터를 전달해 동적인 페이지를 만들어본다.

private static long visitCount = 0;

@GetMapping("/html/dynamic")
public String htmlDynamic(Model model) {
    visitCount++;
    model.addAttribute("visits", visitCount);
    return "hello-visit"; // View name
}
  • Spring에서 제공하는 Model 객체 사용
  • Controller에서 데이터를 담아 View로 전달

templates/hello-visit.html

<div>
  (방문자 수: <span th:text="${visits}"></span>)
</div>

접속 주소

localhost:8080/html/dynamic

결과

Hello, Spring 동적 웹 페이지!!
(방문자 수: 1)

페이지를 새로고침할 때마다 방문자 수가 증가한다.


정리

Spring Boot에서 HTML을 찾는 방식은 크게 두 가지다.

1. 정적 리소스 경로 (static)

  • 경로: src/main/resources/static
  • Controller 없이 직접 접근 가능
  • Spring이 가공하지 않고 그대로 반환

예시

localhost:8080/hello.html

2. 템플릿 경로 (templates)

  • 경로: src/main/resources/templates
  • 반드시 Controller를 거쳐야 함
  • return 값은 파일명이 아닌 View 이름
  • Thymeleaf 같은 템플릿 엔진이 처리

중요한 점은 Controller에서 return을 사용하는 순간, Spring은 static 디렉터리를 전혀 보지 않고 templates만 탐색한다는 것이다.

따라서 View 이름에 해당하는 파일이 templates에 없으면 404 에러가 발생한다.

'BackEnd > 내일배움캠프' 카테고리의 다른 글

10. Jackson이란 무엇일까?  (0) 2026.02.10
9. 데이터를 Client에 반환하는 방법  (0) 2026.02.10
7. Controller란?  (0) 2026.02.10
6. MVC 디자인 패턴이란?  (0) 2026.02.09
5. Lombok이란?  (0) 2026.02.09
'BackEnd/내일배움캠프' 카테고리의 다른 글
  • 10. Jackson이란 무엇일까?
  • 9. 데이터를 Client에 반환하는 방법
  • 7. Controller란?
  • 6. MVC 디자인 패턴이란?
JK-LEE98
JK-LEE98
백엔드 개발자
  • JK-LEE98
    JK-LEE98
    JK-LEE98
  • 전체
    오늘
    어제
    • 분류 전체보기 (60)
      • 나의 지식 공유 (4)
      • SQL (4)
      • PS (10)
      • BackEnd (32)
        • Java (3)
        • Spring (4)
        • 내일배움캠프 (20)
        • 프로그래머스 데브코스 (5)
      • 건강한 나 되기🍀 (10)
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
JK-LEE98
8. 정적 페이지와 동적 페이지
상단으로

티스토리툴바