템플릿 엔진이 적용된 SpringBoot에서는 Controller에서 문자열을 반환하면 templates 폴더에서 해당 문자열의 .html
파일을 찾아서 반환을 해준다.
Java는 JSON 타입을 지원하지 않기 때문에 JSON 형태의 String 타입으로 변환해서 사용해야한다.
→ 따라서 HTML파일이 아닌 JSON형태를 띄는 String데이터를 브라우저에 반환하고 싶다면 해당 메서드에 HTMP파일이 아닌 있는 그대로를 반환해주는 @ResponseBody
애너테이션을 추가해줘야한다
@GetMapping("/json/string")
@ResponseBody
public String helloStringJson() {
return "{\"name\":\"Robbie\",\"age\":95}";
}
Spring에서는 자동으로 Java의 객체를 JSON으로 변환해준다.
Java 객체 → JSON 으로 자동 변환
예시) Star.java
package com.sparta.springmvc.response;
import lombok.Getter;
@Getter
public class Star {
String name;
int age;
public Star(String name, int age) {
this.name = name;
this.age = age;
}
public Star() {}
}
package com.sparta.springmvc.response;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/response")
public class ResponseController {
// [Response header]
// Content-Type: text/html
// [Response body]
// {"name":"Robbie","age":95}
@GetMapping("/json/string")
@ResponseBody
public String helloStringJson() {
return "{\"name\":\"Robbie\",\"age\":95}";
}
// [Response header]
// Content-Type: application/json
// [Response body]
// {"name":"Robbie","age":95}
@GetMapping("/json/class")
@ResponseBody
public Star helloClassJson() {
return new Star("Robbie", 95);
}
}
= @Controller
+ @ResponseBody
@RestController
를 사용하면 해당 클래스의 모든 메서드에 @ResponseBody 애너테이션이 추가되는 효과를 부여할 수 있다.
@RequestBody
: 이 애너테이션이 붙은 파라미터에는 http요청의 본문(body)이 그대로 전달된다.@RequestBody
를 사용할 일이 없지만, xml이나 JSON기반의 메시지를 사용하는 요청의 경우 이 방법이 매우 유용하다.예시)
package com.sparta.springmvc.response;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/response/rest")
public class ResponseRestController {
// [Response header]
// Content-Type: text/html
// [Response body]
// {"name":"Robbie","age":95}
@GetMapping("/json/string")
public String helloStringJson() {
return "{\"name\":\"Robbie\",\"age\":95}";
}
// [Response header]
// Content-Type: application/json
// [Response body]
// {"name":"Robbie","age":95}
@GetMapping("/json/class")
public Star helloClassJson() {
return new Star("Robbie", 95);
}
}
과거의 서버는 요청을 받아 HTML/CSS/JS 파일을 반환하는게 주 없무였지만 최근의 경향으로는 그렇지 않다.
최근에는 서버가 직접 View(HTML/CSS/JS)를 반환하기 보다는 요청에 맞는 특정한 정보만 반환하는 것을 조금 더 선호한다. 그래서 요즘에는 주로 서버에서는 데이터 교환 포맷 중 JSON형태로 데이터를 반환하는데 아래와 같이 생겼다.
JSON 데이터 형태
Clien와 Server가 데이터를 주고받는 방식