Bibi's DevLog ๐Ÿค“๐ŸŽ

[Spring] ์ธํ”„๋Ÿฐ ์Šคํ”„๋ง ์ž…๋ฌธ(๊น€์˜ํ•œ ๋‹˜) - ๋นŒ๋“œ ๋ฐ ์‹คํ–‰, ์ •์  ์ปจํ…์ธ /MVC์™€ ํ…œํ”Œ๋ฆฟ์—”์ง„/API ๋ณธ๋ฌธ

๐Ÿ–ฅ BE ๋ฐฑ์—”๋“œ/Spring ์Šคํ”„๋ง

[Spring] ์ธํ”„๋Ÿฐ ์Šคํ”„๋ง ์ž…๋ฌธ(๊น€์˜ํ•œ ๋‹˜) - ๋นŒ๋“œ ๋ฐ ์‹คํ–‰, ์ •์  ์ปจํ…์ธ /MVC์™€ ํ…œํ”Œ๋ฆฟ์—”์ง„/API

๋น„๋น„ bibi 2021. 3. 4. 00:53

์ด ๊ธ€์€ ์ธํ”„๋Ÿฐ ๊น€์˜ํ•œ ๋‹˜์˜ ์Šคํ”„๋ง ์ž…๋ฌธ ๊ฐ•์˜ ๋ฅผ ๋“ฃ๊ณ  ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

(์ด์–ด์„œ)

๋นŒ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ

๋งŒ๋“  ํŒŒ์ผ์„ ์ธํ…”๋ฆฌJํ™˜๊ฒฝ์ด ์•„๋‹Œ cmd ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•ด ๋ณธ๋‹ค.

์„œ๋ฒ„์—์„œ ๋นŒ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์— ํ•ด๋‹นํ•œ๋‹ค (cmd๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ) - ์‹ค๋ฌด์—์„œ ๊ฐœ๋ฐœํ•  ๋•Œ๋Š” cmd๋งŒ์œผ๋กœ ๋นŒ๋“œ๋ฅผ ํ•ด์•ผ ํ•  ๋•Œ๋„ ๋งŽ๋‹ค.

(์œˆ๋„์šฐ ๊ธฐ์ค€)

  1. ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ๋ฅผ ์—ด๊ณ  cd ๋””๋ ‰ํ† ๋ฆฌ๋ช…์„ ํ†ตํ•ด ์Šคํ”„๋ง ํŒŒ์ผ์ด ์žˆ๋Š” ์œ„์น˜๋กœ ์ด๋™ํ•œ๋‹ค.

    cd ๋””๋ ‰ํ† ๋ฆฌ๋ช… : ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™

    dir : =ls. ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋‚ด์šฉ์„ ๋ณด์—ฌ ์คŒ

  2. dir๋กœ ํ™•์ธํ–ˆ์„ ๋•Œ gradlewํŒŒ์ผ์ด ๋ณด์ด๋ฉด, gradlew build ๋ช…๋ น์–ด๋กœ ๊ทธ๋ž˜๋“ค์„ ์‹คํ–‰ํ•œ๋‹ค.

    ์ž ์‹œ ๊ธฐ๋‹ค๋ฆฌ๋ฉด ํ•„์š”ํ•œ ํŒŒ์ผ๋“ค์„ ์„ค์น˜ํ•˜๊ณ  ๋นŒ๋“œ๊ฐ€ ์™„๋ฃŒ๋œ๋‹ค.

    BUILD SUCCESSFUL ์ด ๋‚˜์˜ค๋ฉด ๋นŒ๋“œ๊ฐ€ ์ž˜ ๋œ ๊ฒƒ.

    • ๋นŒ๋“œ๊ฐ€ ์ž˜ ์•ˆ ๋˜๋ฉด, gradlew clean build๋กœ ์™„์ „ํžˆ ์ง€์šฐ๊ณ  ๋‹ค์‹œ ์‹œ๋„ํ•ด ๋ณธ๋‹ค.
  3. ๋นŒ๋“œ๊ฐ€ ๋‹ค ๋˜๋ฉด cd build๋ฅผ ์ž…๋ ฅํ•ด ๋นŒ๋“œ ํด๋”๋กœ ๋“ค์–ด๊ฐ€ ๋ณธ๋‹ค.

  4. cd libs๋ฅผ ์ž…๋ ฅํ•ด libs ํด๋”๋กœ ์ด๋™ํ•˜๋ฉด ํ”„๋กœ์ ํŠธ๋ช…-0.0.10-SNAPSHOT.jarํŒŒ์ผ์ด ์ƒ์„ฑ๋˜์–ด ์žˆ๋‹ค.

  5. java -jar ํ”„๋กœ์ ํŠธ๋ช…-0.0.10-SNAPSHOT.jar ๋ฅผ ์ž…๋ ฅํ•ด ์Šคํ”„๋ง ์›น์„ ์‹คํ–‰ํ•œ๋‹ค.

    localhost:8080์— ์ ‘์†ํ•ด ๋งŒ๋“  ํŽ˜์ด์ง€๊ฐ€ ์ž˜ ๋‚˜์˜ค๋Š”์ง€ ํ™•์ธํ•ด ๋ณธ๋‹ค.

  6. Ctrl + c๋กœ ์‹คํ–‰ ์ค‘์ธ ์›น์„ ์ข…๋ฃŒํ•œ๋‹ค.

    Shutting down ExecutorService 'applicationTaskExecutor'๊ฐ€ ๋‚˜์˜ค๋ฉด ์ž˜ ์ข…๋ฃŒ๋œ ๊ฒƒ.

