Bibi's DevLog ๐ค๐
ํ์๊ฐ์ ๋ฐ ํ์์กฐํ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ - <form>, GET/POST, ๋ฆฌ๋ค์ด๋ ์ ๋ณธ๋ฌธ
ํ์๊ฐ์ ๋ฐ ํ์์กฐํ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ - <form>, GET/POST, ๋ฆฌ๋ค์ด๋ ์
๋น๋น bibi 2021. 3. 9. 18:31ํ์๊ฐ์ ๊ธฐ๋ฅ ๊ตฌํ
ํ์๊ฐ์ ํ์ด์ง์์ ํ์๊ฐ์ ์ ํ๋ฉด, ์ฌ์ฉ์์ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์๋ฒ์์ ๋ฐ์ ์ถ๋ ฅํ๋ค.
<form>
์๋ฒ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋ <form>
ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ค.
์์ฑ
action
: ์๋ฒ์ ์์ฒญ์ ๋ณด๋ผ ๋ ์ด๋ค URL๋ก ๋ณด๋ผ์ง๋ฅผ ์ง์ ํ ์ ์์.<form action="/create">
: ํด๋น form์ผ๋ก๋ถํฐ/create
๋ก ์๋ฒ์ ์์ฒญ์ ๋ณด๋
URL์ด ์ถ๊ฐ๋๋ฉด ํญ์ ์์ํ๋ Controller ๋ฐ ๋ฉ์๋๊ฐ ์์ด์ผ ํ๋ค.
- formํ๊ทธ์ ์๋ฌด ์์ฑ์ ์ ๋ ฅํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก GET๋ฐฉ์์ผ๋ก ํต์ ํ๋ค.
index.mustache
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Index</title>
</head>
<body>
<form action="/create">
<div>
<label for="userid">์์ด๋</label>
<input type="text" name="userid" placeholder="์์ด๋">
</div>
<div>
<label for="password">๋น๋ฐ๋ฒํธ</label>
<input type="password" name="password" placeholder="๋น๋ฐ๋ฒํธ">
</div>
<div>
<label for="username">์ด๋ฆ</label>
<input type="text" name="username" placeholder="์ด๋ฆ">
</div>
<div>
<label for="useremail">์ด๋ฉ์ผ</label>
<input type="email" name="useremail" placeholder="์ด๋ฉ์ผ">
</div>
<button type="submit">์ ์ถ</button>
</form>
</body>
</html>
์๋ฌด๊ฒ๋ ์ ๋ ฅํ์ง ์๊ณ ์ ์ถํ์ ๋์ URL
: http://localhost:8080/create?userid=&password=&username=&useremail=
UserController.java
package com.codessquad.qna.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class UserController {
@GetMapping("/create")
public String create(String userid, String password, String username, String useremail) {
System.out.println("์์ด๋ : " + userid);
System.out.println("๋น๋ฐ๋ฒํธ : " + password);
System.out.println("์ด๋ฆ : " + username);
System.out.println("์ด๋ฉ์ผ : " + useremail);
return "index";
}
}
์ถ๋ ฅ ๊ฒฐ๊ณผ : ์์ด๋ : a
๋น๋ฐ๋ฒํธ : b
์ด๋ฆ : c
์ด๋ฉ์ผ : d@e
์ฆ, html์์ name์ ํด๋นํ๋ ๊ฐ๋ค (userid
, password
, username
, useremail
)์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์์ ์ฌ์ฉํ ์ ์๋ค.
๋จ์ : GET๋ฐฉ์์ URL๋ก ๊ฐ์ด ์ ๋ฌ๋์ด ๋น๋ฐ๋ฒํธ ๋ฑ ๋ ธ์ถ์ํ์ด ์๋ค. ์ด๋ด ๋๋
ํด๊ฒฐ : formํ๊ทธ์
method="post"
์์ฑ์ ์ถ๊ฐํ๊ณ , ์ปจํธ๋กค๋ฌ ์ด๋ ธํ ์ด์ ์@PostMapping()
์ผ๋ก ๋ณ๊ฒฝํด POST๋ฐฉ์์ผ๋ก ์ ๋ฌํ๋ฉด ๋๋ค.POST๋ฐฉ์์ ๋ฐ์ดํฐ๋ฅผ URL๋ก ์ ๋ฌํ์ง ์์ ์ ๋ณด๊ฐ ๋ ธ์ถ๋์ง ์๋๋ค.
GET๋ฐฉ์๊ณผ POST๋ฐฉ์
GET ๋ฐฉ์ : ๋ฐ์ดํฐ ์์ฒญ ๋ฐ ์กฐํํ ๋.
POST ๋ฐฉ์ : ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํด ์ถ๊ฐ ๋ฐ ์์ ํ ๋.
์ฐ์ ์ ์ด ์ ๋๋ง ์๊ณ ์ฌ์ฉํ์.
@GetMapping("/create")
public String create(String userid, String password, String username, String useremail)
์ฌ์ฉ์๋ก๋ถํฐ ์ด๋ณด๋ค ๋ ๋ง์ ๊ฐ์ ์ ๋ ฅ๋ฐ์ผ๋ฉด ๋ฉ์๋ ์ ์ธ๋ถ๊ฐ ์ ์ ๊ธธ์ด์ง๋ค.
๋ณ๋์ ํด๋์ค๋ก ๋ถ๋ฆฌํด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
User.java
package com.codessquad.qna.user;
public class User {
private String userId;
private String password;
private String userName;
private String userEmail;
public void setUserId(String userId) {
this.userId = userId;
}
public void setPassword(String password) {
this.password = password;
}
public void setUserName(String userName) {
this.userName = userName;
}
public void setUserEmail(String userEmail) {
this.userEmail = userEmail;
}
@Override
public String toString() {
return "User{" +
"userId='" + userId + '\'' +
", password='" + password + '\'' +
", userName='" + userName + '\'' +
", userEmail='" + userEmail + '\'' +
'}';
}
}
<form>
ํ๊ทธ์ ๋ถ์ฌ๋ name
๊ฐ๊ณผ ๊ฐ์ ์ด๋ฆ์ผ๋ก setter ๋ฐ ์ธ์คํด์ค๋ณ์๋ฅผ ์ค์ ํ๋ฉด ์ด๋ ๊ฒ ๋ณ๋์ ํด๋์ค๋ก ๋ถ๋ฆฌํ ์ ์๋ค.
โ ์ด๋ฆ์ด ๊ฐ์์ผ ์คํ๋ง์ด ์๋์ผ๋ก setter๋ฅผ ํตํด private๋ณ์์ setter๋ก ๊ฐ์ ๋ฃ์ด ์ค ์ ์๋ค!
- private๋ก ์ ์ธํ๊ณ setter๋ก ๊ฐ์ ๋ฃ๋๋ค.
- ์ถ๋ ฅ ํธ์์ฑ์ ์ํด toString()์ ์ค๋ฒ๋ผ์ด๋ฉํ๋ค.
์ฌ์ฉ์ ๋ชฉ๋ก ๊ธฐ๋ฅ ๊ตฌํ
ํ์๊ฐ์ ์ ์๋ฃํ ์ฌ์ฉ์ ๋ชฉ๋ก์ ์กฐํํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค.
UserController.java
package com.codessquad.qna.controller;
import com.codessquad.qna.user.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import java.util.ArrayList;
import java.util.List;
@Controller
public class UserController {
private List<User> users = new ArrayList<>();
@GetMapping("/create")
public String create() {
return "index";
}
@PostMapping("/create")
public String register(User user) {
System.out.println("user : " + user);
users.add(user);
return "redirect:/list";
}
@GetMapping("/list")
public String list(Model model) {
model.addAttribute("users", users);
return "list";
}
}
private List<User> users = new ArrayList<>();
- ์ฌ์ฉ์ ๋ชฉ๋ก์ ์ ์ฅํ ์ปฌ๋ ์ ์ถ๊ฐ
public String list(Model model)
- list.html์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด Model ์ฌ์ฉ
list.mustache
<!DOCTYPE HTML>
<html>
<head>
<title>List</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<h1>ํ์ ๋ชฉ๋ก</h1>
<div>
<table>
<caption>์ฌ์ฉ์ ๋ชฉ๋ก</caption>
<thead>
<tr>
<th>์ฌ์ฉ์ ์์ด๋</th>
<th>์ด๋ฆ</th>
<th>์ด๋ฉ์ผ</th>
</tr>
</thead>
<tbody>
{{#users}}
<tr>
<td>{{userId}}</td>
<td>{{name}}</td>
<td>{{email}}</td>
</tr>
{{/users}}
</tbody>
</table>
</div>
</body>
</html>
{{#users}}
, {{/users}}
: mustache์ for๋ฌธ ๋ฌธ๋ฒ. users๋ผ๋ ๋ฐ๋ณต๋์๊ฐ์ฒด๋ฅผ ๋ ํ๊ทธ ์ฌ์ด์์ ๋ฐ๋ณตํ๋ค
{{userId}}
, {{userName}}
, {{userEmail}}
: ๋ฐ๋ณต๋์๊ฐ์ฒด์ ๋ด๋ถ ์์ (User
์ ์ธ์คํด์ค๋ณ์)๋ฅผ ์ง์ ํด ๊ทธ ๊ฐ์ ์ถ๋ ฅํ ์ ์๋ค
๋ฆฌ๋ค์ด๋ ์
ํด๋น URL๋ก ์ด๋ํ๋๋ก ๋ง๋ค๊ธฐ.
return "redirect:/list"
: ๋ฉ์๋๊ฐ ์ข
๋ฃ๋ ๋ /list
๋ก ํ์ด์ง๋ฅผ ์ด๋์ํจ๋ค.
ํ์ฌ ์ ์ฅํ ์ปฌ๋ ์ (ArrayList)์ ์๋ฒ๊ฐ ์ฌ์์ํ์ ๋ ๊ทธ ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ์ฌ๋ผ์ง๋ค.
์? ๋ฐ์ดํฐ๊ฐ RAM ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์. (์ ์ ์ข ๋ฃ์ ๋ฐ์ดํฐ ์ฌ๋ผ์ง)
์ด์ ํ๋๋์คํฌ๋ฅผ ์ฌ์ฉํ๋ ํ์ผ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์์ ์ด๋ค.