package hello.springmvc.basic.response;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import hello.springmvc.basic.HelloData;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import java.io.IOException;
@Controller
public class ResponseBodyController {
ObjectMapper objMapper = new ObjectMapper();
@GetMapping("/response-body-string-v1")
public void responseBodyV1(HttpServletResponse response) throws IOException {
response.getWriter().write("ok");
}
@GetMapping("/response-body-string-v2")
public ResponseEntity<String> responseBodyV2(HttpServletResponse response) {
return new ResponseEntity<>("ok", HttpStatus.OK);
}
@ResponseBody
@GetMapping("/response-body-string-v3")
public String responseBodyV3() {
return "ok";
}
@ResponseBody
@GetMapping("/response-body-json-v1")
public String responseBodyJsonV1() throws JsonProcessingException {
HelloData helloData = new HelloData();
helloData.setUsername("userA");
helloData.setAge(20);
String jsonBody = objMapper.writeValueAsString(helloData);
return jsonBody;
}
@GetMapping("/response-body-json-v2")
public ResponseEntity<HelloData> responseBodyJsonV2() {
HelloData helloData = new HelloData();
helloData.setUsername("userA");
helloData.setAge(20);
return new ResponseEntity<>(helloData, HttpStatus.OK);
}
@ResponseStatus(HttpStatus.OK)
@ResponseBody
@GetMapping("/response-body-json-v3")
public HelloData responseBodyJsonV3() {
HelloData helloData = new HelloData();
helloData.setUsername("userA");
helloData.setAge(20);
return helloData;
}
}
String(text)의 경우
response의 writer에 쓰거나
응답컨버터, HttpEntity를 이용해서 return하거나,
@ResponseBody를 쓰면 아예 자동으로 return값에다가 HttpEntity를 사용해 준다.
Json의 경우
ObjectMapper를 이용해서 객체 to String으로 해서 그 문자열을 반환하거나(이 경우 그냥 @ResponseBody로 직접 바디에 String을 넣어줬음)
이것도 HttpEntity를 이용하거나
@GetMapping("/response-body-json-v2")
public ResponseEntity<HelloData> responseBodyJsonV2() {
HelloData helloData = new HelloData();
helloData.setUsername("userA");
helloData.setAge(20);
return new ResponseEntity<>(helloData, HttpStatus.OK);
}
반환타입 보이듯이 ResponseEntity<HelloData>를 반환해 준다.
이것도 자동으로 ObjectMapper를 사용해 준다. Json 형태로 바꿔준다.
@ResponseStatus(HttpStatus.OK)
@ResponseBody
@GetMapping("/response-body-json-v3")
public HelloData responseBodyJsonV3() {
HelloData helloData = new HelloData();
helloData.setUsername("userA");
helloData.setAge(20);
return helloData;
}
아예 @ResponseBody를 사용하면
HttpEntity(ResponseEntity, 그 HttpEntity는 또 ObjectMapper를 사용해주고. )에다 자동으로 넣어서 사용해준다.
ResponseEntity<>(helloData) 이거와 같다. 근데 상태코드는 이렇게 못 넣으므로 에노테이션이 제공된다.
단, 동적으로 응답코드를 바꿀 순 없으므로, 그러고 싶을 땐 HttpEntity를 사용하면 된다.
@RestController
public class ResponseBodyController {
ObjectMapper objMapper = new ObjectMapper();
@GetMapping("/response-body-string-v1")
public void responseBodyV1(HttpServletResponse response) throws IOException {
response.getWriter().write("ok");
}
@GetMapping("/response-body-string-v2")
public ResponseEntity<String> responseBodyV2(HttpServletResponse response) {
return new ResponseEntity<>("ok", HttpStatus.OK);
}
@GetMapping("/response-body-string-v3")
public String responseBodyV3() {
return "ok";
}
@GetMapping("/response-body-json-v1")
public String responseBodyJsonV1() throws JsonProcessingException {
HelloData helloData = new HelloData();
helloData.setUsername("userA");
helloData.setAge(20);
String jsonBody = objMapper.writeValueAsString(helloData);
return jsonBody;
}
@GetMapping("/response-body-json-v2")
public ResponseEntity<HelloData> responseBodyJsonV2() {
HelloData helloData = new HelloData();
helloData.setUsername("userA");
helloData.setAge(20);
return new ResponseEntity<>(helloData, HttpStatus.OK);
}
@ResponseStatus(HttpStatus.OK)
@GetMapping("/response-body-json-v3")
public HelloData responseBodyJsonV3() {
HelloData helloData = new HelloData();
helloData.setUsername("userA");
helloData.setAge(20);
return helloData;
}
}
@RestController는
@Contoller + @ResponseBody 이다.
그래서 저거 하나만 쓰면 된다.
'스프링 > 3. 스프링 MVC' 카테고리의 다른 글
49. 컨버터가 실행되는 위치, ArgumentResolver (0) | 2023.08.13 |
---|---|
48. HTTP 메시지 컨버터 (0) | 2023.08.13 |
46. 정적 리소스, 뷰 템플릿 (0) | 2023.08.13 |
45. HTTP API JSON (0) | 2023.08.12 |
44. HTTP API (0) | 2023.08.12 |