๐Ÿ’ป PROJECT/[์Šคํ”„๋ง ๋ถ€ํŠธ] ๊ฒŒ์‹œํŒ

[์Šคํ”„๋ง ๋ถ€ํŠธ] 7. ๊ฒŒ์‹œํŒ ๋งŒ๋“ค๊ธฐ ์ˆ˜์ • ์ฒ˜๋ฆฌ

devCloud 2023. 10. 26. 15:05
728x90

01. ์ˆ˜์ • ๋ฒ„ํŠผ ์ƒ์„ฑ

์•ž ์žฅ์—์„œ ํ–ˆ๋˜ ์‚ญ์ œ ์ฒ˜๋ฆฌ์™€ ๋น„์Šทํ•˜๊ฒŒ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ ๋‹ค.

 

01-1. boardview.html์—์„œ ๋ฒ„ํŠผ์„ ์ถ”๊ฐ€

view ํŒŒ์ผ์— ์ˆ˜์ • ๋ฒ„ํŠผ์„ ์ถ”๊ฐ€ํ•˜๊ณ , thymeleaf๋ฅผ ํ†ตํ•ด์„œ ์„ ํƒํ•œ ๊ฒŒ์‹œ๋ฌผ์ด ์ˆ˜์ • ํŽ˜์ด์ง€๋กœ ๋„˜์–ด๊ฐ€๊ฒŒ ํ•œ๋‹ค.

 

button์ผ ๋•Œ

<button th:onclick="|location.href='@{/board/modify/{id}(id=${article.id})}'|">์ˆ˜์ •ํ•˜๊ธฐ</button>

a ํƒœ๊ทธ์ผ ๋•Œ

<a th:href="@{/board/modify/{id}(id=${board.id})}">์ˆ˜์ •ํ•˜๊ธฐ</a>

 

01-2. ์ˆ˜์ • ํŽ˜์ด์ง€ ์ƒ์„ฑ(boardmodify.html)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>๊ฒŒ์‹œ๋ฌผ ์ž‘์„ฑ ํผ</title>
</head>

<style>
    .layout {
        width : 500px;
        margin : 0 auto;
        margin-top : 40px;
    }
    .layout input {
        width : 100%;
        box-sizing : border-box;
    }
    .layout textarea {
        width : 100%;
        margin-top : 10px;
        min-height : 300px;
    }
</style>

<body>
    <div class="layout">
      <form action="/board/writedo" method="post">
        <input name="title" type="text">
        <textarea name="content"></textarea>
        <button type="submit">์ž‘์„ฑ</button>
      </form>
    </div>
</body></html>

board > src > main > resource > templates ์— ์ˆ˜์ •ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ ๋‹ค. (boardwrite์™€ ๊ฐ™์•„์„œ ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌ/๋ถ™์—ฌ๋„ฃ๊ธฐ ํ•จ)

 

01-3. BoardController์—์„œ url Mapping

• path variable

  • url์„ ์ด์šฉํ•ด ํŒŒ๋ผ๋ฏธํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. Rest API ํ˜ธ์ถœ ์‹œ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.
  • @GetMapping path์˜ {๋ณ€์ˆ˜} ๊ด„ํ˜ธ ์•ˆ์— ๊ด„ํ˜ธ ๊ทธ๋ ˆ์ด์Šค๋ฅผ ์—ด์–ด URL์— ์‚ฌ์šฉ๋  ๋ณ€์ˆ˜ ๋ช…์„ ์ž…๋ ฅํ•œ๋‹ค.
    • GetMapping๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ Method๋„ ๊ฐ€๋Šฅ(PostMapping, DeleteMapping, PutMapping ๋“ฑ)
  • PathVariable ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•ด์„œ {ํ…œํ”Œ๋ฆฟ ๋ณ€์ˆ˜}์™€ ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ–๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค.

 

๋กœ์ง : url์ด ๋“ค์–ด์™”์„ ๋•Œ, {id} ๋ถ€๋ถ„์ด @PathVariable์— ์ธ์‹์ด ๋ผ์„œ Integerํ˜•ํƒœ์˜ id๋กœ ๋“ค์–ด์˜จ๋‹ค.

 

