์คํ๋ง(์๋ฒ)์์ ์๋ต ๋ฐ์ดํฐ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ํฌ๊ฒ 3๊ฐ์ง๊ฐ ์๋ค.
- ์ ์ ๋ฆฌ์์ค
์น ๋ธ๋ผ์ฐ์ ์ ์ ์ ์ธ HTML, CSS, JS๋ฅผ ์ ๊ณตํ ๋ ์ ์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๋ค. - ๋ทฐ ํ
ํ๋ฆฟ ์ฌ์ฉ
์น ๋ธ๋ผ์ฐ์ ์ ๋์ ์ธ HTML์ ์ ๊ณตํ ๋ ๋ทฐ ํ ํ๋ฆฟ์ ์ฌ์ฉํ๋ค. - HTTP ๋ฉ์์ง ์ฌ์ฉ
HTTP API๋ฅผ ์ ๊ณตํ๋ ๊ฒฝ์ฐ์๋ HTML์ด ์๋๋ผ HTTP ๋ฉ์์ง ๋ฐ๋์ JSON ๊ฐ์ ํ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ค.
ํ๋์ฉ ์์ธํ ์์๋ณด์.
1. ์ ์ ๋ฆฌ์์ค ๐ฅช
์ ์ ๋ฆฌ์์ค๋ ํด๋น ํ์ผ์ ๋ณ๊ฒฝ ์์ด ๊ทธ๋๋ก ์๋น์คํ๋ ๊ฒ์ ๋งํ๋ค. ์คํ๋ง ๋ถํธ๋ ํด๋์คํจ์ค์ ์๋์ ๋๋ ํ ๋ฆฌ์ ์๋ ์ ์ ๋ฆฌ์์ค๋ฅผ ์ ๊ณตํ๋ค.
/static
/public
/resources
/META-INF/resources
src/main/resources๊ฐ ํด๋์คํจ์ค์ ์์ ๊ฒฝ๋ก์ด์ ๋ฆฌ์์ค๋ฅผ ๋ณด๊ดํ๋ ๊ณณ์ด๋ค. ๊ทธ๋์ src/main/resources/static ๋๋ ํ ๋ฆฌ์ ๋ฆฌ์์ค๋ฅผ ๋ฃ์ด๋๋ฉด ์คํ๋ง ๋ถํธ๊ฐ ์ ์ ๋ฆฌ์์ค๋ก ์๋น์ค๋ฅผ ์ ๊ณตํ๋ค.
์๋ฅผ ๋ค์ด src/main/resources/static/basic/hello-form.html์ด ์๋ค๊ณ ํ๋ฉด ์น ๋ธ๋ผ์ฐ์ ์์ http://localhost:8080/basic/hello-form.html๋ก ์ ๊ทผํ ์ ์๋ค.
2. ๋ทฐ ํ ํ๋ฆฟ ๐ฎ
๋ทฐ ํ ํ๋ฆฟ์ ๊ฑฐ์ณ์ HTML์ด ์์ฑ๋๊ณ , ๋ทฐ๊ฐ ์๋ต์ ๋ง๋ค์ด์ ์ ๋ฌํ๋ค. ์ผ๋ฐ์ ์ผ๋ก HTML์ ๋์ ์ผ๋ก ์์ฑํ๋ ์ฉ๋๋ก ์ฌ์ฉ๋๋ค.
์คํ๋ง ๋ถํธ์ ๊ธฐ๋ณธ ๋ทฐ ํ ํ๋ฆฟ ๊ฒฝ๋ก๋ src/main/resources/templates์ด๋ค. ๊ทธ๋์ src/main/resources/templates/response/hello.html์ด ์๋ค๊ณ ํ๋ค๋ฉด ์๋์ ๊ฐ์ด ์๋ต์ ํ ์ ์๋ค.
V1. ModelAndView
@RequestMapping("/response-view-v1")
public ModelAndView responseViewV1() {
ModelAndView mav = new ModelAndView("response/hello").addObject("name", "amenable");
return mav;
}
V2. Model
@RequestMapping("/response-view-v2")
public String responseViewV2(Model model) {
model.addAttribute("name", "amenable");
return "response/hello";
}
V1(ModelAndView)๊ณผ V2(Model) ๋ฐฉ์์ ๊ฒฝ์ฐ response/hello๋ฅผ ์ด์ฉํ์ฌ ๋ทฐ ๋ฆฌ์กธ๋ฒ๊ฐ ์คํ๋์ด์ ๋ทฐ๋ฅผ ์ฐพ๊ณ ๋ ๋๋ง ํ๋ค. (๋ง์ฝ @ResponseBody๊ฐ ์๋ค๋ฉด ๋ทฐ ๋ฆฌ์กธ๋ฒ๋ฅผ ์คํํ์ง ์๊ณ , HTTP ๋ฉ์์ง ๋ฐ๋์ ์ง์ response/hello๋ผ๋ ๋ฌธ์๊ฐ ์ ๋ ฅ๋๊ฒ ๋๋ค.)
V3. Model + Void๋ฐํ
@RequestMapping("/response/hello")
public void responseViewV3(Model model){
model.addAttribute("name", "amenable");
}
void๋ฅผ ๋ฐํํ๊ฒ ๋๋ฉด ์์ฒญ URL์ ์ฐธ๊ณ ํด์ ๋ ผ๋ฆฌ ๋ทฐ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ๋ค. ์ฌ๊ธฐ์๋ ์์ฒญ URL์ด /response/hello์ด๋ฏ๋ก ์ด๋ฅผ ์ฐธ๊ณ ํ์ฌ templates/response/hello.html์ด ์คํ๋๋ค.
์ด ๋ฐฉ์์ ๋ช ์์ฑ์ด ๋๋ฌด ๋จ์ด์ง๋ฏ๋ก ๊ถ์ฅํ์ง๋ ์๋๋ค.
3. HTTP ๋ฉ์์ง - ๋จ์ ํ ์คํธ ๐ฅ
V1. HttpServletResponse
@GetMapping("/response-body-string-v1")
public void responseBodyV1(HttpServletResponse response) throws IOException {
response.getWriter().write("ok");
}
V2. ResponseEntity
@GetMapping("/response-body-string-v2")
public ResponseEntity<String> responseBodyV2() {
return new ResponseEntity<>("ok", HttpStatus.OK);
}
V3. @ResponseBody
@ResponseBody
@GetMapping("/response-body-string-v3")
public String responseBodyV3() {
return "ok";
}
@ResponseBody ๋๋ HttpEntity๋ฅผ ์ฌ์ฉํ๋ฉด ๋ทฐ ํ ํ๋ฆฟ์ ์คํํ์ง ์๊ณ HTTP ๋ฉ์์ง ๋ฐ๋์ ์ง์ ์๋ต ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ ์ ์๋ค. (V2, V3 ์ฝ๋ ์ฐธ๊ณ )(ResponseEntity๋ HttpEntity๋ฅผ ์์๋ฐ์ ๊ฒ์ด๋ค.)
4. HTTP ๋ฉ์์ง - JSON ๐ฏ
V1. ResponseEntity
@GetMapping("/response-body-json-v1")
public ResponseEntity<Person> responseBodyJsonV1() {
Person person = new Person();
person.setName("amenable");
person.setAge(20);
return new ResponseEntity<>(person, HttpStatus.OK);
}
ResponseEntity๋ฅผ ๋ฐํํ๋ฉด HTTP ๋ฉ์์ง ์ปจ๋ฒํฐ๋ฅผ ํตํด์ JSON ํ์์ผ๋ก ๋ณํ๋์ด์ ๋ฐํ๋๋ค.
V2. @ResponseBody
@ResponseStatus(HttpStatus.OK)
@ResponseBody
@GetMapping("/response-body-json-v2")
public Person responseBodyJsonV2(){
Person person = new Person();
person.setName("amenable");
person.setAge(20);
return person;
}
@ResponseBody๋ฅผ ์ฌ์ฉํ ๊ฒ์ธ๋ฐ, ์ด๋ ๊ฒ ์ฌ์ฉํ๋ฉด ์๋ต ์ฝ๋์ ๊ฐ์ ๊ฒ๋ค์ ์ค์ ํ๊ธฐ ์ด๋ ต๋ค๋ ๋ฌธ์ ๊ฐ ์๋ค. ๊ทธ๋์ ํ๋ก๊ทธ๋จ ์กฐ๊ฑด์ ๋ฐ๋ผ์ ๋์ ์ผ๋ก ์๋ต ์ฝ๋ ๋ฑ์ ๋ณ๊ฒฝํ๋ ค๋ฉด V1๊ณผ ๊ฐ์ด ResponseEntity๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
+α. @RestController
@RestController
public class ResponseViewController {
@GetMapping("/response-body")
public String responseBodyByRestController() {
return "ok";
}
}
@Controller ๋์ ์ @RestController๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋น ์ปจํธ๋กค๋ฌ์ ๋ชจ๋ @ResponseBody๊ฐ ์ ์ฉ๋๋ค. (@RestController ์์ @ResponseBody๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.) ์ด๋ ๊ฒ ํ๋ฉด ๋ทฐ ํ ํ๋ฆฟ์ ์ฌ์ฉํ๋ ๊ฒ ์๋๋ผ HTTP ๋ฉ์์ง ๋ฐ๋์ ์ง์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ๊ฒ ๋๋ค.
ํด๋น ๊ธ์ ๊น์ํ ๋์ '์คํ๋ง MVC 1ํธ - ๋ฐฑ์๋ ์น ํต์ฌ ๊ธฐ์ '์ ์ฐธ๊ณ ํ์์ต๋๋ค.
'๐ ์คํ๋ง > ๊ธฐ๋ณธ ๊ฐ๋ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์๋ธ๋ฆฟ ํํฐ(Servlet Filter) (0) | 2023.04.29 |
---|---|
๋ฉ์์ง & ๊ตญ์ ํ (Message & Internationalization) (0) | 2023.04.25 |
HTTP ์์ฒญ(ํค๋, ํ๋ผ๋ฏธํฐ, ๋ฉ์์ง) ์ฒ๋ฆฌ (0) | 2023.04.20 |
์คํ๋ง MVC (0) | 2023.04.19 |
์์กด์ฑ ์ฃผ์ - DI(Dependency Injection) (0) | 2023.04.18 |