• Home
  • About
    • on Weekend photo

      on Weekend

      ๐™Ž๐™ฉ๐™ช๐™™๐™ฎ๐™ž๐™ฃ๐™œ

    • Learn More
    • Instagram
    • Github
  • Archive
    • All Posts
    • All Tags
    • All Categories
  • Categories
    • Problem Solving
    • TIL
    • Study
    • Etc
    • ํ•„์‚ฌ
  • Projects

Spring Study - 2

07 Dec 2020

2. ์Šคํ”„๋ง ์›น ๊ฐœ๋ฐœ ๊ธฐ์ดˆ

๋ชฉ์ฐจ

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

์ˆ˜๊ฐ• ์ฝ”์Šค๋Š” ์ธํ”„๋Ÿฐ ์Šคํ”„๋ง ์ž…๋ฌธ ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


์›น ๊ฐœ๋ฐœ

์›น๊ฐœ๋ฐœ์€ ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

  1. ์ •์  ์ปจํ…์ธ 
    ํŒŒ์ผ์„ ๊ทธ๋Œ€๋กœ ๋‚ด๋ ค์ฃผ๋Š” ๊ฒƒ, ๊ฐ€๋ น html ํŒŒ์ผ๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ์›น.
  2. MVC์™€ ํ…œํ”Œ๋ฆฟ ์—”์ง„
    ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ๊ณผ๊ฑฐ์˜ jsp, php์™€ ๊ฐ™์€ ๊ฒƒ์ด ํ…œํ”Œ๋ฆฟ ์—”์ง„์ด๋‹ค. html์„ ๊ทธ๋Œ€๋กœ ์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์„œ๋ฒ„์—์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•ด์„œ ๋™์ ์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ฃผ๋Š” ๊ฒƒ์ด๋ฉฐ, ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋ชจ๋ธ-๋ทฐ-์ปจํŠธ๋กค๋Ÿฌ(MVC)๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
  3. API
    ์•ˆ๋“œ๋กœ์ด๋“œ, ์•„์ดํฐ ํด๋ผ์ด์–ธํŠธ์™€ ๊ฐœ๋ฐœํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. ์š”์ƒˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ json ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ํฌ๋งท์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š”๋ฐ, ์ด๋ฅผ API ๋ฐฉ์‹์ด๋‹ค ํ•œ๋‹ค. vue, react ๋“ฑ์„ ์“ธ ๋•Œ ํ™”๋ฉด์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์•Œ์•„์„œ ๊ทธ๋ฆฌ๊ฑฐ๋‚˜, ์„œ๋ฒ„๋ผ๋ฆฌ ํ†ต์‹ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

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

  • main>resources>static ํด๋”์— html ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ. url์€ htmlํŒŒ์ผ๋ช… ๊ทธ๋Œ€๋กœ ์˜ฌ๋ผ์˜ค๊ฒŒ ๋œ๋‹ค.
  • ๋™์ž‘
    1. ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ localost:8080/hello-static.html์„ ๋‚ด์žฅ ํ†ฐ์บฃ ์„œ๋ฒ„๋กœ ๋„˜๊ฒจ์ค€๋‹ค.
    2. ํ†ฐ์บฃ ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ๋ฐ›์•„ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—๊ฒŒ ๋„˜๊ธด๋‹ค.
      2.1. ์ปจํŠธ๋กค๋Ÿฌ์—์„œ hello-static ๊ด€๋ จ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐพ์œผ๋‚˜ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค. 2.2. resources: static/hello-static.html์„ ์ฐพ๋Š”๋‹ค.
    3. ์›น ๋ธŒ๋ผ์šฐ์ €์— hello-static.html์„ ๋„์›Œ์ค€๋‹ค.

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

  • MVC๋ž€ Model, View, Controller๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๊ณผ๊ฑฐ์—๋Š” ๋ชจ๋ธ, ๋ทฐ, ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด์žˆ์ง€ ์•Š๊ณ , DB์ ‘๊ทผ ๋“ฑ๊นŒ์ง€ ๋ทฐ์— ๋ชจ๋“  ๊ฑธ ๋‹ค ํ–ˆ์—ˆ๋‹ค. ์ด๋ฅผ Model-one ๋ฐฉ์‹์ด๋ผ ๋ถ€๋ฅด๋ฉฐ, ์š”์ƒˆ๋Š” MVC ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.
    1. View : ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š” ๋ฐ์— ๋ชจ๋“  ์—ญ๋Ÿ‰์„ ์ง‘์ค‘
    2. Controller, Model : ๋‚ด๋ถ€์ ์ธ ๊ฑธ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋“ฑ๊ณผ ๊ด€๋ จ์ด ๋œ๋‹ค.