์‹คํ–‰ํ•˜๊ธฐ

html ํŒŒ์ผ์—์„œ ์ƒ์„ฑํ–ˆ๋˜ ์ˆ˜์ •ํ•˜๊ธฐ ๋ฒ„ํŠผ์ด ์ƒ๊ฒผ๊ณ , ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด /board/modify ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ, ์ƒ์„ธ ํŽ˜์ด์ง€์˜ url์€ ?id=3์œผ๋กœ ๋˜์–ด ์žˆ์ง€๋งŒ, ์ˆ˜์ • ํŽ˜์ด์ง€์˜ url์„ ๋ณด๋ฉด 3์œผ๋กœ ๋˜์–ด ์žˆ๋‹ค. ์ด๋Š” @PathVariable๋ฅผ ์‚ฌ์šฉํ•ด์„œ url์ด ๊น”๋”ํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋œ ๊ฒƒ์ด๋‹ค.

 

02. ์ƒ์„ธ ํŽ˜์ด์ง€์˜ ๊ธ€์ด ์ˆ˜์ • ํŽ˜์ด์ง€์— ๊ทธ๋Œ€๋กœ ๋„˜์–ด์˜ค๋„๋ก ์ฒ˜๋ฆฌ

์ˆ˜์ • ํŽ˜์ด์ง€์—๋Š” ๊ธฐ์กด์— ์ ํ˜€์žˆ๋Š” ๊ธ€์—์„œ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ˆ˜์ • ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์ƒ์„ธ ํŽ˜์ด์ง€์— ์žˆ๋˜ ๊ธ€์ด ์ˆ˜์ • ํŽ˜์ด์ง€์—๋„ ๋„˜์–ด์˜ค๊ฒŒ ํ•œ๋‹ค. ( modify ํŒŒ์ผ์— ๊ธฐ์กด ๊ฐ’์ด ๋„˜์–ด์™€์•ผ ํ•œ๋‹ค.)

 

02-1. BoardController ์ˆ˜์ •(Model ์ถ”๊ฐ€)

 Model - JSP์— ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์•„์„œ ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š” ์กด์žฌ์ด๋‹ค. Model ๊ฐ์ฒด๋Š” Controller ์—์„œ ์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์•„ View ๋กœ ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค.

  • model.addAttribute(String name, Object value) : value ๊ฐ์ฒด๋ฅผ name ์ด๋ฆ„์œผ๋กœ ์ถ”๊ฐ€ํ•จ. ๋ทฐ ์ฝ”๋“œ์—์„œ๋Š” name์œผ๋กœ ์ง€์ •ํ•œ ์ด๋ฆ„์„ ํ†ตํ•ด์„œ value๋ฅผ ์‚ฌ์šฉํ•จ.

 

์•„๋ž˜๋Š” ์•ž์—์„œ ์ž‘์„ฑํ–ˆ๋˜ boardView ์ปจํŠธ๋กค๋Ÿฌ์ธ๋ฐ boardModify ์ปจํŠธ๋กค๋Ÿฌ์™€ ์ฝ”๋“œ๊ฐ€ ๊ฐ™๋‹ค. ์ด๋Š” ์ƒ์„ธ ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ์ด ์ˆ˜์ • ํŽ˜์ด์ง€์—์„œ๋„ ๊ฐ™์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋™์ผํ•˜๊ฒŒ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

 

02-2. boardmodify.html ์ˆ˜์ •(thymeleaf ์ถ”๊ฐ€)

<!DOCTYPE html>
<html lang="en" xmlns:th="http://thymeleaf.org">
                        .
                        .
                        .
<body>
  <div class="layout">
    <form action="/board/writedo" method="post">
      <input name="title" type="text" th:value="${article.title}">
      <textarea name="content" th:text="${article.content}"></textarea>
      <button type="submit">์ˆ˜์ •</button>
    </form>
  </div>
</body></html>

