우아한테크코스 6기/2단계

[방탈출 예약 관리] 템플릿 엔진과 @RestController

minl741 2024. 5. 12. 13:47

템플릿 엔진

스프링 부트는 정적 페이지와 템플릿 시작 페이지를 모두 지원한다.

먼저, static 아래의 index.html 파일을 찾고 없다면 index 템플릿을 찾는다.

 

아래와 같은 위치로 파일이 존재한다면, 

/static/index.html을 찾고, (/static/index.html)이 없다면, /templates/index.html를 찾아 응용 프로그램 시작 페이지로 띄운다.

static에는 보통 정적 파일인 js나 css 같은 파일들이 위치하고, templates에는 서버가 실행되면서 동적으로 렌더링되는 Thymeleaf 템플릿 파일들이 위치한다.

템플릿 엔진 반환하기

@Controller
public class MemberController {

    @GetMapping("/hello")
    public String world(@RequestParam(required = false) String name, Model model) {
        if (name == null) {
            return "static";
        }
        model.addAttribute("name", name);
        return "hello";
    }
}

 

위와 같이 코드를 작성하게 된다면, ViewResolver가 동작하여 

text/html을 반환하고 바디에 html파일의 내용이 들어가는 것을 확인할 수 있다.

 

@ResponseBody

@ResponseBody는 컨트롤러의 메서드의 반환값을 HttpMessageConverter를 통해 응답 본문으로 직렬화하여 응답한다.

즉, 위의 템플릿 엔진 파일과 달리 ViewResolver가 작동되는 것이 아닌, HttpMessageConverter가 작동한다.

@RestController

@RestController는 @Controller에 @ResponseBody가 자동으로 적용되는 어노테이션이다.

@RestController
public class MemberController {

    @GetMapping("/hello")
    public String world(@RequestParam(required = false) String name, Model model) {
        if (name == null) {
            return "static";
        }
        model.addAttribute("name", name);
        return "hello";
    }
}

 

 

때문에 같은 코드에서 @Controller만 @RestController로 변경하게 될 시,

리턴타입인 String에 대해 HttpMessageConverter가 동작하여 응답의 Content-Type이 text/html이 아닌, text/plain인 것을 확인 할 수 있다.

따라서 바디에도 hello라는 문자열의 값이 그대로 들어가게 된다.

 


타임리프를 사용하지 않았어서 view를 직접 반환한 적이 없었는데, 이번 학습 테스트를 하면서 템플릿 엔진과 @RestController, @Controller의 차이에 대해서도 정확히 알 수 있게 되었다