스프링 프레임 워크

HTTP 응답 다루기(HTML-정적, 동적)

쥐4 2023. 10. 9. 19:36

지금까지는 HttpRequest에 대해서 다루는 방법을 알아보았다.

Request를 통해 데이터가 들어오면 Controller에서는 매핑을 통해 제일 먼저, RequestParam이나 body의 json 데이터를 받고, 처리 후 view나(return "view") json, text 등(@ResponseBody)을 반환한다. 이때, 반환하는 view는 정적, 혹은 동적으로 반환될 수 있는데, 이것을 알맞게 응답해주는 방법을 알아볼 것이다.

 

1. 정적 resource(view)

스프링의 파일 구조를 보면, src/main/resources가 있다.

 

resources아래에는 static과 templates가 있는데, 

-static : 정적 view가 들어갈 수 있음

-templates : 동적 view가 들어갈 수 있음

이런 식으로 view들을 넣어주면 된다.

 

static에 basic 폴더를 만들어 준 후 hello-form.html을 만들어보았다.

이때, url은 localhost:8080/basic/hello-form.html 으로 한다.

 

2. 동적 resource(view)

templates에 들어가는 view는 html파일에 thymeleaf라는 엔진이 추가된다.

다음 코드는 thymeleaf를 사용한 동적 html파일이다.

<hello.html>

<!DOCTYPE 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>

<html xmlns:th="http://www.thymeleaf.org">라고 타임리프를 사용할 것이라고 선언해주었다.

그 후 보이는 점은 th: text="${data}"이다.

컨트롤러에서 data라는 데이터를 가져와 띄워주는 것인데, 그 방법을 이제부터 알아보겠다.

 

package hello.springmvc.basic.response;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class ResponseViewController {

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

    @RequestMapping("/response-view-v2")
    public String responseViewV2(Model model){
        model.addAttribute("data", "hello!");
        return "response/hello";
    }

    @RequestMapping("/response/hello")
    public void responseViewV3(Model model){
        model.addAttribute("data", "hello!");
    }
}

위의 코드는 thymeleaf인 동적 html파일을 컨트롤러에 의해 정상적으로 작동하게 하기 위한 response 코드이다.

 

1. ModelAndView를 통해 전달하기

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

ModelAndView라는 객체는 모델(데이터)과 view(url)을 포함한다. addObject로 데이터를 넣고 생성자에는 url을 넣어주면된다. 

 

2. @Controller를 통해 생성된 Model객체를 통해 전달하기

    @RequestMapping("/response-view-v2")
    public String responseViewV2(Model model){
        model.addAttribute("data", "hello!");
        return "response/hello";
    }

Model을 파라미터로 받아준다. 스프링은 그럼 요청때마다 생성되는 Model객체를 적절히 받아서 파라미터로 넣어준다. 그 후 데이터를 addAtrribute로 넣고 넘겨줄 수 있다.

 

3. 마지막 방법은 보기만 하자. 잘 사용되지 않는다.

 

 

위에 코드들을 보면 의문점을 하나 갖게 될 것이다. 그것은  바로, "parameter로 넘어오는 model이나, HttpEntity같은 객체들은 도데체 어떤 것이 생성하고 넘겨주는 것일까?"이다. 이것은 argument resolver라는 놈이 해주는데, 이 과정은 다음 글에서 알아보도록 하자.

 

<본 글은 김영한님의 강의를 듣고 작성되었습니다.>