• th:text ์†์„ฑ

  • Thymeleaf์˜ th:text ์†์„ฑ์€ ์š”์†Œ ์˜ ํ…์ŠคํŠธ ๋‚ด์šฉ์„ ์„ค์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
  • ๋˜ํ•œ ์ด๋Š” ํ‘œ์ค€ HTML ํ…์ŠคํŠธ ์†์„ฑ์„ ๋Œ€์ฒดํ•œ๋‹ค.
  • ๋”ฐ๋ผ์„œ ์ œ๋ชฉ, ๋‹จ๋ฝ, ๋ ˆ์ด๋ธ” ๋“ฑ๊ณผ ๊ฐ™์€ ํ…์ŠคํŠธ ์ฝ˜ํ…์ธ ๋ฅผ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  HTML ์š”์†Œ ๋‚ด์— ์ด๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.
  • ๋˜ํ•œ ์ด ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์›น ํŽ˜์ด์ง€์˜ ์ œ๋ชฉ๊ณผ ๊ฐ™์€ ๋™์  ํ…์ŠคํŠธ ์ฝ˜ํ…์ธ ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.

 

• th:value ์†์„ฑ

  • ๋ฐ˜๋ฉด์— th:value ์†์„ฑ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์ด ํ•„์š”ํ•œ ์š”์†Œ์˜ ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค . ์ž…๋ ฅ ํ•„๋“œ, ํ™•์ธ๋ž€, ๋ผ๋””์˜ค ๋ฒ„ํŠผ, ๋“œ๋กญ๋‹ค์šด๊ณผ ๊ฐ™์€ ์š”์†Œ๊ฐ€ ์ด ๋ฒ”์ฃผ์— ์†ํ•œ๋‹ค.
  • value ์†์„ฑ์ด ์žˆ๋Š” ๋ชจ๋“  ์š”์†Œ์—์„œ ํ‘œ์ค€ HTML value ์†์„ฑ ๋Œ€์‹  ์ด ์†์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค . ๋”ฐ๋ผ์„œ ํ•ด๋‹น ํŠน์„ฑ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์š”์†Œ(์˜ˆ: ๋‹จ๋ฝ)์— ์ถ”๊ฐ€ํ•ด๋„ ์•„๋ฌด๋Ÿฐ ํšจ๊ณผ๊ฐ€ ์—†๋‹ค.

• ์ถ”๊ฐ€๋กœ ๋ฒ„ํŠผ ์ด๋ฆ„๋„ '์ˆ˜์ •'์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ์—ˆ๋‹ค.

 

์ฐธ๊ณ  ๋งํฌ โžœ https://www.baeldung.com/java-thymeleaf-text-vs-value

 

 

์‹คํ–‰ํ•˜๊ธฐ

์‹คํ–‰ ๊ฒฐ๊ณผ, '์ˆ˜์ •ํ•˜๊ธฐ' ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ๋”๋‹ˆ ์ƒ์„ธ ํŽ˜์ด์ง€(/board/view?id=3)์˜ ์ œ๋ชฉ๊ณผ ๋‚ด์šฉ์ด ์ˆ˜์ • ํŽ˜์ด์ง€(/board/modify/3)์—์„œ๋„ ๋™์ผํ•˜๊ฒŒ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

03. ์ˆ˜์ • ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๊ธ€์ด ๋ณ€๊ฒฝ๋˜๋„๋ก ์ฒ˜๋ฆฌ

 

03-1. boardmodify.html์—์„œ <form> ํƒœ๊ทธ ์ˆ˜์ •

	<form th:action="@{/board/update/{id}(id=${article.id})}" method="post">

ํƒ€์ž„๋ฆฌํ”„๋ฅผ ๊ฑธ๊ณ , ๋‚ด์šฉ์„ ์ˆ˜์ •ํ•˜๋ฉด ์ˆ˜์ • ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๊ฒŒ๋” ํ•œ๋‹ค.

 

03-2. BoardController์—์„œ url Mapping

์ง€๊ธˆ๊นŒ์ง€ ์•ž์—์„œ๋Š” GetMapping์„ ์ผ๋Š”๋ฐ ์—ฌ๊ธฐ์„œ๋Š” ์™œ PostMapping์„ ์‚ฌ์šฉํ• ๊นŒ?

 

