
Spring에서 Controller가 요청을 처리한 후 반환하는 데이터는 DispatcherServlet(Front Controller)에 의해 처리되며, 반환 타입에 따라 다르게 동작한다.
DispatcherServlet이 ViewResolver를 사용하여 HTML을 반환
웹 페이지를 반환할 때는 ViewResolver가 사용되며, Controller에서 다음과 같은 방식으로 반환할 수 있다.
Controller가 String을 반환하면, Spring은 이를 View 이름으로 간주하여 해당 HTML을 찾아 렌더링한다.
예시 코드
@Controller
public class PageController {
@RequestMapping("/home")
public String home() {
return "home"; // home.html 또는 home.jsp를 찾아 렌더링
}
}
DispatcherServlet이 home이라는 View 이름을 받음ViewResolver가 home.html을 찾아서 렌더링Controller가 ModelAndView를 반환하면, View뿐만 아니라 데이터를 함께 전달할 수 있다.
예시 코드
@Controller
public class PageController {
@RequestMapping("/user")
public ModelAndView user() {
ModelAndView mav = new ModelAndView("user"); // user.html을 View로 설정
mav.addObject("name", "John Doe"); // Model 데이터 추가
return mav;
}
}
ModelAndView 객체를 반환 (View 이름: user.html, Model 데이터: name)ViewResolver가 user.html을 찾아서 name 데이터를 적용DispatcherServlet이 HttpMessageConverter를 사용하여 JSON 반환
웹 API에서는 JSON 데이터를 반환해야 하는 경우가 많으며, @ResponseBody를 사용하면 ViewResolver를 거치지 않고 JSON 데이터를 반환한다.
// 기존 방식 (매 메서드마다 @ResponseBody 추가해야 함)
@Controller
public class IndexController {
@ResponseBody // JSON 응답을 위해 필요
@RequestMapping(method = RequestMethod.GET, value = "/")
public String index() {
return "index.html";
}
}
@RestController 를 붙이면 내부 모든 메서드에 @ResponseBody 를 붙인 것과 동일// @RestController 사용 (모든 메서드가 자동으로 JSON 반환)
@RestController
public class IndexController {
@RequestMapping(method = RequestMethod.GET, value = "/")
public String index() {
return "index.html";
}
}
http://localhost:8080/ 에 접근
(1). @Controller + @ResponseBody 사용 시 → "index.html"(문자열) 반환
(2). @RestController 사용 시 → 동일하게 "index.html"(문자열) 반환
즉, @RestController 는 @Controller + @ResponseBody 를 합친 개념이며, JSON 데이터를 반환하는 API 를 만들 때 유용함
@RestController // @Controller + @ResponseBody (자동 JSON 변환)
public class ApiController {
@GetMapping("/api/user")
public User getUser() {
return new User("John", 25);
}
}
class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
// Getter & Setter 필수 (JSON 변환을 위해)
}
@RestController 또는 @ResponseBody를 사용하여 JSON 응답을 명시DispatcherServlet이 HttpMessageConverter를 사용하여 객체를 JSON으로 변환출력 예시 (JSON 응답)
{
"name": "John",
"age": 25
}
JSON ↔ Java 객체 변환을 담당하는 HttpMessageConverter
Spring에서는 HttpMessageConverter를 이용하여 요청 및 응답 데이터를 변환한다.
@ResponseBody
@RequestMapping("/json")
public User returnJson() {
return new User("Alice", 30);
}
User("Alice", 30) 반환HttpMessageConverter가 JSON으로 변환@PostMapping("/json")
public String receiveJson(@RequestBody User user) {
return "Received user: " + user.getName();
}
HttpMessageConverter가 이를 Java 객체(User)로 변환Spring에서는 다양한 HttpMessageConverter를 제공하며, 요청의 Content-Type에 따라 자동으로 적용된다.
| Converter | 미디어 타입 (Content-Type) | 설명 |
|---|---|---|
| StringHttpMessageConverter | text/plain 또는 text/html | 문자열 반환 시 |
| MappingJackson2HttpMessageConverter | application/json | JSON 데이터 변환 |
| ByteArrayHttpMessageConverter | application/octet-stream | 바이너리 데이터 전송 (파일 다운로드) |
| ResourceHttpMessageConverter | image/png, image/jpeg | 이미지 및 파일 반환 |
JSON 응답을 위한 기본 설정
@Bean
public MappingJackson2HttpMessageConverter jsonConverter() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setSupportedMediaTypes(List.of(MediaType.APPLICATION_JSON));
return converter;
}
| Controller 반환 타입 | 설명 | DispatcherServlet 처리 방식 |
|---|---|---|
String 반환 | 정적 HTML 페이지 | ViewResolver 사용 |
ModelAndView 반환 | 동적 HTML + 데이터 | ViewResolver 사용 |
@ResponseBody + 객체 반환 | JSON 데이터 반환 | MessageConverter 사용 |
웹 페이지(HTML) 반환
String 또는 ModelAndView 반환 시, ViewResolver 사용하여 HTML 렌더링JSON 데이터 반환
@ResponseBody 또는 @RestController 사용 시, MessageConverter가 JSON 변환HttpMessageConverter 적용 원리
HttpMessageConverter는 요청과 응답 데이터 변환 (직렬화/역직렬화) 담당Content-Type에 따라 적절한 변환기 자동 적용