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>
동작 원리
- 브라우저에서 localhost:8080/hello-mvc?name=spring으로 요청을 보냅니다.
- 컨트롤러에서 model(name:spring)을 담아 hello-template이라는 이름을 리턴합니다.
- viewResolver가 해당 템플릿을 찾아 타임리프 엔진에게 넘깁니다.
- 타임리프가 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 사용 원리)
- @ResponseBody를 사용하고 객체를 리턴하면 HttpMessageConverter가 동작합니다.
- 기본 객체 처리: MappingJackson2HttpMessageConverter가 동작하여 객체를 JSON으로 바꿉니다.
- 기본 문자 처리: StringHttpMessageConverter가 동작합니다.
- 결과적으로 브라우저에는 {"name":"spring"} 같은 JSON 데이터가 보입니다.
요약 정리
- viewResolver: HTML 템플릿을 찾아 화면을 그릴 때 사용합니다.
- HttpMessageConverter: 데이터를 직접 주고받는 API 방식에서 사용합니다.
- 문자열일 때: StringHttpMessageConverter
- 객체일 때: MappingJackson2HttpMessageConverter (JSON 변환)
'INFLEARN' 카테고리의 다른 글
| [스프링 입문] 8. 스프링 데이터 JPA (0) | 2026.03.06 |
|---|---|
| [스프링 입문] 5. 컴포넌트 스캔과 자동 의존관계 설정(@Componet와 @Bean) (0) | 2026.03.06 |
| [스프링 입문] 4. JUnit5 테스트 코드 작성 (0) | 2026.03.03 |
| [스프링 입문] 3. Optimal 타입 (0) | 2026.03.03 |
| [스프링 입문] 1. Spring Boot에서 정적 페이지 로드 순서 (0) | 2026.03.03 |