CRUD : ๊ฒ์๊ธ์ ์์ฑ (Create) ์กฐํ (Read) ์์ (Update) ์ญ์ (Delete) ํ๋ ๊ฒ.
๐ ํผ ๋ฐ์ดํฐ๋?
- form data
- HTML ์์์ธ <form> ํ๊ทธ์ ์ค๋ ค ์ ์ก๋๋ ๋ฐ์ดํฐ
- <form> ํ๊ทธ์ ์ค์ด ๋ณด๋ธ ๋ฐ์ดํฐ๋ ์๋ฒ์ ์ปจํธ๋กค๋ฌ๊ฐ ๊ฐ์ฒด (DTO : Data Transfer Object) ์ ๋ด์ ๋ฐ๋๋ค.
- DTO๋ก ๋ฐ์ ๋ฐ์ดํฐ๋ ์ต์ข ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋๋ค.
1. ํผ ๋ฐ์ดํฐ๋ฅผ DTO๋ก ๋ฐ๊ธฐ
new.mustache
{{>layouts/header}}
<form action="">
<input type="text">
<textarea></textarea>
<button type="submit">Submit</button>
</form>
{{>layouts/footer}}
2. ์ปจํธ๋กค๋ฌ ๋ง๋ค๊ธฐ
ArticleController
package com.example.firstproject.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller //์ปจํธ๋กค๋ฌ ์ ์ธ.
public class ArticleController { //URL ์์ฒญ ์ ์.
@GetMapping("/articles/new") //๋ฉ์๋ ์์ฑ ๋ฐ ๋ฐํ๊ฐ ์์ฑ.
public String newArticleForm() {
return "articles/new";
}
}
3. ๋ถํธ์คํธ๋ฉ์ผ๋ก ํผ ๊พธ๋ฏธ๊ธฐ
new.mustache
{{>layouts/header}}
<form action="" class="container">
<div class="mb-3">
<label class="form-label">์ ๋ชฉ</label>
<input type="text" class="form-control">
</div>
<div class="mb-3">
<label class="form-label">๋ด์ฉ</label>
<textarea class="form-control"></textarea>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
{{>layouts/footer}}
4. ํผ ๋ฐ์ดํฐ ์ ์ก & ๋ฐ๊ธฐ
ํผ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ๋์๋ 2๊ฐ์ง ์ ๋ณด๊ฐ ํ์ํ๋ค.
- ๋ฐ์ดํฐ๋ฅผ ์ด๋๋ก ๋ณด๋ผ์ง (action ์์ฑ)
- ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ๋ณด๋ผ์ง์ ๊ดํ ์ ๋ณด (method ์์ฑ)
- action : URL ์ฐ๊ฒฐ ์ฃผ์๋ฅผ ์ ์ด action="/articles/create" ๋ก ์ค์ . localhost:8080/articles/create ํ์ด์ง๋ก ํผ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ธ๋ค๋ ์๋ฏธ.
- method : ์์ฑ ๊ฐ. get๊ณผ post, 2๊ฐ์ง๋ฅผ ์ค์ ํ ์ ์๋ค. ์ฌ๊ธฐ์๋ method="post" ๋ฐฉ์์ผ๋ก ์ค์ ํ๋ค.
new.mustache
{{>layouts/header}}
<form action="/articles/create" method="post" class="container">
<div class="mb-3">
<label class="form-label">์ ๋ชฉ</label>
<input type="text" class="form-control">
</div>
<div class="mb-3">
<label class="form-label">๋ด์ฉ</label>
<textarea class="form-control"></textarea>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
{{>layouts/footer}}
ArticleController
@PostMapping("/articles/create") //๋ทฐ ํ์ด์ง์์ ํผ ๋ฐ์ดํฐ๋ฅผ post๋ฐฉ์์ผ๋ก ์ ์ก -> ์ปจํธ๋กค๋ฌ์์ ๋ฐ์ ๋๋ postmapping์ผ๋ก ๋ฐ์.
public String createArticle(){
return "";
}
5. DTO ๋ง๋ค๊ธฐ
์ปจํธ๋กค๋ฌ์์ ํผ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ๋ DTO (Data Transfer Object)์ ๋ด์ ๋ฐ๋๋ค.
DTO๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ ํจํค์ง๋ฅผ ๋ง๋ ๋ค.
ArticleForm ํ์ผ์ด DTO๊ฐ ๋๋ค.
ArticleForm DTO
package com.example.firstproject.dto;
public class AritcleForm {
private String title; //์ ๋ชฉ์ ๋ฐ์ ํ๋.
private String content; //๋ด์ฉ์ ๋ฐ์ ํ๋.
//์ ์ก๋ฐ์ ์ ๋ชฉ๊ณผ ๋ด์ฉ์ ํ๋์ ์ ์ฅํ๋ ์์ฑ์ ์ถ๊ฐ.
public AritcleForm(String title, String content) {
this.title = title;
this.content = content;
}
//๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์๋์ง ํ์ธํ toString() ๋ฉ์๋ ์ถ๊ฐ.
@Override
public String toString() {
return "AritcleForm{" +
"title='" + title + '\'' +
", content='" + content + '\'' +
'}';
}
}
์ ๋ ฅ ํผ์์ ์ ๋ชฉ๊ณผ ๋ด์ฉ์ ์ ์กํ ์์ ์ด๋ DTO์๋ ํ๋ 2๊ฐ๊ฐ ํ์ํ๋ค.
6. ํผ ๋ฐ์ดํฐ๋ฅผ DTO์ ๋ด๊ธฐ
์ ์ก๋ฐ์ ํผ ๋ฐ์ดํฐ๋ฅผ DTO์ ๋ด์ ๋ณด๊ฒ ๋ค.
ArticleController
@PostMapping("/articles/create") //๋ทฐ ํ์ด์ง์์ ํผ ๋ฐ์ดํฐ๋ฅผ post๋ฐฉ์์ผ๋ก ์ ์ก -> ์ปจํธ๋กค๋ฌ์์ ๋ฐ์ ๋๋ postmapping์ผ๋ก ๋ฐ์.
public String createArticle(AritcleForm form){ //ํผ ๋ฐ์ดํฐ๋ฅผ DTO๋ก ๋ฐ๊ธฐ
System.out.println("DTO ๋ฐ๊ธฐ"+form.toString()); //DTO์ ํผ ๋ฐ์ดํฐ๊ฐ ์ ๋ด๊ฒผ๋์ง ํ์ธ
return "";
}
7. ์ ๋ ฅ ํผ๊ณผ DTO ํ๋ ์ฐ๊ฒฐํ๊ธฐ
์ ๋ ฅ ํผ์์ ์ ์กํ ๋ฐ์ดํฐ๋ฅผ DTO๋ก ๋ฐ๊ธฐ ์ํด ํ๋ 2๊ฐ, title๊ณผ content๋ฅผ ์ ์ธํ๋ค.
์ด ํ๋์ ๊ฐ์ด ๋ค์ด๊ฐ๋ ค๋ฉด new.mustache ์ ๋ ฅ ํผ์ ํ๋๋ช ์ ์ง์ ํด ์ค์ผ ํ๋ค.
๊ทธ๋์ผ ํด๋น ์ ๋ ฅ ํผ์ด DTO์ ํ๋์ ์ฐ๊ฒฐ๋๋ค.
new.mustache
{{>layouts/header}}
<form action="/articles/create" method="post" class="container">
<div class="mb-3">
<label class="form-label">์ ๋ชฉ</label>
<input type="text" class="form-control" name="title">
</div>
<div class="mb-3">
<label class="form-label">๋ด์ฉ</label>
<textarea class="form-control" name="content"></textarea>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
{{>layouts/footer}}
๐ ๊ณผ์ ์์ฝ
- ๋ทฐ ํ์ด์ง๋ฅผ ๋ง๋ค๊ณ <form> ํ๊ทธ์ action ์์ฑ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ด๋๋ก ๋ณด๋ผ์ง, method ์์ฑ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ๋ณด๋ผ์ง ์ ์ํ๋ค.
- ์ปจํธ๋กค๋ฌ๋ฅผ ๋ง๋ค๊ณ PostMapping ๋ฐฉ์์ผ๋ก URL ์ฃผ์๋ฅผ ์ฐ๊ฒฐํ๋ค.
- ์ ์ก๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ๋ ๊ฐ์ฒด์ธ DTO๋ฅผ ๋ง๋ ๋ค.
- ์ปจํธ๋กค๋ฌ์์ ํผ ๋ฐ์ดํฐ๋ฅผ ์ ์ก๋ฐ์ DTO์ ๋ด๋๋ค.
- (๋์) ์ฝ๋ฉ ์์จํ์ต ์คํ๋ง ๋ถํธ 3 ์๋ฐ ๋ฐฑ์๋ ๊ฐ๋ฐ ์ ๋ฌธ
https://www.yes24.com/Product/Goods/119952151
์ฝ๋ฉ ์์จํ์ต ์คํ๋ง ๋ถํธ 3 ์๋ฐ ๋ฐฑ์๋ ๊ฐ๋ฐ ์ ๋ฌธ - ์์ค24
์คํ๋ง ๋ถํธ ๋ฐฑ์๋ ๊ฐ๋ฐ,์ค์ต ๋ฌธํฑ์ ๋ฎ์ถ๊ณ ์์ ์๊ฒ ์์ํ์!์คํ๋ง ๋ถํธ๋ฅผ ์ฒ์ ์ ํ๋ ์ ๋ฌธ์์ ์ด๋ฏธ ๊ณต๋ถํ์ง๋ง ๋ถ์กฑํ๋ค๊ณ ๋๋ผ๋ ๋ถ๋ค์ ์ํ ์ฑ ์ ๋๋ค. ๊ฒ์ํ์ ๋ง๋ค๋ฉฐ ํด๋ผ์ด์ธํธ
www.yes24.com