YOONJI
article thumbnail

์Šคํ”„๋ง ์›น ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•


์ •์  ์ปจํ…์ธ 
; ํŒŒ์ผ์„ ๊ทธ๋Œ€๋กœ ์›น๋ธŒ๋ผ์šฐ์ €์— ๋‚ด๋ ค์ฃผ๋Š” ๊ฒƒ

MVC์™€ ํ…œํ”Œ๋ฆฟ ์—”์ง„ ; ์„œ๋ฒ„์—์„œ HTML์„ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•ด์„œ ๋™์ ์œผ๋กœ ๋‚ด๋ฆฌ๋Š” ๊ฒƒ
API ; JSON์ด๋ผ๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ํฌ๋งท์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹

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

# ์ •์  ์ปจํ…์ธ  ๊ธฐ๋Šฅ

resources/static/hello-static.html

<!DOCTYPE HTML>
<html>
<head>
    <title>static content</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
์ •์  ์ปจํ…์ธ  ์ž…๋‹ˆ๋‹ค.
</body>
</html>

์‹คํ–‰ ๊ฒฐ๊ณผ

> hello-static.html ํŒŒ์ผ ์ƒ์„ฑ ํ›„ ํ”„๋กœ์ ํŠธ ์‹คํ–‰

localhost:8080/hello-static.html ์ ‘์† ์‹œ ์œ„์™€ ๊ฐ™์€ ํ™”๋ฉด์ด ์ถœ๋ ฅ๋œ๋‹ค.

 

 

# ์ •์  ์ปจํ…์ธ  ๋™์ž‘ ํ™˜๊ฒฝ

> ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ localhost:8080/hello-static.html ์ ‘์†

> ๋‚ด์žฅ ํ†ฐ์ผ“ ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ๋ฐ›์•„ Spring์—๊ฒŒ ์ „๋‹ฌ

> Spring์ด ์ปจํŠธ๋กค๋Ÿฌ ์ชฝ์— hello-static์ด ์žˆ๋Š”์ง€ ๋จผ์ € ์ฐพ์•„๋ด„

(์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ฐ€์ง)

> ๋งคํ•‘์ด ๋œ hello-static ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์—†์œผ๋ฏ€๋กœ resources์˜ static/hello-static.html์„ ๋ฐ˜ํ™˜

 

 

์ •์  ์ปจํ…์ธ  ๋ฐฉ์‹์„ ์ œ์™ธํ•˜๊ณ ๋Š”

MVC์ฒ˜๋Ÿผ View๋ฅผ ์ฐพ์•„์„œ ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ํ†ตํ•ด ํ™”๋ฉด์„ ๋ Œ๋”๋งํ•ด์„œ HTML์„ ์›น ๋ธŒ๋ผ์šฐ์ €์— ๋„˜๊ฒจ์ฃผ๋Š” ๋ฐฉ์‹๊ณผ

API๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋„˜๊ฒจ์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋‚˜๋‰จ


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

  • MVC : Model, View, Controller

View์—์„œ ๋ชจ๋“  ๊ฒƒ์„ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ–ˆ๋˜ Model1 ๋ฐฉ์‹ > View์™€ Controller๊ฐ€ ๋ถ„๋ฆฌ๋œ MVC ๋ฐฉ์‹์œผ๋กœ ๋ณ€ํ™”


View
: ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š” ๋ฐ์— ๋ชจ๋“  ์—ญ๋Ÿ‰์„ ์ง‘์ค‘

Controller : ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๊ด€๋ จ์ด ์žˆ๊ฑฐ๋‚˜ ๋‚ด๋ถ€์ ์ธ ๊ฒƒ๋“ค์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์ง‘์ค‘

 

 

# MVC ๊ธฐ๋Šฅ

Controller

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")
    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";
    }
}

 

resources/templates/hello-template.html

<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>

 

> ์œ„ ๋‘ ์ฝ”๋“œ๋ฅผ ์ ์šฉํ–ˆ๋Š”๋ฐ localhost:8080/hello-mvc์— ์ ‘์†ํ•ด๋ณด๋ฉด ์—๋Ÿฌ ํŽ˜์ด์ง€๊ฐ€ ๋œจ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

> ์—๋Ÿฌ๊ฐ€ ๋–ด๋‹ค๋ฉด ๋กœ๊ทธ๋ฅผ ๋ฐ˜๋“œ์‹œ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. WARN์ด ๋ณด์ด๋Š” ๋ถ€๋ถ„์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

 

