๐Ÿ“—Spring MVC Study [ HTTP ์‘๋‹ต ]

Caruhยท2025๋…„ 3์›” 24์ผ

Spring MVC

๋ชฉ๋ก ๋ณด๊ธฐ
15/17
post-thumbnail

HTTP ์‘๋‹ต - ์ •์  ๋ฆฌ์†Œ์Šค, ๋ทฐ ํ…œํ”Œ๋ฆฟ

  • ์ •์  ๋ฆฌ์†Œ์Šค
    • ์˜ˆ) ์›น ๋ธŒ๋ผ์šฐ์ €์— ์ •์ ์ธ HTML, css. js๋ฅผ ์ œ๊ณตํ•  ๋•Œ๋Š”, ์ •์  ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉ
  • ๋ทฐ ํ…œํ”Œ๋ฆฟ ์‚ฌ์šฉ
    • ์˜ˆ) ์›น ๋ธŒ๋ผ์šฐ์ €์— ๋™์ ์ธ HTML์„ ์ œ๊ณตํ•  ๋•Œ๋Š” ๋ทฐ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉ
  • HTTP ๋ฉ”์‹œ์ง€ ์‚ฌ์šฉ
    • HTTP API๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” HTML์ด ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ, HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— JSON ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์–ด ๋ณด๋‚ธ๋‹ค.

์ •์  ๋ฆฌ์†Œ์Šค

  • ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ํด๋ž˜์ŠคํŒจ์Šค์˜ ๋‹ค์Œ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” ์ •์  ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • /static, /public, /resource, META-INF/resources
  • src/main/resources๋Š” ๋ฆฌ์†Œ๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ๊ณณ์ด๊ณ , ๋˜ ํด๋ž˜์ŠคํŒจ์Šค์˜ ์‹œ์ž‘ ๊ฒฝ๋กœ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์Œ ๋””๋ ‰ํ† ๋ฆฌ์— ๋ฆฌ์†Œ๋ฅผ ๋„ฃ์–ด๋‘๋ฉด ์Šคํ”„๋ง ๋ถ€ํŠธ๊ฐ€ ์ •์  ๋ฆฌ์†Œ์Šค๋กœ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

์ •์  ๋ฆฌ์†Œ์Šค ๊ฒฝ๋กœ

  • src/main/resources/static ์ด๋‹ค.
  • ๋‹ค์Œ ๊ฒฝ๋กœ์— ํŒŒ์ผ์ด ๋“ค์–ด์žˆ์„ ๊ฒฝ์šฐ
    • src/main/resources/static/basic/hello-form.html
  • ์›น ๋ธŒ๋ผ์ด์ €์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰ํ•˜๋ฉด ๋œ๋‹ค.
    • http://localhost:8000/basic/hello-form.html
  • ์ •์  ๋ฆฌ์†Œ์Šค๋Š” ํ•ด๋‹น ํŒŒ์ผ์„ ๋ณ€๊ฒฝ ์—†์ด ๊ทธ๋Œ€๋กœ ์„œ๋น„์Šคํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋ทฐ ํ…œํ”Œ๋ฆฟ

  • ๋ทฐ ํ…œํ”Œ๋ฆฟ์„ ๊ฑฐ์ณ์„œ HTML์ด ์ƒ์„ฑ๋˜๊ณ , ๋ทฐ๊ฐ€ ์‘๋‹ต์„ ๋งŒ๋“ค์–ด์„œ ์ „๋‹ฌํ•œ๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ HTML์„ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ์šฉ๋„๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ๋‹ค๋ฅธ ๊ฒƒ๋“ค๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ทฐ ํ…œํ”Œ๋ฆฟ์ด ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋ผ๋ฉด ๋ญ๋“ ์ง€ ๊ฐ€๋Šฅ
  • ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ๊ธฐ๋ณธ ๋ทฐ ํ…œํ”Œ๋ฆฟ ๊ฒฝ๋กœ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
    • ๋ทฐ ํ…œํ”Œ๋ฆฟ ๊ฒฝ๋กœ : src/main/resources/templates

๋ทฐ ํ…œํ”Œ๋ฆฟ์„ ํ˜ธ์ถœํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ

 @Controller
 public class ResponseViewController {
    @RequestMapping("/response-view-v1")
 	public ModelAndView responseViewV1() {
 		ModelAndView mav = new ModelAndView("response/hello")
                .addObject("data", "hello!");
 		return mav;
 }
    @RequestMapping("/response-view-v2")
 	public String responseViewV2(Model model) {
        model.addAttribute("data", "hello!!");
 		return "response/hello";
    }
    @RequestMapping("/response/hello")
	public void responseViewV3(Model model) {
        model.addAttribute("data", "hello!!");
    }
}