jarํŒŒ์ผ์„ ๋„ฃ๊ณ  ์‹คํ–‰์‹œํ‚ค๋ฉด ๋๋‚˜๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์›น์„ ์‹คํ–‰ํ•ด ๋ณด์•˜๋‹ค.

์Šคํ”„๋ง ์›น ๊ฐœ๋ฐœ ๊ธฐ์ดˆ - ์ •์  ์ปจํ…์ธ , MVC์™€ ํ…œํ”Œ๋ฆฟ ์—”์ง„, API

์›น์„ ๊ฐœ๋ฐœํ•œ๋‹ค๋Š” ๊ฒƒ์—๋Š” 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

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

1. ์ •์  ์ปจํ…์ธ 

: ์„œ๋ฒ„์—์„œ๋Š” ๋ณ„๋‹ค๋ฅธ ์ผ์„ ํ•˜์ง€ ์•Š๊ณ , ํŒŒ์ผ์„ ๊ทธ๋Œ€๋กœ ์›น ๋ธŒ๋ผ์šฐ์ €์— ๋ณด๋‚ด ์ฃผ๋Š” ๋ฐฉ์‹. ์ „์— ๋ฐฐ์šด Welcome Page์™€ ๊ฐ™๋‹ค.

์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” static์„ ์ฐพ์•„ ์ •์  ์ปจํ…์ธ  ์ œ๊ณต ๊ธฐ๋Šฅ์„ ์ž๋™ ์ง€์›ํ•œ๋‹ค.

ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ํ•  ์ˆ˜ ์—†๊ณ , ์ €์žฅ๋œ htmlํŒŒ์ผ์„ ์š”์ฒญ์‹œ ๋ณด๋‚ด์ฃผ๊ธฐ๋งŒ ํ•œ๋‹ค.

  • src/main/resources/static ํด๋”์— ์ž„์˜์˜ htmlํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ , ํ•ด๋‹น ํŒŒ์ผ๋ช…์œผ๋กœ URL ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด hello-static.html์„ ๋งŒ๋“ค๋ฉด, URL์€ localhost:8080/hello-static.html์ด๋‹ค.

์ •์  ์ปจํ…์ธ  ๋ฐฉ์‹ ๊ณผ์ • ์„ค๋ช…

์Šคํ”„๋ง ์ •์  ์ปจํ…์ธ 

  1. ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ localhost:8080/hello-static.html ๋กœ ์š”์ฒญํ•˜๋ฉด ๋‚ด์žฅ ํ†ฐ์บฃ ์„œ๋ฒ„๊ฐ€ ํ•ด๋‹น ์š”์ฒญ์„ ๋ฐ›๋Š”๋‹ค.

  2. ํ†ฐ์บฃ ์„œ๋ฒ„๋Š” ๋จผ์ € ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— hello-static.html์š”์ฒญ์ด ์™”์Œ์„ ์•Œ๋ฆฐ๋‹ค.

    ์Šคํ”„๋ง ๋ถ€ํŠธ์—์„œ๋Š” ''์ปจํŠธ๋กค๋Ÿฌ''๊ฐ€ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ€์žฅ ๋จผ์ € ์ปจํŠธ๋กค๋Ÿฌ ์ค‘์— hello-static.html ๊ด€๋ จ ๋‚ด์šฉ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

  3. ์ปจํŠธ๋กค๋Ÿฌ์— ํ•ด๋‹น ๋‚ด์šฉ์ด ์—†์œผ๋ฉด ๊ทธ ๋‹ค์Œ์œผ๋กœ resources: static์— hello-static.html ๊ด€๋ จ ๋‚ด์šฉ์ด ์žˆ๋Š”์ง€ ์ฐพ๋Š”๋‹ค.

  4. ์žˆ์œผ๋ฉด ํ•ด๋‹น ๋‚ด์šฉ(htmlํŒŒ์ผ)์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

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