> ๋กœ๊ทธ๋ฅผ ์ž์„ธํžˆ ๋ณด๋ฉด Parameter ๊ฐ’์„ ์ฃผ์ง€ ์•Š์•„์„œ ์ƒ๊ธด ์˜ค๋ฅ˜์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

# Command + P๋ฅผ ํ™œ์šฉํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ ์ •๋ณด ํ™•์ธ

Command + P๋ฅผ ํ†ตํ•ด Parameter ์ •๋ณด๋ฅผ ํ™•์ธํ•ด๋ณด๋‹ˆ value() ํ˜น์€ name()์ด ์žˆ๊ณ ,

required()์˜ default๊ฐ€ true์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

true์ธ ๊ฒฝ์šฐ์—๋Š” parameter ๊ฐ’์„ ๋ฐ˜๋“œ์‹œ ์ž…๋ ฅํ•ด์ค˜์•ผ ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€ ์•Š๋Š”๋‹ค.

 

name์— ๊ฐ’์„ ๋„ฃ์–ด์ค€ ๊ฒฐ๊ณผ

> ๋‚˜๋Š” name์— spring!!!์ด๋ผ๋Š” ๊ฐ’์„ ๋„ฃ์–ด์คฌ๋‹ค.

์ƒˆ๋กœ๊ณ ์นจ ํ•˜๋ฉด ์œ„์™€ ๊ฐ™์ด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.

 

 

# MVC, ํ…œํ”Œ๋ฆฟ ์—”์ง„ ๋™์ž‘ ํ™˜๊ฒฝ

> ๋‚ด์žฅ ํ†ฐ์ผ“ ์„œ๋ฒ„๊ฐ€ ์›น ๋ธŒ๋ผ์šฐ์ €๋กœ๋ถ€ํ„ฐ ์š”์ฒญ์„ ๋ฐ›์•„ Spring์—๊ฒŒ ์ „๋‹ฌ

> helloController์˜ hello-mvc ๋ฉ”์†Œ๋“œ์— ๋งคํ•‘์ด ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ

(name์— ๋„ฃ์€ ๊ฐ’๋„ ํ•จ๊ป˜ Spring์— ๋ฐ˜ํ™˜)

> Spring์ด viewResolver๋ฅผ ํ†ตํ•ด templates/hello-template.html์„ ์ฐพ์•„ Thymeleaf ํ…œํ”Œ๋ฆฟ์— ์ฒ˜๋ฆฌ ์š”์ฒญ

> ํ…œํ”Œ๋ฆฟ ์—”์ง„์—์„œ ๋ณ€ํ™˜ํ•œ HTML์„ ์›น ๋ธŒ๋ผ์šฐ์ €์— ํ‘œ์‹œ

 


API

# API ๊ธฐ๋Šฅ

[ String ๋ฐ˜ํ™˜ ]

//Controller์— ์•„๋ž˜ ์ฝ”๋“œ ์ถ”๊ฐ€
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name) {
        return "hello " + name; // "hello spring"
}

@ResponseBody : ViewResolver๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  HTTP์˜ BODY์— "hello " + name ๋ถ€๋ถ„์„ ์ง์ ‘ ๋„ฃ์–ด์คŒ

**HTML์ด ์•„๋‹Œ HTTP์˜ ์‘๋‹ต ๋ฐ”๋””์ด๋ฏ€๋กœ ํ˜ผ๋™ํ•˜์ง€ ๋ง ๊ฒƒ

 

[ ๊ฐ์ฒด ๋ฐ˜ํ™˜ ]

//Controller์— ์•„๋ž˜ ์ฝ”๋“œ ์ถ”๊ฐ€
@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;
    }
}

@ResponseBody : ๊ฐ์ฒด๋ฅผ JSON ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜

 

 

[ String ๋ฐ˜ํ™˜ vs ๊ฐ์ฒด ๋ฐ˜ํ™˜ ]

 

 

[ ํ…œํ”Œ๋ฆฟ ์—”์ง„ vs API ํŽ˜์ด์ง€ ์†Œ์Šค ๋น„๊ต ]