์ปจํŠธ๋กค๋Ÿฌ
package hello.hellospring.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class HelloController {

    @GetMapping("hello") // ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ '/hello'๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์ค€๋‹ค.
    public String hello(Model model) {
        model.addAttribute("data", "hello!!");
        return "hello";
    }

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

๋ทฐ (hello-template.html)
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
  • hello! empty๋Š” ์•ˆ์จ๋„ ์ƒ๊ด€์—†์ง€๋งŒ, ํƒ€์ž„๋ฆฌํ”„ ํŠน์„ฑ์ƒ ์ ˆ๋Œ€๊ฒฝ๋กœ๋กœ html์„ ๋ฐ”๋กœ ์—ด์–ด๋ณผ ์ˆ˜๋„ ์žˆ๋‹ค. ํ…œํ”Œ๋ฆฟ ์—”์ง„์œผ๋กœ ๋™์ž‘ํ•  ๊ฒฝ์šฐ์—๋Š” hello! empty์˜ ๋‚ด์šฉ์ด ์•ž์˜ 'hello ' + ${name} ์œผ๋กœ ์น˜ํ™˜๋˜์–ด ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋œ๋‹ค.

  • ์ดํ›„ http://localhost:8080/hello-mvc?name=spring!!!์œผ๋กœ ์ ‘์†ํ•ด์ฃผ๋ฉด โ€œhello spring!!!โ€์ด๋ผ๋Š” ํ™”๋ฉด์ด ๋œฌ๋‹ค.

  • ๋™์ž‘ ๋ฐฉ์‹

    1. ์›น๋ธŒ๋ผ์šฐ์ €๋Š” name=โ€springโ€์œผ๋กœ ๋ฐ›์•„์„œ ๋‚ด์žฅ ํ†ฐ์บฃ์„œ๋ฒ„๋กœ ๋„˜๊ธด๋‹ค.
    2. ๋‚ด์žฅํ†ฐ์บฃ์„œ๋ฒ„๋Š” ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์š”์ฒญํ•œ๋‹ค.
    3. helloController๋Š” helloMvc์—์„œ name์„ โ€˜springโ€™์œผ๋กœ ๋ฐ”๊พธ๊ณ , model(name:spring)๊ณผ hello-template์„ returnํ•œ๋‹ค.
    4. viewResolver๋Š” ๋ชจ๋ธ์—์„œ ${name}์œผ๋กœ ๋ฐ›์•„์™€ ์ถœ๋ ฅํ•˜๊ฒŒ ๋œ๋‹ค.
      • ์ด๋ฅผ ํƒ€์ž„๋ฆฌํ”„ ํ…œํ”Œ๋ฆฟ ์—”์ง„์€ HTML์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•œ๋‹ค.

API

@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name) {
    return "hello " + name;
}
  • ResponseBody๋Š” Body๋ถ€์— ํ•ด๋‹น ๋‚ด์šฉ์„ ์ง์ ‘ ๋„ฃ์–ด์ฃผ๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. name=โ€Springโ€์ด ๋“ค์–ด๊ฐ„๋‹ค๋ฉด, ํ•ด๋‹น ๋ฌธ์ž๊ฐ€ โ€œhello Springโ€์œผ๋กœ ๋ฐ”๋€Œ์–ด ๋“ค์–ด๊ฐ€๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.
  • view ์—†์ด ํ•ด๋‹น ๋ฌธ์ž๊ฐ€ ๊ทธ๋Œ€๋กœ ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋Š” ๊ฒƒ์ž„.
  • ์†Œ์Šค๋ณด๊ธฐ๋ฅผ ํ•˜๋ฉด html์†Œ์Šค ์—†์ด, ํ•ด๋‹น ๋ฌธ์ž๊ฐ€ ๊ทธ๋Œ€๋กœ ๋– ์žˆ๋‹ค.