@PostMapping์€ HTTP Post Method์— ํ•ด๋‹นํ•˜๋Š” ๋‹จ์ถ• ํ‘œํ˜„์œผ๋กœ ์„œ๋ฒ„์— ๋ฆฌ์†Œ์Šค๋ฅผ ๋“ฑ๋ก(์ €์žฅ)ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

  • POST ๋ฐฉ์‹์€ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑ ๋ฐ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. 
  • POST ๋ฐฉ์‹์€ GET ๋ฐฉ์‹๊ณผ ๋‹ค๋ฅด๊ฒŒ Http Body์— ๋ฆฌ์†Œ์Šค๊ฐ€ ๋‹ด๊ฒจ ์ „์†ก๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ์˜ ์ œํ•œ๋„ ์—†๊ณ , ๋น„๊ต์  ๋ฐ์ดํ„ฐ ์œ ์ถœ๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•˜๋‹ค. 

@GetMapping ์€ HTTP Get Method์— ํ•ด๋‹นํ•˜๋Š” ๋‹จ์ถ• ํ‘œํ˜„์œผ๋กœ ์„œ๋ฒ„์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์กฐํšŒํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

  • GET ๋ฐฉ์‹์€ ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ์–ด๋– ํ•œ ๋ฆฌ์†Œ์Šค๋กœ ๋ถ€ํ„ฐ ์ •๋ณด๋ฅผ ์š”์ฒญํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.
  • ๊ฐ™์€ ๋ฆฌ์†Œ์Šค๋กœ๋ถ€ํ„ฐ ์ •๋ณด๋ฅผ ์š”์ฒญํ•˜๋ฉด ๊ทธ ๊ฐ’์€ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์กฐํšŒํ•˜๋Š” ๋ฐ ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค.
  • ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ์˜ ์žฌ์กฐํšŒ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ์ฒซ ์š”์ฒญ์— ์บ์‹œ๋ฅผ ํ•ด๋‘๊ณ  ์žฌ์กฐํšŒ์‹œ ์„œ๋ฒ„ ์š”์ฒญ ์—†์ด ์บ์‹œ ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • GET ๋ฐฉ์‹์€ ์ฟผ๋ฆฌ์ŠคํŠธ๋ง์œผ๋กœ ์ „์†ก๋˜๊ธฐ ๋•Œ๋ฌธ์— POST ๋ฐฉ์‹๊ณผ ๋‹ฌ๋ฆฌ ๋ฐ์ดํ„ฐ์˜ ๊ธธ์ด๊ฐ€ ์ œํ•œ๋˜๋ฉฐ, ๋ณด์•ˆ์—๋„ ์ทจ์•ฝํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

 

 

์‹คํ–‰ํ•˜๊ธฐ

3๋ฒˆ ๊ธ€์˜ ์ œ๋ชฉ๊ณผ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•˜๊ณ  ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋‹ˆ, ๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€๋กœ ๋„˜์–ด๊ฐ€๊ณ  ์ œ๋ชฉ์ด ๋ณ€๊ฒฝ๋๋‹ค. ๋ณ€๊ฒฝ๋œ ๊ฒŒ์‹œ๋ฌผ์„ ์„ ํƒํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด, ์ƒˆ๋กœ ์ž‘์„ฑํ•œ ๋‚ด์šฉ๋“ค์„ ๊ธฐ์กด์— ์žˆ๋˜ ๋‚ด์šฉ์— ๋ฎ์–ด์”Œ์šฐ๊ณ , ์ˆ˜์ •๋œ ๋‚ด์šฉ์ด ์ ์šฉ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

 

์ˆ˜์ •๋œ ๊ฒŒ์‹œ๋ฌผ

 


โ€ป IntelliJ ๋‹จ์ถ•ํ‚ค

Shift๋ฅผ ๋‘ ๋ฒˆ ์—ฐ์†ํ•ด์„œ ๋ˆ„๋ฅด๋ฉด ํŒŒ์ผ ์ด๋ฆ„, ์„ค์ •, ํ•„๋“œ ์ด๋ฆ„ ๋“ฑ ๋‹ค์–‘ํ•˜๊ฒŒ ๊ฒ€์ƒ‰ํ•ด์„œ ์›ํ•˜๋Š” ๊ฑธ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

 

 

728x90