helloworld 패키지에 HelloWorldController를 만들었다.
1단계에서 배운 핵심부터 말하자면, @RestController는 @Controller와 @ResponseBody가 합쳐진 어노테이션이다!
// 1. 이 컨트롤러가 REST API임을 알릴 것
public class HelloWorldController {
// 2. REST API에 /hello-world URL 부여
// 3. 사용자가 /hello-world URL에 들어가면, "hello world" 텍스트를 반환시킬 것.
}
// 1. 이 컨트롤러가 REST API임을 알릴 것
@RestController
public class HelloWorldController {
// 2. REST API에 /hello-world URL 부여
// 3. 사용자가 /hello-world URL에 들어가면, "hello world" 텍스트를 반환시킬 것.
@GetMapping(path = "/hello-world")
public String helloWorld() {
return "hello world";
}
}
@RestController
언제 쓰는지?
@Controller 어노테이션은 스프링 MVC에서 컨트롤러를 정의할 때 사용한다.
@Controller 메서드의 리턴값
@Controller가 사용되는 컨트롤러는 HTTP request를 처리하고, 모델 데이터를 뷰에 전달해, 사용자에게 response 페이지를 렌더링하는 역할을 한다.
따라서 @Controller의 경우, 메서드의 반환타입은 주로 뷰 이름(String)이다!
@Controller와 @ResponseBody의 관계
@Controller는 @ResponseBody 어노테이션
을 메서드에 추가해야만, 메서드의 return된 데이터가 HTTP response body에 bind되어, 브라우저에 반환된 문자열이 보여진다.
언제 쓰는지?
@RestController 어노테이션은 spring 4.0부터 도입되었으며, RESTful 웹 서비스를 개발할 때 사용된다.
@RestController 메서드의 리턴값
@RestController를 사용하면, 반환되는 객체를 자동으로 JSON이나 XML과 같은 형식으로 serialize되어, 클라이언트에게 전송된다.
-> @Controller
는 주로 뷰이름인 String이 반환값이지만, @RestController
는 객체(instance)를 반환하면 자동으로 JSON or XML로 바꿔주고, 브라우저에 보여진다.
@RestController와 @ResponseBody의 관계
@RestController는 @Controller
와 @ResponseBody
가 합쳐져 있다.
이에, @RestController만 써도, 컨트롤러 클래스의 모든 메서드의 리턴값을, HTTP response body에 bind시켜, 데이터를 직접 반환하게 한다.
결론적으로, @Controller
는 전통적인 웹 어플리케이션 개발에 초점을 맞춘 반면, @RestController
는 RESTful 웹 서비스, 즉 데이터를 JSON이나 XML 형태로 클라이언트에게 제공하는 API 개발에 최적화되어 있다.
앞서 @Controller vs @RestController에서도 정리했듯이, 주로 @RestController 메서드의 리턴값은 객체이다. @RestController는 반환되는 객체를 자동으로 JSON이나 XML 형식으로 변환시켜, 클라이언트에게 보여준다고 했었다.
이제, HelloWorldController에서, @RestController의 리턴값이 객체인 코드를 추가해주자.
@RestController
public class HelloWorldController {
@GetMapping(path = "/hello-world")
public String helloWorld() {
return "hello world";
}
// 추가된 내용
@GetMapping(path = "/hello-world-bean")
public HelloWorldBean helloWorldBean() {
return new HelloWorldBean("hello world");
}
}
public class HelloWorldBean {
private String message;
public HelloWorldBean(String message) {
this.message = message;
}
// getters and setters
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
// toString
@Override
public String toString() {
return "HelloWorldBean [message=" + message + "]";
}
}
이 시리즈는 Udemy 강의의 내용을 정리한 것입니다.
https://www.udemy.com/course/spring-boot-and-spring-framework-korean/