Amenable
Amenable's Blog
Amenable
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (189)
    • ๐Ÿ“‚ JAVA (87)
      • ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ” (65)
      • ์ฃผ์š” ๊ฐœ๋… (22)
    • ๐Ÿ“‚ ๊ฐœ๋ฐœ ์„œ์  (22)
      • ์‹ค์šฉ์ฃผ์˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ (1)
      • ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด (2)
      • ํด๋ฆฐ ์ฝ”๋“œ (8)
      • ํ•จ๊ป˜ ์ž๋ผ๊ธฐ (1)
      • ๊ทธ๋ฆผ์œผ๋กœ ๋ฐฐ์šฐ๋Š” HTTP&Network Basic (10)
    • ๐Ÿ“‚ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (8)
      • ๊ฐœ๋… (8)
      • ๋ฌธ์ œํ’€์ด (0)
    • ๐Ÿ“‚ ๋„คํŠธ์›Œํฌ (14)
      • ๊ฐœ๋… (6)
      • ์„ฑ๊ณต๊ณผ ์‹คํŒจ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” 1%์˜ ๋„คํŠธ์›Œํฌ ์›๋ฆฌ (8)
    • ๐Ÿ“‚ ์Šคํ”„๋ง (13)
      • ๊ธฐ๋ณธ ๊ฐœ๋… (13)
    • ๐Ÿ“‚ WEB (5)
    • ๐Ÿ“‚ ์ž๋ฃŒ๊ตฌ์กฐ (12)
      • ๊ฐœ๋… (2)
      • ์ •๋ ฌ (8)
      • ํŠธ๋ฆฌ (2)
    • ๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (10)
      • ์ตœ์†Œ์‹ ์žฅํŠธ๋ฆฌ (2)
      • ์ตœ๋‹จ ๊ฒฝ๋กœ (2)
      • ๋ฌธ์ž์—ด (2)
      • ETC (4)
    • ๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜_๋ฌธ์ œํ’€์ด (4)
      • BOJ_๋ฐฑ์ค€ (4)
    • ๐Ÿ“‚ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (3)
    • ๐Ÿ“‚ DevOps (2)
      • ๋ฐฐํฌ (2)
    • ๐Ÿ“‚ ํ›„๊ธฐ (8)
      • ์šฐ์•„ํ•œ ํ…Œํฌ์ฝ”์Šค(ํ”„๋ฆฌ์ฝ”์Šค) (4)
      • 2023๋…„ (3)
      • 2024๋…„ (1)
    • ๐Ÿ“‚ ํšŒ๊ณ  (1)
      • 2023๋…„ (1)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ๐Ÿš€ GitHub

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
Amenable

Amenable's Blog

HTTP ์‘๋‹ต(์ •์  ๋ฆฌ์†Œ์Šค, ๋ทฐ ํ…œํ”Œ๋ฆฟ, HTTP ๋ฉ”์‹œ์ง€) ์ฒ˜๋ฆฌ
๐Ÿ“‚ ์Šคํ”„๋ง/๊ธฐ๋ณธ ๊ฐœ๋…

HTTP ์‘๋‹ต(์ •์  ๋ฆฌ์†Œ์Šค, ๋ทฐ ํ…œํ”Œ๋ฆฟ, HTTP ๋ฉ”์‹œ์ง€) ์ฒ˜๋ฆฌ

2023. 4. 21. 00:21

  ์Šคํ”„๋ง(์„œ๋ฒ„)์—์„œ ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  1. ์ •์  ๋ฆฌ์†Œ์Šค
    ์›น ๋ธŒ๋ผ์šฐ์ €์— ์ •์ ์ธ HTML, CSS, JS๋ฅผ ์ œ๊ณตํ•  ๋•Œ ์ •์  ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  2. ๋ทฐ ํ…œํ”Œ๋ฆฟ ์‚ฌ์šฉ
    ์›น ๋ธŒ๋ผ์šฐ์ €์— ๋™์ ์ธ HTML์„ ์ œ๊ณตํ•  ๋•Œ ๋ทฐ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•œ๋‹ค.
  3. 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
    '๐Ÿ“‚ ์Šคํ”„๋ง/๊ธฐ๋ณธ ๊ฐœ๋…' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ(Servlet Filter)
    • ๋ฉ”์‹œ์ง€ & ๊ตญ์ œํ™” (Message & Internationalization)
    • HTTP ์š”์ฒญ(ํ—ค๋”, ํŒŒ๋ผ๋ฏธํ„ฐ, ๋ฉ”์‹œ์ง€) ์ฒ˜๋ฆฌ
    • ์Šคํ”„๋ง MVC
    Amenable
    Amenable
    CS, ์ž๋ฐ”, ์ž๋ฃŒ๊ตฌ์กฐ, ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์Šคํ”„๋ง, ์Šคํ”„๋ง ๋ถ€ํŠธ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐœ๋ฐœ์— ๊ด€ํ•œ ๋‚ด์šฉ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”