๐ŸŒ Backend/๐Ÿƒ Spring

4. Spring Web ๊ฐœ๋ฐœ ๊ธฐ์ดˆ ๊ฐœ๋…

DevPoong 2022. 7. 1. 23:47

2022-05-28

1. Spring web ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ• ์ข…๋ฅ˜

  • (1) ์ •์  ์ปจํ…์ธ 
  • (2) MVC์™€ ํ…œํ”Œ๋ฆฟ ์—”์ง„
  • (3) API

2. ์ •์  ํŽ˜์ด์ง€์™€ ๋™์  ํŽ˜์ด์ง€์˜ ์ฐจ์ด

- ์ •์  ํŽ˜์ด์ง€: ์›น ์„œ๋ฒ„์— ์ด๋ฏธ ์ €์žฅ๋œ html๋ฌธ์„œ๋ฅผ client์—๊ฒŒ ์ „์†กํ•˜๋Š” ์›น ํŽ˜์ด์ง€

  • ์žฅ์ : (1)์š”์ฒญ์— ๋Œ€ํ•œ ํŒŒ์ผ๋งŒ ์ „์†กํ•˜๋ฉด ๋˜๋ฏ€๋กœ ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค., (2)๋‹ค๋ฅธ๊ฑฐ ์—†์ด ์›น์„œ๋ฒ„๋งŒ ๊ตฌ์ถ•ํ•˜๋ฉด ๋˜๋ฏ€๋กœ ๋น„์šฉ์ด ์ ๊ฒŒ ๋“ ๋‹ค.
  • ๋‹จ์ : (1)์ €์žฅ๋œ ์ •๋ณด๋งŒ ๋ณด์—ฌ์ฃผ๋ฏ€๋กœ ์„œ๋น„์Šค๊ฐ€ ํ•œ์ •์ ์ด๋‹ค., (2)์ƒ์„ฑ, ์ˆ˜์ •, ์‚ญ์ œ์˜ ์ž‘์—…์ด ๋ชจ๋‘ ์ˆ˜๋™์ด๋ฏ€๋กœ ๊ด€๋ฆฌ๊ฐ€ ํž˜๋“ค๋‹ค.

- ๋™์  ํŽ˜์ด์ง€: ์š”์ฒญ ์ •๋ณด๋ฅผ ๊ฐ€๊ณต์ฒ˜๋ฆฌํ•œ ํ›„์— html ๋ฌธ์„œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ client์—๊ฒŒ ์ „์†กํ•˜๋Š” ์›น ํŽ˜์ด์ง€

  • ์žฅ์ : (1)๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ์ด์šฉํ•˜์—ฌ ๋™์  ์ƒ์„ฑํ•˜์—ฌ ์ œ๊ณตํ•˜๋ฏ€๋กœ ์„œ๋น„์Šค๊ฐ€ ๋‹ค์–‘ํ•ด์ง„๋‹ค., (2)์›น ์‚ฌ์ดํŠธ ๊ตฌ์กฐ์— ๋”ฐ๋ผ ์ƒ์„ฑ, ์ˆ˜์ •, ์‚ญ์ œ ๋“ฑ์˜ ์ž‘์—…์ด ์šฉ์ดํ•˜๋‹ค.
  • ๋‹จ์ : ๊ฐ€๊ณต์ฒ˜๋ฆฌ ๊ณผ์ • ๋•Œ๋ฌธ์— ์ƒ๋Œ€์ ์œผ๋กœ ๋Š๋ฆฌ๋‹ค., ์›น ์„œ๋ฒ„ ์ด์™ธ์— ์ถ”๊ฐ€์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ WAS(Web Application Server)๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