: ํ˜„์žฌ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹.

ํ…œํ”Œ๋ฆฟ ์—”์ง„(JSP, PHP ๋“ฑ) - HTML์„ ๊ทธ๋ƒฅ ๋ณด๋‚ด์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ์„œ๋ฒ„์—์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ†ตํ•ด ๋™์ ์œผ๋กœ ๋ฐ”๊พธ์–ด์„œ ๋ณด๋‚ด์ฃผ๋Š” ์—ญํ• .

MVC

: HTML์„ ๋™์ ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•œ ์š”์†Œ๋“ค.

Model๋ชจ๋ธ, View๋ทฐ, Controller์ปจํŠธ๋กค๋Ÿฌ ๋ฅผ ๋œปํ•œ๋‹ค.

  • Model ๋ชจ๋ธ ,Controller ์ปจํŠธ๋กค๋Ÿฌ : ๋กœ์ง๊ณผ ๊ด€๋ จ๋˜๊ฑฐ๋‚˜ ๋‚ด๋ถ€ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค.

    Controller - HelloController.java

    @Controller
    public class HelloController {
        @GetMapping("hello-mvc")
        public String helloMvc(@RequestParam("name") String name, Model model) {
            model.addAttribute("name", name);
            return "hello-template";
        }
    }
    • @RequestParam() : ์™ธ๋ถ€(์›น)์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์•„์˜ฌ ๋•Œ ์‚ฌ์šฉ. URL ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๊ฐ’์„ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋‹ค?

      helloMvc(@RequestParam("name") String name, Model model) : String์„ Model์— ๋‹ด๊ณ , ๊ทธ Model์„ View์—์„œ ๋ Œ๋”๋งํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

    • model.addAttribute("name", name); : ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜์–ด์˜จ name์„ Model์— ์ €์žฅํ•œ๋‹ค.

      "name"(@RequestParam("name"))์ด ํ‚ค, name(String name)์ด ๊ฐ’์ด๋‹ค.

      • ์ด๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด /hello-mvc์— ์ ‘์†ํ•ด๋„ ์•„๋ฌด๊ฒƒ๋„ ๋œจ์ง€ ์•Š๊ณ  WARN ... MissingServletRequestParameterException: Required String parameter 'name' is not present ์ด ๋œฌ๋‹ค.

      • @RequestParam()์˜ "name"์— Ctrl + p ๋ฅผ ๋ˆ„๋ฅด๊ณ  ํ™•์ธํ•ด ๋ณด๋ฉด, ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ฌด์—‡์„ ํ•„์š”๋กœ ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

      • ์ฆ‰ URL์ƒ์—์„œ ํ•„์š”ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ "name"์„ ๋„ฃ์–ด ์š”์ฒญํ•ด์•ผ ํ•œ๋‹ค!

        localhost:8080/hello-mvc (โŒ)

        localhost:8080/hello-mvc?name=๊ฐ’ (โญ•)

        ์ด๋ ‡๊ฒŒ ์š”์ฒญํ•˜๋ฉด String name์ด ๊ฐ’์œผ๋กœ ๋ฐ”๋€Œ์–ด ๋ชจ๋ธ์— ๋„ฃ์–ด์ง€๊ณ , template์— ๋„˜์–ด๊ฐ„๋‹ค.

  • View ๋ทฐ : ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š” ์—ญํ•  ๋‹ด๋‹น.

    View - resources/template/hello-template.html

    <html xmlns:th="http://www.thymeleaf.org">
    <body>
    <p th:text="'hello ' + ${name}">hello! empty</p>
    </body>    
    </html>
    • <html xmlns:th="http://www.thymeleaf.org"> : thymeleaf ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ์‚ฌ์šฉํ•ด html์„ ๊ฐ€์ ธ์˜จ๋‹ค.

    • <p th:text="'hello ' + ${name}">hello! empty</p> : ํ…œํ”Œ๋ฆฟ์—”์ง„์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ๋Š” <p></p>์‚ฌ์ด์˜ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅํ•˜๊ณ , ์‚ฌ์šฉํ•  ๋•Œ๋Š” <p></p>์‚ฌ์ด์˜ ๊ฐ’์„ th:text="๋‚ด์šฉ"์œผ๋กœ ์น˜ํ™˜ํ•ด ์ถœ๋ ฅํ•œ๋‹ค. ์„œ๋ฒ„ ์—†์ด HTMLํŒŒ์ผ์„ ํ™•์ธํ•  ๋•Œ ์‚ฌ์šฉํ•จ.

    • ${name} : Model์—์„œ ๊ฐ’์„ ๊บผ๋‚ผ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐํ˜ธ์ด๋‹ค.

      ์ฆ‰ ๋ชจ๋ธ์˜ ํ‚ค ๊ฐ’์ด name์ธ ๋ฐ์ดํ„ฐ์—์„œ ๊ฐ’์„ ๊บผ๋‚ด, ๊ทธ ๊ฐ’์œผ๋กœ ์น˜ํ™˜ํ•ด ์ค€๋‹ค