String์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ - View or HTTP ๋ฉ”์‹œ์ง€

  • @ResponseBody๊ฐ€ ์—†์œผ๋ฉด response/hello๋กœ ๋ทฐ ๋ฆฌ์กธ๋ฒ„๊ฐ€ ์‹คํ–‰๋˜์–ด์„œ ๋ทฐ๋ฅผ ์ฐพ๊ณ , ๋ Œ๋”๋ง ํ•œ๋‹ค.
  • @ResponseBody๊ฐ€ ์žˆ์œผ๋ฉด ๋ทฐ ๋ฆฌ์กธ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ , HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ์ง์ ‘ response/hello๋ผ๋Š” ๋ฌธ์ž๊ฐ€ ์ž…๋ ฅ๋œ๋‹ค.

  • ์—ฌ๊ธฐ์„œ๋Š” ๋ทฐ์˜ ๋…ผ๋ฆฌ ์ด๋ฆ„์ธ response/hello๋ฅผ ๋ฐ˜ํ˜ธ๋‚˜ํ•˜๋ฉด ๋‹ค์Œ ๊ฒฝ๋กœ์˜ ๋ทฐ ํ…œํ”Œ๋ฆฟ์ด ๋ Œ๋”๋ง ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์‹คํ–‰ : templates/response/hello.html

Void๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ

  • @Controller๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , HttpServletResponse, OutputStream(Writer)๊ฐ™์€ HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํŒŒ๋ฆฌ๋ฏธํ„ฐ๊ฐ€ ์—†์œผ๋ฉด ์š”์ฒญ URL์„ ์ฐธ๊ณ ํ•ด์„œ ๋…ผ๋ฆฌ ๋ทฐ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉ
    • ์š”์ฒญ URL : /response/hello
    • ์‹คํ–‰ : templates/response/hello.html
  • ์ฐธ๊ณ ๋กค ์ด ๋ฐฉ์‹์€ ๋ช…์‹œ์„ฑ์ด ๋„ˆ๋ฌด ๋–จ์–ด์ง€๊ณ  ์ด๋ ‡๊ฒŒ ๋”ฑ ๋งž๋Š” ๊ฒฝ์šฐ๋„ ๋งŽ์ด ์—†์–ด์„œ, ๊ถŒ์žฅ X

HTTP ๋ฉ”์‹œ์ง€

  • @ResponseBody, HttpEntity๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ๋ทฐ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ์ง์ ‘ ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

HTTP ์‘๋‹ต HTTP API, ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ์ง์ ‘ ์ž…๋ ฅ

  • HTTP API๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” HTML์ด ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ, HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— JSON ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์–ด ๋ณด๋‚ธ๋‹ค.

    ์ฐธ๊ณ 

    • HTML์ด๋‚˜ ๋ทฐ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•ด๋„ HTTP ์‘๋‹ต ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— HTML ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ด๊ฒจ์„œ ์ „๋‹ฌ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ ์„ค๋ช…ํ•˜๋Š” ๋‚ด์šฉ์€ ์ •์  ๋ฆฌ์†Œ์Šค๋‚˜ ๋ทฐ ํ…œํ”Œ๋ฆฟ์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ , ์ง์ ‘ HTTP ์‘๋‹ต ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค.

@ResController

  • @Controller ๋Œ€์‹ ์— @ResController ์• ๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด, ํ•ด๋‹น ์ปจํŠธ๋กค๋Ÿฌ์— ๋ชจ๋‘ @ResponseBody๊ฐ€ ์ ์šฉ๋˜๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ทฐ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•œ๋‹ค. ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ Rest API(HTTP API)๋ฅผ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ์ด๋‹ค.
  • @ResponseBody๋Š” ํด๋ž˜์Šค ๋ ˆ๋ฒจ์— ๋‘๋ฉด ์ „์ฒด ๋ฉ”์„œ๋“œ์— ์ ์šฉ๋œ๋‹ค.
  • @RestController ์• ๋…ธํ…Œ์ด์…˜ ์•ˆ์— @ResponseBody๊ฐ€ ์ ์šฉ๋˜์–ด ์žˆ๋‹ค.

๐Ÿ“ญ Reference

profile
Backend Developer

0๊ฐœ์˜ ๋Œ“๊ธ€