10. Response

์Šคํ”„๋ง์—์„œ ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ด๋ณด์ž.

1๏ธโƒฃ ย  ์Šคํ”„๋ง์ด ์‘๋‹ต๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

  • ์Šคํ”„๋ง(์„œ๋ฒ„)์—์„œ ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ 3๊ฐ€์ง€์ด๋‹ค.
์‘๋‹ต ๋ฐฉ์‹์ƒ์„ธ์‘๋‹ต ๋ฉ”์„œ๋“œ
์ •์  ๋ฆฌ์†Œ์Šค์›น ๋ธŒ๋ผ์šฐ์ €์— ์ •์ ์ธ HTML, CSS, js ๋ฅผ ๊ทธ๋Œ€๋กœ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ์„œ๋ฒ„์—์„œ ํ•ด๋‹น ํŒŒ์ผ์„ ๊ทธ๋Œ€๋กœ ์„œ๋น™ํ•œ๋‹ค.
๋ทฐ ํ…œํ”Œ๋ฆฟJSP๋‚˜ ThymeLeaf ๊ฐ™์€ ๋ทฐ ํ…œํ”Œ๋ฆฟ์„ ๊ฑฐ์ณ์„œ HTML ์„ ์ƒ์„ฑํ•˜๊ณ , ๋ทฐ๊ฐ€ ์‘๋‹ต์„ ๋งŒ๋“ค์–ด์„œ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ์ปจํŠธ๋กค๋Ÿฌ์—์„œ Model ๊ฐ์ฒด์˜ addArtribute ๋ฉ”์†Œ๋“œ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์•„ ๋ทฐ ํ…œํ”Œ๋ฆฟ์— ์ „์†กํ•œ๋‹ค.
HTTP APIHTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๋„ฃ์–ด์„œ ์‘๋‹ตํ•˜๋Š” ๊ฒฝ์šฐResponseEntityยซT>T>, @ResponseBody

2๏ธโƒฃ ย  ๋ทฐ ํ…œํ”Œ๋ฆฟ

  • ์˜ˆ์‹œ๋กœ hello.html ์— ์‘๋‹ต์„ ๋„ฃ์–ด ์ „์†กํ•ด๋ณด์ž.

  • hello.html (ํŒŒ์ผ ๊ฒฝ๋กœ : resources/templates/response/hello.html)

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
  <head>
    <meta charset="UTF-8" />
    <title>Title</title>
  </head>
  <body>
    <p th:text="${data}">empty</p>
  </body>
</html>
  • ${data} ์— ์‘๋‹ต ๋‚ด์šฉ์ด ๋“ค์–ด๊ฐ€๋„๋ก model.addAttribute ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค.
@Controller
public class ResponseViewController {

    @RequestMapping("/response-view-v1")
    public String responseViewV2(Model model) {
        model.addAttribute("data", "hello");
        return "response/hello";
    }

}

3๏ธโƒฃ ย  HTTP API - ResponseEntityยซT>T>

  • ๋ฐ˜ํ™˜ํƒ€์ž…์„ ์ œ๋„ค๋ฆญ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ณ , HTTP ์ƒํƒœ์ฝ”๋“œ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
@Controller
public class ResponseBodyController {

    @GetMapping("/response-body-string-v2")
    public ResponseEntity<String> responserBodyV2() {
        return new ResponseEntity<>("ok", HttpStatus.OK);
    }

    @GetMapping("/response-body-json-v1")
    public ResponseEntity<HelloData> responseBodyJsonV1() {
        HelloData helloData = new HelloData();
        helloData.setUsername("hello");
        helloData.setAge(20);
        return new ResponseEntity<>(helloData, HttpStatus.OK);
    }

}

4๏ธโƒฃ ย  HTTP API - @ResponseBody

  • ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ฆฌํ„ดํ•˜๋Š” ๊ฐ’์„ ๊ทธ๋Œ€๋กœ HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ๋„ฃ์–ด ์ „์†กํ•œ๋‹ค.

  • ResponseEntity ์™€ ๋‹ฌ๋ฆฌ ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์—†๋‹ค. @ResponseStatus ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค.

@Controller
public class ResponseBodyController {

    @ResponseBody
    @GetMapping("/response-body-string-v3")
    public String responseBodyV3() {
        return "ok";
    }

    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    @GetMapping("/response-body-json-v2")
    public HelloData responseBodyJsonV2() {
        HelloData helloData = new HelloData();
        helloData.setUsername("hello");
        helloData.setAge(20);
        return helloData;
    }

}