MVC, ํ…œํ”Œ๋ฆฟ์—”์ง„ ๋ฐฉ์‹ ๊ณผ์ • ์„ค๋ช…

์Šคํ”„๋ง mvc ํ…œํ”Œ๋ฆฟ์—”์ง„

  1. ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ localhost:8080/hello-mvc๋กœ ์š”์ฒญํ•œ๋‹ค.

  2. ์Šคํ”„๋ง๋ถ€ํŠธ์˜ ๋‚ด์žฅ ํ†ฐ์บฃ ์„œ๋ฒ„์—์„œ ํ•ด๋‹น ์š”์ฒญ์„ ๋ฐ›์•„ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋กœ ๋„˜๊ฒจ์ค€๋‹ค.

  3. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ฐ€์žฅ ๋จผ์ € ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‚ดํ”ผ๋ฉฐ ํ•ด๋‹น ์š”์ฒญ(hello-mvc)์— ๋งตํ•‘๋œ(@GetMapping()) ์‚ฌํ•ญ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

    ๋งตํ•‘๋œ ์‚ฌํ•ญ์ด ์žˆ์œผ๋ฉด, ๋งตํ•‘๋œ ๋ฉ”์„œ๋“œ helloMvc()๋ฅผ ํ˜ธ์ถœํ•ด ์ค€๋‹ค.

  4. helloMvc()๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

    ๋ฆฌํ„ด๊ฐ’์ธ hello-template๋ฅผ ๋ณด๋‚ด๊ณ , ๋™์‹œ์— Model์— ํ‚ค=name, ๊ฐ’=spring์ธ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด ๋ณด๋‚ธ๋‹ค.

  5. ์Šคํ”„๋ง viewResolver๊ฐ€ ์ด๋ฅผ ๋ฐ›์•„ ๋™์ž‘ํ•œ๋‹ค.

    src/main/resources/template์—์„œ View(hello-template.html)๋ฅผ ์ฐพ์•„ ์ฃผ๊ณ , ํ…œํ”Œ๋ฆฟ์—”์ง„(์—ฌ๊ธฐ์„œ๋Š” Thymeleaf)์„ ์—ฐ๊ฒฐ์‹œ์ผœ ์ค€๋‹ค.

    ํ…œํ”Œ๋ฆฟ์—”์ง„์€ ํ•ด๋‹น htmlํŒŒ์ผ์„ ๋ฐ›์•„ View๋ผ๋Š” ํ…œํ”Œ๋ฆฟ์„ ๋ณ€ํ™˜ํ•œ ๋‹ค์Œ, ๋ณ€ํ™˜๋œ htmlํŒŒ์ผ์„ ์›น๋ธŒ๋ผ์šฐ์ €์— ๋„˜๊ฒจ ์ค€๋‹ค.

์ •์ ์ปจํ…์ธ ์™€์˜ ์ฐจ์ด์ ?

: htmlํŒŒ์ผ์„ ๋ณ€ํ™˜ํ•ด ๋„˜๊ฒจ์ค€๋‹ค๋Š” ์ฐจ์ด์ ์ด ์žˆ๋‹ค.