3. ์ •์  ํŽ˜์ด์ง€

  • https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/html/spring-boot-features.html#boot-features-spring-mvc-static-content
  • ์•ž ๊ฒŒ์‹œ๋ฌผ์—์„œ ํ–ˆ๋˜ ๊ฒƒ๊ณผ ๊ฐ™์ด resources/static ํด๋”์— hello.html ์ •์  ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋งคํ•‘๋˜์–ด http://localhost:8080/hello.html๋กœ ์ด๋™ํ•˜๋ฉด ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Œ.
  • ๊ฐ„๋žตํ•œ ๋™์ž‘๊ณผ์ •: http://localhost:8080/hello.html ์š”์ฒญ์ด ์˜ค๋ฉด ๋‚ด์žฅ ํ†ฐ์บฃ ์„œ๋ฒ„๊ฐ€ spring์—๊ฒŒ ๋„˜๊ธฐ๋Š”๋ฐ spring์€ ์šฐ์„  ์ปจํŠธ๋กค๋Ÿฌ์—์„œ hello๊ด€๋ จ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ  ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด resources: static/hello.html ์„ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.
    (์ค‘๊ฐ„์— ๋” ๋งŽ์€ ๊ณผ์ •์ด ์žˆ์ง€๋งŒ ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…ํ•œ ๊ฒƒ์ž„.)

4. MVC์™€ ํ…œํ”Œ๋ฆฟ ์—”์ง„

  • ๊ณผ๊ฑฐ์— ๋งŽ์ด ์“ฐ๋˜ JSP์™€ PHP ๊ฐ™์€๊ฒŒ ๋™์  ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํ…œํ”Œ๋ฆฟ ์—”์ง„์ด๋‹ค.
  • ๋™์  ํŽ˜์ด์ง€ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด์„œ Model, View, Controller๊ฐ€ ํ•„์š”
  • ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ์ด์šฉํ•˜์—ฌ View๋ฅผ Controller๋กœ ์กฐ์ž‘ํ•˜์—ฌ ๋™์  ํŽ˜์ด์ง€๋กœ ๋™์ž‘ํ•˜๋„๋ก ํ•ด์คŒ.

๊ณผ๊ฑฐ jsp์—์„œ๋Š” view์™€ controller๊ฐ€ ๋ถ„๋ฆฌ๋˜์ง€ ์•Š๊ณ  view์—์„œ ๋ชจ๋“  ๊ฒƒ์„ ํ•œ ๊ณณ์—์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋Š” Model1 ๋ฐฉ์‹์„ ๋งŽ์ด ์‚ฌ์šฉํ–ˆ์—ˆ๋Š”๋ฐ ํ˜„์žฌ๋Š” MVCํŒจํ„ด์„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค!

  • View๋Š” ๊ทธ์ € ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š”๋ฐ ๋ชจ๋“  ์˜ํ–ฅ์„ ์ง‘์ค‘ํ•ด์•ผ ํ•จ.
  • Controller Business Logic๊ณผ ๊ด€๋ จ๋˜๊ฑฐ๋‚˜ ์–ด๋–ค ๋‚ด๋ถ€์ ์ธ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ์ง‘์ค‘ํ•ด์•ผ ํ•จ
  • Model์€ ํ™”๋ฉด์—์„œ ํ•„์š”ํ•œ ๊ด€๋ จ๋œ ๊ฒƒ๋“ค์„ ๋‹ด์•„์„œ ์ „๋‹ฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉ

๋”ฐ๋ผ์„œ ๋ถ„๋ฆฌํ•ด์•ผ ํ•จ!

HelloController.java

@GetMapping("hello-mvc")
    public String helloMvc(@RequestParam("name") String name, Model model){
        model.addAttribute("name", name);
        return "hello-template";
    }


resources/templates/hello-template.html

<html xmlns:th="http://www.thymeleaf.org">
    <body>
        <p th:text="'hello ' + ${name}">hello! empty</p>
    </body>
</html>
pํƒœ๊ทธ ์•ˆ์˜ <th:text="'hello ' + ${name}">hello! empty ๋Š” {name}๊ฐ’์ด ์„œ๋ฒ„์—์„œ ๋„˜์–ด์˜ค๋ฉด hello! empty๋ผ๋Š” default๊ฐ’์ด ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ๋Œ€์ฒด๋จ

http://localhost:8080/hello-mvc?name=spring์™€ ๊ฐ™์ด ๋’ค์— param์„ ๊ฐ™์ด ๋„˜๊ฒจ์ฃผ๋ฉด controller์—์„œ Model์— ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ํ™”๋ฉด์—์„œ View์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ.

