INFLEARN

[스프링 입문] 2.MVC 템플릿 엔진 vs API 방식

ch010104 2026. 3. 3. 19:01

1. MVC와 템플릿 엔진 (Model, View, Controller)

사용자가 보낸 파라미터를 받아 서버에서 HTML을 동적으로 가공해 응답하는 방식입니다.

예시 코드

  • Controller:Java
@Controller
public class HelloController {
    @GetMapping("hello-mvc")
    public String helloMvc(@RequestParam("name") String name, Model model) {
        model.addAttribute("name", name); // 'name'이라는 키로 전달받은 값을 담음
        return "hello-template"; // templates/hello-template.html을 찾아라
    }
}
  • View (resources/templates/hello-template.html):HTML
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>

동작 원리

  1. 브라우저에서 localhost:8080/hello-mvc?name=spring으로 요청을 보냅니다.
  2. 컨트롤러에서 model(name:spring)을 담아 hello-template이라는 이름을 리턴합니다.
  3. viewResolver가 해당 템플릿을 찾아 타임리프 엔진에게 넘깁니다.
  4. 타임리프가 HTML을 변환(렌더링)하여 브라우저에 전달합니다.

2. API 방식 - 문자 반환 (@ResponseBody)

HTML 페이지를 통째로 주는 것이 아니라, 단순한 문자열 데이터만 본문에 직접 실어 보내는 방식입니다.

예시 코드

@GetMapping("hello-string")
@ResponseBody // viewResolver를 사용하지 않고 HTTP BODY에 직접 반환
public String helloString(@RequestParam("name") String name) {
    return "hello " + name; // "hello spring"이라는 문자가 그대로 전달됨
}

특징

  • @ResponseBody를 사용하면 뷰 리졸버를 거치지 않습니다.
  • 대신 HTTP 응답의 BODY에 문자 내용을 직접 반환합니다.

3. API 방식 - 객체 반환 (@ResponseBody + JSON)

가장 많이 쓰이는 방식으로, 자바 객체를 반환하면 이를 JSON 형식으로 자동 변환해 주는 방식입니다.

예시 코드

@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name) {
    Hello hello = new Hello();
    hello.setName(name);
    return hello; // 객체를 반환함
}

static class Hello {
    private String name;
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
}

동작 원리 (@ResponseBody 사용 원리)

  1. @ResponseBody를 사용하고 객체를 리턴하면 HttpMessageConverter가 동작합니다.
  2. 기본 객체 처리: MappingJackson2HttpMessageConverter가 동작하여 객체를 JSON으로 바꿉니다.
  3. 기본 문자 처리: StringHttpMessageConverter가 동작합니다.
  4. 결과적으로 브라우저에는 {"name":"spring"} 같은 JSON 데이터가 보입니다.

요약 정리

  • viewResolver: HTML 템플릿을 찾아 화면을 그릴 때 사용합니다.
  • HttpMessageConverter: 데이터를 직접 주고받는 API 방식에서 사용합니다.
    • 문자열일 때: StringHttpMessageConverter
    • 객체일 때: MappingJackson2HttpMessageConverter (JSON 변환)