3. API

: ์•ˆ๋“œ๋กœ์ด๋“œ/์•„์ดํฐ ๊ฐœ๋ฐœ์— ์‚ฌ์šฉ. ๋˜๋Š” ์„œ๋ฒ„๋ผ๋ฆฌ ํ†ต์‹ ํ•  ๋•Œ, ๋ฐ์ดํ„ฐ๋งŒ ๊ตํ™˜ํ•˜๋ฏ€๋กœ API๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.

xml / JSON ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ํฌ๋งท์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์„ API๋ฐฉ์‹์ด๋ผ๊ณ  ํ•œ๋‹ค.

์„œ๋ฒ„๊ฐ€ API๋กœ ๋ฐ์ดํ„ฐ๋งŒ ๋ณด๋‚ด ์ฃผ๋ฉด, ํ™”๋ฉด์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์•Œ์•„์„œ ๊ทธ๋ฆฌ๋Š” ๋ฐฉ์‹.

*์ •์  ์ปจํ…์ธ  ๋ฐฉ์‹์„ ์ œ์™ธํ•˜๊ณ , HTML์„ ์ง์ ‘ (๋ณ€ํ™˜ํ•˜์—ฌ) ๋ณด๋‚ด์ฃผ๋Š”์ง€ ์•„๋‹ˆ๋ฉด API๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๋กœ ๋ณด๋‚ด์ฃผ๋Š”์ง€์— ๋”ฐ๋ผ MVC / API ๋‘ ๋ฐฉ์‹์„ ๊ธฐ์–ตํ•˜๋ฉด ๋œ๋‹ค.

  • Controller - HelloController.java

    @GetMapping("hello-string")
    @ResponseBody
    public String helloString(@RequestParam("name") String name) {
        return "hello " + name;
    }

    ์›น๋ธŒ๋ผ์šฐ์ €์—์„œ localhost:8080/hello-string?name=spring์„ ์ž…๋ ฅํ•˜๋ฉด hello spring์ด ๋‚˜์˜จ๋‹ค.

    • @ResponseBody : HTTP์˜ Body๋ถ€์— ํ•ด๋‹น ๋ฐ์ดํ„ฐ(๋ฆฌํ„ด๊ฐ’)๋ฅผ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

      (html์˜ <body>๊ฐ€ ์•„๋‹ˆ๋‹ค!)

      View, Model์—†์ด ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์ „๋‹ฌํ•œ๋‹ค.

  • API๋ฐฉ์‹์€ ์œ„ ๋ฐฉ์‹๋ณด๋‹ค ์ฃผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

    Controller - HelloController.java

    @GetMapping("hello-api")
    @ResponseBody
    public Hello helloApi(@RequestParam("name") String name) {
        Hello hello = new Hello();
        hello.setName(name);
        return hello;
    }

    ์•„๋ž˜์˜ ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค (Hello ๊ฐ์ฒด)

    static class Hello{
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }

    ํ•ด๋‹น ํด๋ž˜์Šค์—์„œ Alt + Insert - Generate - Getter and Setter๋ฅผ ๋ˆŒ๋Ÿฌ ์ž๋™์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

    • get...() : getter, set...() : setter.

      ์ž๋ฐ” ๋นˆ ํ‘œ์ค€ ๋˜๋Š” property๋ฐฉ์‹ - ํด๋ž˜์Šค ๋‚ด์˜ ์ธ์Šคํ„ด์Šค๋ณ€์ˆ˜๋Š” private๋กœ ํ•˜๊ณ , ์ ‘๊ทผ์„ ์œ„ํ•ด public ๋ฉ”์„œ๋“œ (getter, setter)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹.

    ๊ทธ๋ฆฌ๊ณ  ์›น๋ธŒ๋ผ์šฐ์ €์—์„œ localhost:8080/hello-api?name=spring์„ ์ž…๋ ฅํ•˜๋ฉด ,

    {name : "spring"} ์ด ๋‚˜์˜จ๋‹ค.

    • *JSON๋ฐฉ์‹ * : ํ‚ค์™€ ๊ฐ’์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. - ์ฐพ์•„์„œ ๊ณต๋ถ€ํ•˜๊ธฐ!

      ์Šคํ”„๋ง์€ ๊ธฐ๋ณธ์ ์œผ๋กœ JSON๋ฐฉ์‹์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์„ธํŒ…์ด ๋˜์–ด ์žˆ๋‹ค.

    • xml๋ฐฉ์‹ : JSON ์ด์ „์— ๋งŽ์ด ์“ฐ์˜€๋˜ ๋ฐฉ์‹. ํƒœ๊ทธ๋ฅผ ์—ด๊ณ ๋‹ซ์•„์•ผ ํ•˜๋ฉฐ, ๋ฌด๊ฑฐ์šด ๋ฐฉ์‹์ด๋ผ ํ˜„์žฌ๋Š” JSON๋ณด๋‹ค ๋œ ์“ฐ์ด๊ณ  ์žˆ๋‹ค.