@GetMapping("hello-api")
 @ResponseBody
 public Hello helloApi(@RequestParam("name") String name) {
     Hello hello = new Hello();
     hello.setName(name);
     return hello;
 }
 static class Hello {
     private String name;

     public String getName() {
         return name;
     }

     public void setName(String name) {
         this.name = name;
     }
 }
  • http://localhost:8080/hello-api?name=spring!!!๋กœ ๋“ค์–ด๊ฐ€๋ฉด {"name":"spring!!!"}์ด ๋‚˜์˜จ๋‹ค. ์ด๋Š” json์ด๋ผ๋Š” ๋ฐฉ์‹์ด๋‹ค. key๋Š” name, value๋Š” spring!!!์ด ๋“ค์–ด๊ฐ„๋‹ค. json์ด ๋‹ค๋ฅธ ๋ฐฉ์‹์— ๋น„ํ•˜์—ฌ ๊ฐ„๋‹จํ•˜๋‹ค. ResponseBody๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ๋ž˜์„œ ๊ธฐ๋ณธ์œผ๋กœ json์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • json : key-value๋กœ ์ด๋ฃจ์–ด์ง„ ๊ตฌ์กฐ
  • getter์™€ setter : Java Bean ํ‘œ์ค€ ๋ฐฉ์‹์ด๋ผ ์นญํ•œ๋‹ค. property ์ ‘๊ทผ ๋ฐฉ์‹์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค. ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•œ๋‹ค.
ResponseBody ์‚ฌ์šฉ ์›๋ฆฌ
  1. ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ localhost:8080/hello-api๋ฅผ ๋‚ด์žฅํ†ฐ์บฃ์„œ๋ฒ„๋กœ ๋ณด๋‚ธ๋‹ค.
  2. ํ†ฐ์บฃ์„œ๋ฒ„์—์„œ ์Šคํ”„๋ง์— ๋˜์ง„๋‹ค.
  3. @ResponseBody๊ฐ€ ์žˆ์œผ๋ฉด http์‘๋‹ต์— ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ๋„˜๊ธด๋‹ค. ๊ทผ๋ฐ ๋ฌธ์ž๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ์ฒด๊ฐ€ ์˜ค๋ฉด, ๊ธฐ๋ณธ์ ์œผ๋กœ json ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  4. ๊ธฐ์กด์— ๋™์ž‘ํ•˜๋ฉด viewResolver๊ฐ€ ์•„๋‹ˆ๋ผ, HttpMessageConverter๋ฅผ ์ด์šฉํ•˜๊ฒŒ ๋œ๋‹ค. ๋‹จ์ˆœ ๋ฌธ์ž์—ด์ด๋ฉด StringConverter๊ฐ€ ๋™์ž‘ํ•˜๊ณ , ๊ฐ์ฒด๋ฉด JsonConverter(MappingJackson2HttpMessageConverter)๊ฐ€ ๋™์ž‘ํ•œ๋‹ค. => ์ด๋ฅผ ํ†ตํ•ด Json ์Šคํƒ€์ผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๊ฟ” ์›น๋ธŒ๋ผ์šฐ์ €๋กœ ๋„˜๊ฒจ์ค€๋‹ค.
    • MappingJackson2HttpMessageConverter : ์žญ์Šจ์€ json์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ผ์ข…์ธ๋ฐ, ์Šคํ”„๋ง์€ ์ด๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
    • ํด๋ผ์ด์–ธํŠธ์˜ HTTP Accept ํ—ค๋”์™€ ์„œ๋ฒ„์˜ ์ปจํŠธ๋กค๋Ÿฌ ๋ฐ˜ํ™˜ ํƒ€์ž… ์ •๋ณด ๋‘˜์„ ์กฐํ•ฉํ•ด์„œ HttpMessageConverter๊ฐ€ ์„ ํƒ๋œ๋‹ค๊ณ  ํ•œ๋‹ค. (์ž˜ ์ดํ•ด๊ฐ€ ์•ˆ๊ฐ„๋‹ค. ๊ทธ๋ƒฅ json์„ ์“ด๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค๊ณ  ํ•˜์‹ ๋‹ค.)

IntelliJ ๋‹จ์ถ•ํ‚ค

  • Alt + Insert : Generate => Getter and Setter๋ฅผ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
  • Ctrl + Shift + Enter : ๋์— ์„ธ๋ฏธ์ฝœ๋ก ์„ ๋ถ™์—ฌ์ฃผ๋ฉฐ ์™„์„ฑ ํ›„ ์—”ํ„ฐ



springbackend Share Tweet +1