프레임워크(Framework)/Spring

[Srping MVC] HTTP 응답 - 정적 리소스, 뷰 템플릿

잇트루 2022. 11. 19. 22:48
반응형
본 내용은 온라인 강의 사이트 인프런의 김영한 님의 강의 내용이 포함되어 있습니다.
'스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술'

 

정적 리소스

정적 리소스는 해당 리소스 파일(HTML, CSS, js)을 변경 없이 그대로 뷰에 제공하는 것을 말한다.

먼저, 스프링 부트는 클래스패스의 특정 디렉토리에 있는 정적 리소스를 제공한다.

  • /static
  • /public
  • /resources
  • /META-INF/resources

기본적으로 src/main/resources/static 경로로 리소스를 보관하고 클래스패스의 시작 경로로 사용한다.

따라서, HTML, css, js 등의 리소스를 해당 경로에 넣어두면 스프링 부트가 정적 리소스로 서비스를 제공한다.

 

예를 들어, 다음 경로에 hello-form.html 파일이 들어 있다면

  • src/main/resource/static/basic/hello-form.html

웹 브라우저에서는 다음과 같이 요청을 보내면 뷰가 제공된다.

  • http://localhost:8080/basic/hello-form.html

 

뷰 템플릿

뷰 템플릿을 거쳐 HTML이 생성되고, 뷰가 응답을 만들어서 전달하는 방식이다.

일반적으로 HTML을 동적으로 생성하는 용도로 사용하지만 다른 용도로도 사용이 가능하다.

 

스프링 부트는 src/main/resources/templates를 기본 뷰 템플릿 경로로 제공하고 있다.

 

Thymeleaf 스프링 부트 설정

뷰 템플릿 코드를 실행하기 위해서는 동적 뷰 템플릿을 지원하는 Thymeleaf를 설정해야 한다.

 

build.gradle

implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'

스프링 부트가 자동으로 ThymeleafViewResolver와 필요한 스프링 빈을 등록한다.

 

뷰 템플릿 생성

스프링 부트가 제공하는 뷰 템플릿 경로에 해당 html 파일을 생성한다.

  • src/main/resources/templates/response
  • hello.html
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
	<p th:text="${data}">empty</p>
</body>
</html>

 

뷰 템플릿을 호출하기 위한 컨트롤러

@Controller
public class ResponseViewController {

    @RequestMapping("/response-view-v1")
    public ModelAndView responseViewV1() {
        ModelAndView mav = new ModelAndView("response/hello")
                .addObject("data", "hello!");

        return mav;
    }

    // String을 반환하는 경우
    @RequestMapping("/response-view-v2")
    public String responseViewV2(Model model) {
        model.addAttribute("data", "hello!");
        return "response/hello";
    }

    // 반환이 없는 경우(void)
    @RequestMapping("/response/hello")
    public void responseViewV3(Model model) {
        model.addAttribute("data", "hello!");
    }
}

String을 반환하는 경우

@ResponseBody가 없으면 response/hello로 뷰 리졸버가 실행되어 뷰를 찾고 렌더링 한다.

  • 뷰의 논리 이름인 response/hello를 반환하여 해당 경로의 뷰 템플릿이 렌더링 된다.
  • 실행 시 templates/response/hello.html

@ResponseBody가 있으면, 뷰 리졸버를 실행하지 않고 HTTP 바디에 직접 respnse/hello라는 문자가 입력된다.

 

반환이 없는 경우(void)

@Controller 어노테이션을 사용하고, HTTP 메시지 바디를 처리하는 파라미터가 없으면, URL을 참고하여 논리 뷰 이름으로 사용한다.

  • URL : /response/hello
  • 실행 : templates/response/hello.html
  • 이 방식의 경우, 명시성이 떨어지고, 조건이 맞지 않는 경우가 대부분으로 권장하지는 않는 방법이다.
반응형