API๋ฐฉ์‹ ๊ณผ์ • ์„ค๋ช…

์Šคํ”„๋ง API๋ฐฉ์‹

  1. ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ localhost:8080/hello-api ์š”์ฒญ

  2. ๋‚ด์žฅ ํ†ฐ์บฃ ์„œ๋ฒ„์—์„œ hello-api์š”์ฒญ์„ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์ „๋‹ฌํ•œ๋‹ค.

  3. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” hello-api๊ฐ€ ๋งตํ•‘(@GetMapping("hello-api"))๋˜์–ด ์žˆ์œผ๋ฉด ํ•ด๋‹น ๋ฉ”์†Œ๋“œ(helloApi())๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

  4. ์ด ๋•Œ ๋ฉ”์†Œ๋“œ์— @ResponseBody ์–ด๋…ธํ…Œ์ด์…˜์ด ์žˆ์œผ๋ฉด, HTTP์‘๋‹ต์— ํ•ด๋‹น ๋ฐ์ดํ„ฐ(๋ฆฌํ„ด๊ฐ’)์„ ๊ทธ๋Œ€๋กœ ๋„˜๊ธฐ๊ณ  HttpMessageConverter๊ฐ€ ๋™์ž‘ํ•œ๋‹ค.

    (๋ฐ˜๋Œ€๋กœ ๋ฉ”์†Œ๋“œ์— @ResponseBody ์–ด๋…ธํ…Œ์ด์…˜์ด ์—†์œผ๋ฉด, MVC๋ฐฉ์‹๋Œ€๋กœ viewResolver๊ฐ€ ๋™์ž‘ํ•œ๋‹ค.)

  5. ์ด ๋•Œ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ์˜ ๋ฆฌํ„ด๊ฐ’์ด ๊ฐ์ฒด์ด๋ฉด, ๊ธฐ๋ณธ์ ์œผ๋กœ JSONํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด HTTP์‘๋‹ต์— ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    return: hello(name:spring)

  6. ๋ฐ›์€ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  HttpMessageConverter ๊ฐ€ ๋™์ž‘ํ•œ๋‹ค.

    • ๋ฐ›์€ ๊ฐ์ฒด๊ฐ€ ๋‹จ์ˆœ ๋ฌธ์ž(String) ๋ผ๋ฉด StringConverter๊ฐ€ ๋™์ž‘ํ•œ๋‹ค.

      (๊ธฐ๋ณธ ๋ฌธ์ž์ฒ˜๋ฆฌ : StringHttpMessageConverter)

    • ๋ฐ›์€ ๊ฐ์ฒด๊ฐ€ ์ผ๋ฐ˜ ๊ฐ์ฒด๋ผ๋ฉด JsonConverter๊ฐ€ ๋™์ž‘ํ•œ๋‹ค - ๊ฐ์ฒด๋ฅผ ํ‚ค์™€ ๊ฐ’์„ ๊ฐ€์ง€๋Š” JSONํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

      (๊ธฐ๋ณธ ๊ฐ์ฒด์ฒ˜๋ฆฌ : MappingJackson2HttpMessageConverter)

    • byte์ฒ˜๋ฆฌ ๋“ฑ ๊ธฐํƒ€ ์—ฌ๋Ÿฌ HttpMessageConverter๊ฐ€ ๊ธฐ๋ณธ ๋“ฑ๋ก๋˜์–ด ์žˆ์Œ.

  7. ๋ณ€ํ™˜๋œ ๋‚ด์šฉ์„ ์›น๋ธŒ๋ผ์šฐ์ €์— ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ฐธ๊ณ  : ํด๋ผ์ด์–ธํŠธ์˜ HTTP Accept ํ—ค๋”์™€, ์„œ๋ฒ„์˜ ์ปจํŠธ๋กค๋Ÿฌ ๋ฐ˜ํ™˜ํƒ€์ž… ์ •๋ณด - ๋‘˜์„ ์กฐํ•ฉํ•ด์„œ HttpMessageConverter๊ฐ€ ์„ ํƒ๋œ๋‹ค.

