[ Hello,World ์ถ๋ ฅํ๊ธฐ ]
Spring - [IntelliJ] Hello World ์ถ๋ ฅํ๊ธฐ
[ Spring MVC์ ๋ํ์ฌ ] Spring - Spring MVC๋ฅผ ์์์ผ ์์์ด ๊ฐ๋ฅํ๋ค.์ฒ์์ ๋์ถฉ ํ๋ก์ ํธ๋ฅผ ์์ํด๋ณด๋ คํ์ง๋ง,์ด๋ด์๊ฐ! ์๋ ๊ฒ์ด ๋ฏธ์ฝํ๋ ์์ํ ์ ์์๋ค.๊ทธ๋์ ๊ฐ์ฅ ๊ธฐ์ด์ ์ผ๋ก ์์์ผํ๋
post-this.tistory.com
๋ฒํผ ๋๋ฅด๋ฉด Hello,World!
๐ง๏ธ
1. ๋์ํ๋ฉด๊ณผ ์ฝ๋
๋ฒํผ์ ๋๋ฅด๋ฉด
↓
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>๊ฐ๋จํ ๋ฒํผ ์์ </title>
</head>
<body>
<h2 th:text="${message}">message</h2>
<form th:action="@{/hello}" method="get">
<button type="submit">๋ฒํผ</button>
</form>
</body>
</html>
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@Controller
public class HelloController {
@GetMapping("/")
public String empty() {
return "button";
}
@GetMapping("/hello")
public String helloWorld(Model model) {
model.addAttribute("message", "Hello, World!");
return "button";
}
}
2. ํ์๋ฆฌํ dependencies ์ถ๊ฐํ๊ธฐ.
ํ์๋ฆฌํ(Thymeleaf)์ ๋ํด์ ์ค๋ช ์ ๊ฐ๋ตํ๊ฒ ํด๋ณด์๋ฉด, ์์ํ HTML์ ํ๋ฉด์ ์ถ๋ ฅํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋จ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค. ์๋ฒ๋ฅผ ํตํด ๋ทฐ ํฌํ๋ฆฟ์ ๊ฑฐ์น๋ฉด ๋์ ์ผ๋ก ๋ณ๊ฒฝ๋ ๊ฒฐ๊ณผ๋ฅผ ํ์ผํ ์ ์๋๋ฐ, ์์ํ HTML์ ์ ์งํ์ฌ ๋ณด์ฌ์ฃผ๊ธฐ ๋๋ฌธ์ ๋ค์ธ๋ด ํ ํ๋ฆฟ(natural templates) ํน์ง์ ๊ฐ์ง๊ณ ์์์ ์ ์ ์๋ค. ๋ณดํต Spring MVC์์ ๋ง์ด ์ฌ์ฉํ๋ค.
โก build.gradle๋ฅผ ์ฐพ์ ๋๋ฅธ๋ค.
โก ์ฝ๋๋ฅผ ๋ณต์ฌํ๋ค.
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
โก dependencies์ ๋ถ์ฌ๋ฃ๋๋ค.
โก ์๋กญ๊ฒ ์ธํ ํ ์ ์๋๋ก ์ด ์ฝ๋ผ๋ฆฌ(?)๋ฅผ ๋๋ฌ์ค๋ค.
โก ์ ๋๋ก ์์ฑ๋์๋์ง ํ์ธํ๋ค.
3. HTML์ ํตํด ๋ฒํผ ๋ง๋ค๊ธฐ.
โก ์ ์ฒด ์ฝ๋
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>๊ฐ๋จํ ๋ฒํผ ์์ </title>
</head>
<body>
<h2 th:text="${message}">message</h2>
<form th:action="@{/hello}" method="get">
<button type="submit">๋ฒํผ</button>
</form>
</body>
</html>
โก resources ๋ฐ์ ์๋ templates์ button.html์ ๋ง๋ค์ด์ค๋ค.
• ๋ง์ผ ์๋ค๋ฉด templates๋ฅผ directory๋ก ๋จผ์ ๋ง๋ค์ด์ค ํ ํ์์ button.html์ ๋ง๋ค๋ฉด ๋๋ค.
โก HTML์ ํ์๋ฆฌํ ํตํด์ ์๋๋๋๋ก ํด์ค๋ค.
<html lang="en" xmlns:th="http://www.thymeleaf.org">
๋ค์ xmlns:th="htttp://www/thymeleaf.org" ์ถ๊ฐํ๋ฉด ๋๋ค.
โก ํ์ดํ ์์ฑํ๊ธฐ.
<title>๊ฐ๋จํ ๋ฒํผ ์์ </title>
โก <body> ์์ฑํ๊ธฐ.
์์ฑํ๊ธฐ ์ ์ ์์์ผ ํ ๋ถ๋ถ์ด ์๋ค. ๋ฐ๋ก th๋ผ๋ ๊ฒ์ธ๋ฐ, th๋ ํ์๋ฆฌํ๋ก ๋์ ์ผ๋ก ์์ฉํด์ผํ๋ ๋ถ๋ถ์ ๋ถ์ฌ์ ์ฌ์ฉํด์ผํ๋ค. ์ฆ ํ์๋ฆฌํ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ xmlns:th="htttp://www/thymeleaf.org"์ ์ ์ํ๊ณ , ๋์ ์ผ๋ก ์์ฉํด์ผํ ๋ถ๋ถ์ th๋ฅผ ์ ์ด์ฃผ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฉด ๊ทธ ๋ถ๋ถ์ ์์ํ HTML์ ์ ์งํ๋ฉฐ ๋์ ์ผ๋ก ๋ณํํด์ค ๊ฒ์ด๋ค.
<h2 th:text="${message}">message</h2>
์ฒซ ํ๋ฉด์ ๋ฒํผ๋ง ์๊ณ ํ ์คํธ๊ฐ ์์๋ค. ๋๋ฒ์งธ ํ๋ฉด์์ ๋ฒํผ์ ๋๋ฅธ ํ ๋ฉ์ธ์ง๊ฐ ๋ํ๋ฌ๋ค. ๊ทธ๋ฌ๋ฉด ์ด ๋ถ๋ถ์ ๋์ ์ผ๋ก ์์ง์ธ ๊ฒ์ด๋ th๋ฅผ ๋ถ์ฌ ์ฝ๋๋ฅผ ์์ฑํด์ค๋ค.
HTML์ ${message}๋ฅผ ํตํด Controller์ ์ฐ๊ฒฐํ ๊ฒ์ด๋ค. ${ }๋ ๋ณ์ ํํ์์ด๋ฉฐ Controller์์ ์ ๋ฌ๋ message๋ผ๋ ๋ณ์๋ผ๋ ์๋ฏธ์ด๋ค. ๊ทธ๋ฌ๋ฉด Controller์์ ๋ฐ์ดํฐ๋ฅผ message๋ก ์ ๋ฌํ์ฌ h2 ๋ถ๋ถ์ ์ํ๋ ํ ์คํธ๊ฐ ๋ณด์ด๊ฒ ๋๋ค.
โก <form> ์์ฑํ๊ธฐ.
form์ ์ฃผ๋ก ์ฌ์ฉ์์ ์๊ฒฌ์ด๋ ์ ๋ณด๋ฅผ ์๊ธฐ ์ํด ์ ๋ ฅํ ํฐ ํ์ ๋ง๋๋๋ฐ ์ฌ์ฉํ๋ค. form์ ์ ๋ ฅ๋ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ์๋ฒ๋ก ์ ์กํ๋ค. ๊ทธ๋ ๊ฒ ๋ณด๋ด์ง ๋ฐ์ดํฐ๋ ์น ์๋ฒ๊ฐ ์ฒ๋ฆฌํ๊ณ , ๊ฒฐ๊ณผ์ ๋ฐ๋ฅธ ์นํ์ด์ง๋ฅผ ๋ณด์ฌ์ฃผ๊ฒ ๋๋ค.
<form th:action="@{/hello}" method="get">
<button type="submit">๋ฒํผ</button>
</form>
form์์ th๋ฅผ ์ฌ์ฉํ๋ค. ๊ทธ ์ด์ ๋ฅผ ์ดํด๋ณด๋ฉด action=@{/hello}์ ๋ํด์ ์์์ผํ๋ค. ์๊น ๋ณ์ ํํ์์ธ $์ ๋ค๋ฅด๊ฒ @๋ก ๋ชจ์์ด ๋ค๋ฅด๋ค. @{ }๋ URL ํํ์์ผ๋ก ์ฃผ๋ก ๋งํฌ๋ form์์ action๊ณผ ํจ๊ป ์ฐ์ธ๋ค. ๊ทธ๋ฌ๋ฉด action์ ๋ฌด์์ผ๊น? action์ form์ ์ ์กํ ์๋ฒ์ชฝ ์คํฌ๋ฆฝํธ ํ์ผ์ ์ง์ ํ๋ ๊ฒ์ด๋ค. ์ข ๋ ์ง๊ด์ ์ด๊ฒ ๋งํด๋ณด์๋ฉด Controller์์ GetMapping(๋ค์ด์จ ๊ฒฝ๋ก์ ๋ง์ถฐ ๋ฐํํ ํ์ด์ง๋ฅผ ์ ์ก)์ ์ฌ์ฉํ '๋ค์ด์จ ๊ฒฝ๋ก'์ ํด๋นํ๋ ๋ถ๋ถ์ด๋ค.
๋ค์ ์ ๋ฆฌํด๋ณด์. action์ Controller์ ๋ฉ์๋ ์ค ์ด๋ ๊ฒ๊ณผ ์ฐ๊ฒฐํ ์ง, ์ฆ ์ด form์ด action ์์ฑ์ ํตํด ์ด๋ ํ์ด์ง๋ฅผ ๋ฐํํ๋ ์ปจํธ๋กค๋ฌ์ ์ฐ๊ฒฐํ ์ง ๊ฒฐ์ ํ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฉด action์ ์ ์ ๊ฒฝ๋ก๋ฅผ ํตํด form์ด ์๋ฒ์ ์ ์กํ๋ ๋์ ์ธ ์์ง์์ ๊ฐ์ง๊ธฐ์ th๋ฅผ ๋ถ์ฌ ํ์๋ฆฌํ๋ฅผ ์ฌ์ฉํ๋๋ก ์ฐ๊ฒฐํ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ฉด ์ด๋ ์ด ์ ๋ณด๋ฅผ ์ ์กํ ๋ ์ด๋ค ๋ฐฉ์์ ์ ํํ ์ง ๊ณ ๋ฅผ ์ ์๋ค. get ๋ฐฉ์๊ณผ post ๋ฐฉ์์ด ์๋๋ฐ, ์ด์ ๋ํ ๋ถ๋ถ์ ๋ธ๋ก๊ทธ์ ๋ฐ๋ก ์ ๋ฆฌํด๋จ์ผ๋ ๊ฐ๋ตํ๊ฒ๋ง ์ค๋ช
ํ๊ณ ๋์ด๊ฐ๊ฒ ๋ค. get์ URL์ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ์ ์กํ๋ ๊ฒ์ผ๋ก ์ฃผ์์ฐฝ์ ๋ณด๋ฉด ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๋ด์๋์ง ์ ์ ์๋ค.
[ GET๊ณผ POST ]
SpringBoot - GET๊ณผ POST ๊ทธ๋ฆฌ๊ณ @GetMapping
[ @Controller์ @RestController ] Spring - @Controller์ @RestController ๊ทธ๋ฆฌ๊ณ ์ํ์ฝ๋[ SpringMVC์ ๋ํ์ฌ ] Spring - Spring MVC๋ฅผ ์์์ผ ์์์ด ๊ฐ๋ฅํ๋ค.์ฒ์์ ๋์ถฉ ํ๋ก์ ํธ๋ฅผ ์์ํด๋ณด๋ คํ์ง๋ง,์ด๋ด์๊ฐ!
post-this.tistory.com
์ด์ ๋ฒํผ์ ์์๋ณด๊ฒ ๋ค.
<form th:action="@{/hello}" method="get">
<button type="submit">๋ฒํผ</button>
</form>
๋ฒํผ์ ๋ง๋๋๋ฐ type์ ์ ํ ์ ์๋ค. type์ 3๊ฐ๋ก ๊ตฌ์ฑ๋์ด์๋๋ฐ submit , button , reset ์ด๋ค. ์ฐ๋ฆฌ๋ ํ์ฌ ์์ํ HTML์ ๊ฐ์ง๊ณ ๊ฐ๋จํ ์์ ๋ฅผ ๋ง๋ค๊ณ ์๋ค. ๊ทธ๋ ๊ธฐ์ ํด๋ฆญ(onclick)์ด๋ผ๋ ๋์์ด ํฌํจ๋์ด์๋ ๊ตฌ์กฐ๋ก ๋ง๋ค์ด์ผ ๋ ํจ์จ์ ์ด๋ค. ๊ทธ๋์ submit๋ฅผ ์ฌ์ฉํ๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ onclick์ด ์์ด๋ submit์ผ๋ก ๊ฒฐ์ ํ๋ฉด form ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฅ ์ ์ก์ํจ๋ค.(๋ง์ฝ ์๋ฐ์คํฌ๋ฆฝํธ์ ํจ๊ป ์์ ๋ฅผ ๋ง๋ ๋ค๋ฉด button type์ผ๋ก ์ ํํ๋ฉด ๋๋ค.)
4. HelloController
โก ์ ์ฒด ์ฝ๋
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@Controller
public class HelloController {
@GetMapping("/")
public String empty() {
return "button";
}
@GetMapping("/hello")
public String helloWorld(Model model) {
model.addAttribute("message", "Hello, World!");
return "button";
}
}
โก ์ฒ์ ๋ค์ด๊ฐ์ ๋ ํ๋ฉด ๋ง๋ค๊ธฐ.
@GetMapping("/")
public String empty() {
return "button";
}
GetMapping("/")์์ "/"๋ ๋ฃจํธ ๊ฒฝ๋ก๋ผ๋ ์๋ฏธ์ด๋ค. ์ฌ์ฉ์๊ฐ ๋ฃจํธ ๊ฒฝ๋ก๋ก ๋ค์ด์ค๋ฉด button ํ๋ฉด์ผ๋ก ๋ฐํํ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฉด ์๊น ์์ ์๋ HTML์ ๋ค์ ์ดํด๋ณด์. ๋ฒํผ์ด ๋๋ ค์ผ ๋ฉ์ธ์ง๊ฐ ํธ์ถ๋๋๋ก ๋ง๋ค์๋ค. ๊ฒฝ๋ก๋ฅผ ๋ณด๋ฉด ๋ฃจํธ ๊ฒฝ๋ก๋ก ์ฌ์ฉ์๊ฐ ํ์ด์ง์ ๋ค์ด์์ ๊ฒฝ์ฐ(์๋ฌด๊ฒ๋ ํ์ง ์์)์ ํด๋นํ๋ค. ๊ทธ๋ฌ๋ฉด ์์ง ๋ฒํผ์ ๋๋ฅด๊ธฐ ์ ์ด๋, ๋์ ์ธ th๋ก ์์ฑํ ๋ถ๋ถ์ ์ ์ธํ๋ฉด submit ํ์ ์ผ๋ก ์ค์ ํด๋ ๋ฒํผ๋ง ๋์์ค์ผ ํ ๊ฒ์ด๋ค.
โก ๋ฒํผ์ด ๋๋ ธ์ ๊ฒฝ์ฐ, ๋ฉ์ธ์ง๋ฅผ ๋ฃ์ด ํ๋ฉด ๋ฐํํ๊ธฐ.
@GetMapping("/hello")
public String helloWorld(Model model) {
model.addAttribute("message", "Hello, World!");
return "button";
}
HTML์์ submit ๋ฐฉ์์ ํตํด, ๋๋ฅด๋ฉด ๋ฐ๋ก form์ด ์ ์ก๋๋ button์ ๋ง๋ค์๋ค. ๊ทธ๋ ๊ฒ /hello ๊ฒฝ๋ก๋ฅผ ๊ฐ์ง action์ Get ์์ฒญ์ผ๋ก ์ ์ก๋๋ฉด, ์ฌ๊ธฐ @GetMapping("/hello")์์ ๋ฐ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ฒ ๋๋ค.
Model์ด ์๋ค. Model์ SpringMVC์์ ๋ทฐ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๊ฐ์ฒด์ด๋ค. ์ฆ ์ปจํธ๋กค๋ฌ์์ ๋ทฐ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋ ์ฌ์ฉ๋๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค. Model์ ํ์๋ฆฌํ, JSP์ ๊ฐ์ ํ ํ๋ฆฟ ์์ง๊ณผ ๊ด๊ณ์์ด ์๋๋๋ค. model์ Model ํ์ ์ผ๋ก ์ ๋ฌ๋๋ฉฐ addAtrribute๋ฅผ ํตํด ์์ฑ์ ์ ํ ์ ์๋ค. ํด๋น ์ฝ๋์์ ํค๋ message, ์ค์ ๋ฐ์ดํฐ ๊ฐ์ Hello, World!๋ผ๊ณ ์ ํ๋ค.
์ด์ ์ด ์์ฑ์ ๋ค์ button์ด๋ผ๋ ์ด๋ฆ์ ๊ฐ์ง HTML๋ก ์ ๋ฌ๋ ๊ฒ์ด๋ค. HTML ์ฝ๋๋ฅผ ๋ค์ ์ดํด๋ณด๋ฉด ${message}์ด ๋ถ๋ถ์ Hello, World!๊ฐ ์ค๋ ๊ฒ์ ์ ์ ์๋ค.
๐ชฝ
"ํ๋ฆฐ ๋ด์ฉ์ด ์์ ์ ์์ต๋๋ค."
[ ๋ธ๋ก๊ทธ์ ์ด ๋ด์ฉ๋ค์ ์ถ์ฒ๋ ์๋์ ์ ์ด๋ํ ๋
๋ค์ด๊ฐ์ ์ฝ์ด๋ณด์๋ฉด ๋์ฑ ๋์์ด ๋์ค ๋ฏ ํฉ๋๋ค ]
Thymeleaf(ํ์๋ฆฌํ)๋ ? ํ์๋ฆฌํ์ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์์๋ณด๊ธฐ
Thymeleaf(ํ์๋ฆฌํ)๋ ? ํ์๋ฆฌํ๋ JSP, Freemarker์ ๊ฐ์ ํ ํ๋ฆฟ ์์ง์ ์ผ์ข ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ํน์ง์ ๊ฐ๊ณ ์์ต๋๋ค. ์๋ฒ ์ฌ์ด๋ HTML ๋ ๋๋ง (SSR) ๋ฐฑ์๋ ์๋ฒ์์ HTML์ ๋์ ์ผ๋ก ๋ ๋๋ง ํ๋ ์ฉ
hstory0208.tistory.com
์คํ๋ง ํ์๋ฆฌํ(Thymleaf) ํ๋์ ์ ๋ฆฌํ๊ธฐ
ํ์๋ฆฌํ๋ฅผ ์ฌ์ฉํ๊ธฐ์ ์ ํ์ธํด์ผํ ์ ๋ณด 1.ํ์๋ฆฌํ ์์กด์ฑ์ด ์ ๋๋ก ์ฃผ์ ๋๊ณ ์๋์ง ํ์ธํ๋ค. ํ์๋ฆฌํ๋ฅผ '์ ๋๋ก' ์ฐ๋ ค๋ฉด ์์ํ๊ธฐ์ ์ ํ์๋ฆฌํ๊ฐ ์ ๋๋ก ์ค์น๋์ด์๋์ง ํ์ธํ์. 2. M
taehoung0102.tistory.com
HTML : ํผ(form) ์ดํด
ํผ์ ์๊ฒ ๋ชจ๋ฅด๊ฒ ์น์์ ๋ง์ด ์ฌ์ฉํฉ๋๋ค. ์ฌ์ฉ์ ์๊ฒฌ์ด๋ ์ ๋ณด๋ฅผ ์๊ธฐ ์ํด ์ ๋ ฅํ ํฐ ํ์ ๋ง๋๋ ๋ฐ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ํผ์ ์ ๋ ฅ๋ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ์๋ฒ๋ก ์ ์กํฉ๋๋ค. ์ ์กํ ๋ฐ์ด
www.nextree.co.kr
[Html] form ํ๊ทธ์ input ์์๋ค, GET / POST ๋ฐฉ์
โก๏ธ form html์ ์์ ์ค ํ๋์ธ form์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์์ ์์ด์ ๋ง์ด ์ฌ์ฉํ๋ ์์ ์ค ํ๋์ ๋๋ค. form ํ๊ทธ ์์ ์ฝ์ ํ submit ์ด๋ฒคํธ๊ฐ ๋ฐ๋๋๋ฉด, ์ ์๋ method ์์ฑ type์ผ๋ก action์ ํตํด ๋ชฉ
lasbe.tistory.com