
@Controller의 핸들러 메소드가 주로 반환하는 반환형은 어떤 것들이 있는지 살펴보고, ModelAndView 반환형과 타임리프 템플릿에 대해서 가볍게 알아도보록 하겠습니다.
@Controller
public class MyController {
@GetMapping("/home")
public String home() {
return "home";
}
}
위와 같이 코드 작성 시, "home.jsp" 또는 "home.html" 같은 템플릿이 렌더링됩니다.
String 반환의 경우 뷰 이름을 직접 반환하므로 반환된 이름을 이용해 뷰 리졸버가 뷰 파일을 찾고, void 반환의 경우 요청 URL을 사용해 뷰 이름을 추론하고, 그 이름을 사용해 뷰 리졸버가 해당 뷰 파일을 찾습니다. URL을 기준으로 뷰 이름을 추론하는 것은 Spring MVC의 동작입니다.
@Controller
public class MyController {
@GetMapping("/home")
public ResponseEntity<String> home() {
return new ResponseEntity<>("Hello, World!", HttpStatus.OK);
}
}
@Controller
public class MyController {
@GetMapping("/home")
@ResponseBody
public String home() {
return "Hello, World!";
}
}
코드상으론 String 반환형과 동일해 보이지만, @ResponseBody 어노테이션이 붙음으로써 Spring MVC가 반환된 값을 처리하는 방식이 달라집니다. @ResponseBody가 붙으면 Spring은 반환된 데이터를 뷰 이름으로 해석하지 않고, 반환된 값을 HTTP 응답의 본문(body)으로 직접 사용합니다.
@Controller
public class MyController {
@GetMapping("/async")
public DeferredResult<String> async() {
DeferredResult<String> output = new DeferredResult<>();
// 비동기 작업 완료 후 output.setResult("result") 호출
return output;
}
}
@Controller
public class MyController {
@GetMapping("/greeting")
public ModelAndView greeting() {
// ModelAndView 객체 생성, 뷰 이름을 "greeting"으로 설정
ModelAndView mav = new ModelAndView("greeting");
// 모델에 데이터 추가
mav.addObject("name", "John");
// ModelAndView 반환
return mav;
}
}
위 예시에서 greeting은 템플릿 명, addObject는 템플릿에 전달한 데이터입니다. 타임리프 템플릿 예시는 아래와 같습니다.
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Greeting</title>
</head>
<body>
<h1 th:text="'Hello, ' + ${name} + '!'">Hello, Guest!</h1>
</body>
</html>
${name} 부분에 John이 노출되는 방식으로 동작합니다.