์ •๋ฆฌ : ์Šคํ”„๋ง ์›น ๊ฐœ๋ฐœ - ์ •์  ์ปจํ…์ธ , MVC์™€ ํ…œํ”Œ๋ฆฟ์—”์ง„, API ๋น„๊ต

  • ์ •์  ์ปจํ…์ธ 
    • ๊ทธ๋ƒฅ ํŒŒ์ผ์„ ๊ทธ๋Œ€๋กœ ๋‚ด๋ ค์ค€๋‹ค.
  • MVC์™€ ํ…œํ”Œ๋ฆฟ์—”์ง„
    • ํ…œํ”Œ๋ฆฟ์„ ๋ชจ๋ธ/๋ทฐ/์ปจํŠธ๋กค๋Ÿฌ๋กœ ์ชผ๊ฐœ๊ณ , ๋ทฐ(html)๋ฅผ ํ…œํ”Œ๋ฆฟ์—”์ง„์œผ๋กœ ํ•„์š”ํ•œ ๋งŒํผ ๋ณ€ํ™˜(๋ Œ๋”๋ง)ํ•œ ๋‹ค์Œ, ๋ณ€ํ™˜๋œ html์„ ํด๋ผ์ด์–ธํŠธ์— ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • API
    • ์ฃผ๋กœ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ, HttpMessageConverter๋ฅผ ํ†ตํ•ด JSONํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๋‹ค์Œ ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ HTTP Response์— ๋„ฃ์–ด ๋ฐ˜ํ™˜ํ•ด ์ค€๋‹ค.

'๐Ÿ–ฅ BE ๋ฐฑ์—”๋“œ > Spring ์Šคํ”„๋ง' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Spring] ์ธํ”„๋Ÿฐ ์Šคํ”„๋ง ์ž…๋ฌธ(๊น€์˜ํ•œ ๋‹˜) - ์Šคํ”„๋ง DB ์ ‘๊ทผ๊ธฐ์ˆ  : H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์น˜  (0) 2021.03.05
[Spring] ์ธํ”„๋Ÿฐ ์Šคํ”„๋ง ์ž…๋ฌธ(๊น€์˜ํ•œ ๋‹˜) - ์›น MVC ๊ฐœ๋ฐœ(ํšŒ์›๊ด€๋ฆฌ ์˜ˆ์ œ) : ํšŒ์› ๋“ฑ๋ก ๋ฐ ์กฐํšŒ  (0) 2021.03.05
[Spring] ์ธํ”„๋Ÿฐ ์Šคํ”„๋ง ์ž…๋ฌธ(๊น€์˜ํ•œ ๋‹˜) - ์Šคํ”„๋ง ๋นˆ๊ณผ ์˜์กด๊ด€๊ณ„ : ์ปดํฌ๋„ŒํŠธ ์Šค์บ”, ์˜์กด๊ด€๊ณ„, DI, ์Šคํ”„๋ง ๋นˆ ์ง์ ‘ ๋“ฑ๋กํ•˜๊ธฐ  (0) 2021.03.04
[Spring] ์ธํ”„๋Ÿฐ ์Šคํ”„๋ง ์ž…๋ฌธ(๊น€์˜ํ•œ ๋‹˜) - ํšŒ์› ๊ด€๋ฆฌ ์˜ˆ์ œ:๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ, ํšŒ์› ๋„๋ฉ”์ธ/๋ฆฌํฌ์ง€ํ† ๋ฆฌ/์„œ๋น„์Šค ๊ฐœ๋ฐœ, ํ…Œ์ŠคํŠธ์ผ€์ด์Šค ์ž‘์„ฑ  (0) 2021.03.04
[Spring] ์ธํ”„๋Ÿฐ ์Šคํ”„๋ง ์ž…๋ฌธ(๊น€์˜ํ•œ ๋‹˜) - ๊ฐ•์˜ ์†Œ๊ฐœ, ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ดํŽด๋ณด๊ธฐ, Viewํ™˜๊ฒฝ์„ค์ •  (0) 2021.03.02