๊ฐ•์˜ ์ค‘ ๊ฟ€ํŒ: intellij์—์„œ ctrl + p ๋ˆ„๋ฅด๋ฉด parameter ์ •๋ณด ์–ป์„ ์ˆ˜ ์žˆ์Œ.


5. API(Application Programming Interface)

  • React, Vue ๊ฐ™์€ frontend framework ์“ธ ๋•Œ๋„ api๋กœ ๋ฐ์ดํ„ฐ๋งŒ ๋‚ด๋ ค์ฃผ๋ฉด ํ™”๋ฉด์€ client๊ฐ€ ์•Œ์•„์„œ ๊ทธ๋ฆด ๋•Œ ์‚ฌ์šฉ
  • ์„œ๋ฒ„๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ ํ†ต์‹ ํ•  ๋•Œ ์‚ฌ์šฉ
//Controllerํด๋ž˜์Šค ๋‚ด๋ถ€

    @GetMapping("hello-api")
    @ResponseBody
    public Hello helloApi(@RequestParam("name") String name){
        Hello hello = new Hello();
        hello.setName(name);
        return hello;
    }
  • @ResponseBody
    • HTTP ํ†ต์‹  ๋‚ด์—์„œ Header์™€ Body์ค‘์—์„œ Body์— return ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๋„ฃ์–ด์ฃผ๊ฒ ๋‹ค!
      • viewResolver ๋Œ€์‹ ์— HttpMessageConverter๊ฐ€ ๋™์ž‘
      • ๊ธฐ๋ณธ ๋ฌธ์ž์ฒ˜๋ฆฌ๋Š” StringHttpMessageConverter
      • ๊ธฐ๋ณธ ๊ฐ์ฒด์ฒ˜๋ฆฌ๋Š” MappingJackson2HttpMessageConverter

๊ฐ์ฒด๋ฅผ json์œผ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘ ํ•˜๋‚˜๊ฐ€ Jackson!(Spring์˜ Default)

์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํ™•์ธํ•ด๋ณด๋ฉด

์™€ ๊ฐ™์ด Spring์˜ default ํ˜•์‹์œผ๋กœ json ํ˜•์‹์œผ๋กœ ๋‚˜์˜ค๊ฒŒ ๋จ.

XML์€ ์—ด๊ณ  ๋‹ซ๋Š” ํƒœ๊ทธ๋ฅผ ์จ์•ผํ•ด์„œ ๋ถˆํŽธํ•œ๋ฐ JSON์€ key valueํ˜•์‹์œผ๋กœ ๊ฐ„๋‹จํ•ด์„œ ํŽธํ•œ ๊ฒƒ ๊ฐ™๋‹ค!

๋™์ž‘์›๋ฆฌ

http api์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด
๋‚ด์žฅ ํ†ฐ์บฃ ์„œ๋ฒ„๊ฐ€ ์Šคํ”„๋ง์—๊ฒŒ ์•Œ๋ ค์ฃผ๊ณ  ํ•ด๋‹น api ๊ด€๋ จ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š”๋ฐ ๊ทธ ๋ฉ”์„œ๋“œ์— @ResponseBody๊ฐ€ ๋ถ™์–ด์žˆ๋‹ค๋ฉด HTTP ์‘๋‹ต์œผ๋กœ ์ „ํ•ด์ฃผ๋Š”๋ฐ ์ด ๊ณผ์ •์—์„œ HttpMessageConverter๊ฐ€ ๋™์ž‘ํ•˜์—ฌ ๋ฉ”์„œ๋“œ๊ฐ€ ๋‹จ์ˆœํžˆ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋ฉด StringConverter๊ฐ€ ๋™์ž‘ํ•˜์—ฌ ๋ฌธ์ž์—ด๋กœ, ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค๋ฉด JsonConverter๊ฐ€ ๋™์ž‘ํ•˜์—ฌ json ํ˜•ํƒœ๋กœ ๊ฐ์ฒด๋ฅผ ์š”์ฒญํ•œ ์„œ๋ฒ„๋‚˜ ํด๋ผ์ด์–ธํŠธ๋กœ ์‘๋‹ตํ•œ๋‹ค.