API를 통하여 템플릿 엔진을 거치지 않고 바로 정보를 화면에 뿌릴 수도 있다.
먼저 HelloController
에 다음 코드를 추가해보자.
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name) {
return "hello " + name;
}
내가 파라미터로 받아온 값을 바로 return해줄 수 있다.
여기서 가장 중요한 코드는 바로 @ResponseBody
인데, 내가 받아온 값을 http의 body에 바로 전달을 한다는 의미이다.
실행해보면 코드가 아래와 같이 생겼다.
그런데 신기한 점은 소스코드를 보면 html 태그가 아무것도 없다는 점!
템플릿 엔진은 그것을 이용하여 view를 조작했다면 이번에는 직접 리턴을 해서 보여주는 것을 알 수 있다.
만약 return값이 아니라 문자열이 아니라 데이터를 내놓으라고 하면 어떻게 될까?
이러한 이유 때문에 API 방식을 많이 쓰는 것이다.
새롭게 controller를 하나 더 작성해보자.
@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;
}
}
이번에는 return을 통하여 객체를 넘겨준다.
Hello hello = new Hello()
를 통하여 객체를 하나 만들어주고, setName
함수를 통하여 객체의 값을 설정해주자.
아래에는 Hello
객체를 정의하는 방법이 나와 있는데, getName
을 통해서는 name값을 리턴해주고, setName
을 통하여서는 name
값을 설정해준다.
이제 실제로 프로젝트상에서 어떻게 나타나는지 보도록 하자.
이렇게 객체가 JSON 형태로 반환된다.
일반적으로 Spring은 따로 형식을 지정해주지 않으면 객체를 JSON으로 반환하여 나타나게 한다.
만약 받아온 컨트롤러에 @ResponseBody
가 존재하면 viewResolver
를 실행히시키 않고 HttpMessageConverter
가 실행된다. 이를 통하여 HTTP의 body에 있는 내용이 직접 만환된다.
그 중에 종류가 두가지 있는데, 그 각 기능은 다음과 같다.
+) 참고 : 클라이언트의 HTTP Accept 해더와, 서버의 컨트롤러 반환 + 타입정보 둘을 조합해서 HttpMessageConverter가선택된다. 만약 XML로 반환하고 싶다면 그에 해당하는 Converter로 변경할 수 있다는 사실!