최근에는 프론트엔드와 백엔드가 각각 따로 발전하게 되면서, 느슨하게 결합하는 방식을 더 많이 채택하게 되었습니다.
서버가 직접 View(html, css, js)를 반환하기 보다는 요청에 맞는 특정한 정보만 반환하는 것을 조금 더 선호합니다. 그래서 요즘에는 주로 서버에서는 데이터 교환 포맷 중 JSON 형태로 데이터를 반환하기도 합니다.
1. 최초에 Client(브라우저)로부터 요청이 들어오면 정적 또는 동적 페이지를 반환합니다.
2. 이후에는 AJAX(JS 라이브러리)가 비동기적으로 서버쪽에 데이터를 요청합니다.
3. 서버는 요청에 맞는 데이터를 JSON 형태로 반환합니다.
Json 데이터 반환 방법
1) 반환 값: String
JSON은 JS에서 지원하는 데이터 타입으로 Java는 기본적으로 JSON 타입을 지원하지 않습니다. 그에 따라 JSON 형태로 Client에게 반환해주기 위해서는 JSON 형태 처럼 생긴 String 타입을 반환합니다.
@Controller
@RequestMapping("/response")
public class ResponseController {
@GetMapping("/json/string")
@ResponseBody
public String helloStringJson() {
return "{\"name\" : \"Robbie\", \"age\" : 95}";
}
}
Postman을 통해 확인해보면 JSON 처럼 생겼지만 Client(브라우저) 에서는 Content-Type을 text/html로 인식하고 있음을 알 수 있습니다.
2) 반환 값: String 외 자바 클래스
이번에는 리턴 값을 String이 아닌 객체 자체로 반환해보겠습니다.
// Star 클래스
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public class Star {
private String name;
private int age;
}
@Controller
@RequestMapping("/response")
public class ResponseController {
@GetMapping("/json/class")
@ResponseBody
public Star helloClassJson() {
return new Star("Robbie", 95);
}
}
객체 자체를 반환하는 경우에는 Content-Type이 'text/html'이 아닌 'application/json' 입니다. 왜 그럴까요?
객체를 그대로 반환하게 되면 JS는 이해를 하지 못합니다. 따라서 Spring이 객체를 JSON 타입으로 자동 변환하여 반환하게 됩니다.(Jackson 라이브러리)
만약 Spring을 사용하지 않는다면 HttpSevletResponse 객체에 일일이 Content-Type을 지정해 주어야 합니다.
@RestController
@RestController = @Controller + @ResponseBody
@RestController를 사용하면 해당 클래스의 모든 메서드에 @ResponseBody 어노테이션이 추가되는 효과를 부여할 수 있습니다.
@RestController
@RequestMapping("/response/rest")
public class ResponseRestController {
@GetMapping("/json/string")
public String helloStringJson() {
return "{\"name\" : \"Robbie\", \"age\" : 95}";
}
@GetMapping("/json/class")
public Star helloClassJson() {
return new Star("Jackson", 60);
}
}
'Spring' 카테고리의 다른 글
[Spring] Path Variable 과 Request Param (0) | 2024.09.26 |
---|---|
[Spring] Jackson 이란 무엇인가? (0) | 2024.09.26 |
[Spring] 정적 페이지와 동적 페이지 (1) | 2024.09.26 |
[Spring] 3 Layer - Controller (0) | 2024.09.26 |
[Spring] Spring MVC (0) | 2024.09.26 |