ํ…œํ”Œ๋ฆฟ ์—”์ง„์€ HTML ํƒœ๊ทธ๋“ค์ด ๋ณด์ด๋Š” ๋ฐ˜๋ฉด API ์‚ฌ์šฉ ์‹œ์—๋Š” HTML ํƒœ๊ทธ ์—†์ด ๋‚ด๊ฐ€ ์ ์€ ๋ฌธ์ž์—ด์ด ๊ทธ๋Œ€๋กœ ๋‚˜ํƒ€๋‚จ

์ด๋•Œ, ํ…œํ”Œ๋ฆฟ ์—”์ง„๊ณผ์˜ ์ฐจ์ด์ ์€ View ์—†์ด return ๋ถ€๋ถ„์ด ๊ทธ๋Œ€๋กœ ์›น ๋ธŒ๋ผ์šฐ์ €์— ํ‘œ์‹œ๋œ๋‹ค๋Š” ์ ์ด๋‹ค.

 

 

# API ๋™์ž‘ ํ™˜๊ฒฝ

> @ResponseBody ์‚ฌ์šฉ ์‹œ HTTP์˜ BODY์— ๋ฌธ์ž ๋‚ด์šฉ์„ ์ง์ ‘ ๋ฐ˜ํ™˜

viewResolver ๋Œ€์‹ ์— HttpMessageConverter ๊ฐ€ ๋™์ž‘
๊ธฐ๋ณธ ๋ฌธ์ž์ฒ˜๋ฆฌ: StringHttpMessageConverter๊ฐ€ ๋‹ด๋‹น
๊ธฐ๋ณธ ๊ฐ์ฒด์ฒ˜๋ฆฌ: MappingJackson2HttpMessageConverter๊ฐ€ ๋‹ด๋‹น

(๊ฐ์ฒด ๋ฐ˜ํ™˜ ์‹œ ๊ธฐ๋ณธ ์ •์ฑ… : JSON ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด์„œ HTTP ์‘๋‹ต์— ๋ฐ˜ํ™˜)

 

๋‚ด์šฉ ๋ฐ ์ด๋ฏธ์ง€ ์ถœ์ฒ˜ : ๊น€์˜ํ•œ์˜ ์Šคํ”„๋ง ์ž…๋ฌธ    

'๐Ÿ–‹๏ธ study > spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Spring Intro] Section 05. ํšŒ์›๊ด€๋ฆฌ ์˜ˆ์ œ - ์›น MVC ๊ฐœ๋ฐœ(ํšŒ์› ์›น ๊ธฐ๋Šฅ, ํ™ˆ ํ™”๋ฉด ์ถ”๊ฐ€, ๋“ฑ๋ก, ์กฐํšŒ)  (0) 2023.01.25
[Spring Intro] Section 04. ์Šคํ”„๋ง ๋นˆ๊ณผ ์˜์กด๊ด€๊ณ„_์ปดํฌ๋„ŒํŠธ ์Šค์บ”๊ณผ ์ž๋™ ์˜์กด๊ด€๊ณ„ ์„ค์ •, ์ž๋ฐ” ์ฝ”๋“œ๋กœ ์ง์ ‘ ์Šคํ”„๋ง ๋นˆ ๋“ฑ๋กํ•˜๊ธฐ  (0) 2023.01.23
[Spring Intro] Section 03. ํšŒ์› ๊ด€๋ฆฌ ์˜ˆ์ œ_๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ, ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ ์ •๋ฆฌ, ํšŒ์› ๋„๋ฉ”์ธ๊ณผ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋งŒ๋“ค๊ธฐ, ํšŒ์› ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ํ…Œ์ŠคํŠธ, ํšŒ์› ์„œ๋น„์Šค ๊ฐœ๋ฐœ, ํšŒ์› ์„œ๋น„์Šค ํ…Œ์ŠคํŠธ  (0) 2023.01.20
[Spring Intro] Section 01. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ดํŽด๋ณด๊ธฐ, View ํ™˜๊ฒฝ์„ค์ •, ๋นŒ๋“œ ๋ฐ ์‹คํ–‰  (0) 2023.01.16
[Spring Intro] Section 01. ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ์„ค์ •  (0) 2023.01.16
profile

YOONJI

@๊ธฐ๋ฎจ์ง€

ํฌ์ŠคํŒ…์ด ์ข‹์•˜๋‹ค๋ฉด "์ข‹์•„์š”โค๏ธ" ๋˜๋Š” "๊ตฌ๋…๐Ÿ‘๐Ÿป" ํ•ด์ฃผ์„ธ์š”!