
서버는 요청을 받아 html/css/js 파일을 반환해주는게 주 업무일까?
정답은 없지만, 최근의 경향으로는 그렇지 않다!
웹 생태계가 고도화 되는 과정 중에 프론트엔드와 백엔드가 각각 따로 발전하게 되면서, 느슨하게 결합하는 방식을 더 많이 채택하게 되었다. 최근에는 서버가 직접 뷰(html/css/js)를 반환하기 보다는 요청에 맞는 특정한 정보만 반환하는 것을 더 선호한다. 그래서 요즘에는 주로 서버에서 데이터 교환 포맷중 JSON 형태로 데이터를 반환한다.
{
"users": [
{
"id": 1,
"name": "홍길동"
},
{
"id": 2,
"name": "김철수"
}
]
}
{
"success": true,
"data": {
"orderId": 123,
"status": "READY",
"price": 15000
},
"message": "주문 조회 성공"
}
따라서 서버는 더 이상 HTML을 직접 반환하는 역할에만 머무르지 않고, 클라이언트가 필요로 하는 데이터를 JSON 형태로 제공하는 역할을 수행한다. 이를 통해 프론트엔드와 백엔드가 분리된 구조에서 유연하게 통신할 수 있다.

- 템플릿 엔진이 적용된 SpringBoot에서는 Controller에서 문자열을 반환하면 templates 폴더에서 해당 문자열의
.html파일을 찾아서 반환해준다.- 따라서 html 파일이 아닌 JSON 데이터를 브라우저에 반환하고 싶다면 해당 메서드에 @ResponseBody 애너테이션을 추가해줘야한다.
/*
* "hello" → 뷰 이름으로 인식
* thymeleaf dependency가 있으면 templates 경로를 먼저 찾음
* /templates/hello.html 찾음
*/
@GetMapping("/hello")
public String hello() {
return "hello";
}
/*
* [Response header] Content-Type: text/html
* "hello" → 그대로 응답
*/
@GetMapping("/json/string")
@ResponseBody
public String hello() {
return "hello";
}
/*
* 객체 반환하면? -> Spring에서 자동으로 JSON으로 변환함
* [Response header] Content-Type: application/json
{
"id": 1,
"name": "홍길동"
}
*/
@GetMapping("/json/class")
@ResponseBody
public User getUser() {
return new User(1, "홍길동");
}
@RestController = @Controller + @ResponseBody
@RestController를 사용하면 해당 클래스의 모든 메서드에 @ResponseBody 애너테이션이 추가되는 효과를 부여할 수 있다.
@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);
}
}