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

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

devCloud 2023. 10. 25. 20:28
728x90

01. ์‚ญ์ œ ๋ฒ„ํŠผ ์ƒ์„ฑ

์‚ญ์ œ ๋ฒ„ํŠผ์„ ์ƒ์„ฑํ•˜๊ณ , ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์‚ญ์ œ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.

  1. html ํŒŒ์ผ์— ๋ฒ„ํŠผ์„ ์ถ”๊ฐ€
  2. ์ฒ˜๋ฆฌ service
  3. controller์— url ๋งคํ•‘
  4. thymeleaf๋กœ ์ฒ˜๋ฆฌ

 

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

<!DOCTYPE html>
<html lang="en" xmlns:th="http://thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>๊ฒŒ์‹œ๊ธ€ ์ƒ์„ธ ํŽ˜์ด์ง€</title>
</head>
<body>
    <h1 th:text="${article.title}">์ œ๋ชฉ์ž…๋‹ˆ๋‹ค.</h1>
    <p th:text="${article.content}">๋‚ด์šฉ์ด ๋“ค์–ด๊ฐˆ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.</p>
    <a href="">๊ธ€์‚ญ์ œ</a> <!-- ์ถ”๊ฐ€ํ•œ ๊ณณ -->
</body>
</html>

๋ฒ„ํŠผ์œผ๋กœ๋„ ๊ฐ€๋Šฅ(<a> ํƒœ๊ทธ ๋Œ€์‹ ์— ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.)

<button>์‚ญ์ œํ•˜๊ธฐ</button>

 

์‹คํ–‰ํ•˜๊ธฐ(http://localhost:8080/board/view?id=1)

์ขŒ - <a> ํƒœ๊ทธ,  ์šฐ - <button> ํƒœ๊ทธ 

 

01-2. BoardService์— ๋ฉ”์†Œ๋“œ ์ถ”๊ฐ€ (์ฒ˜๋ฆฌ Service) 

• deleteById

  • Entity์˜ id๋ฅผ ๋„˜๊ฒจ ์‚ญ์ œ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
  • Spring Data CrudRepository interface์˜ ๊ตฌํ˜„์ฒด์ธ SimpleJpaRepository์— ์ •์˜๋˜์–ด์žˆ๋‹ค. (delete๋„ ์žˆ์Œ)
  • findById๋กœ ์กฐํšŒํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ, EmptyResultDataAccessException์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

• void๋Š” ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ์—†๋Š” ๊ฑธ ์˜๋ฏธํ•œ๋‹ค. (๊ธ€์„ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๋ฐ˜ํ™˜ํ•  ๊ฒŒ ์—†๋‹ค.)

• ์•ž์—์„œ ๊ตฌํ˜„ํ–ˆ๋˜ ์ž‘์„ฑ, ๋ฆฌ์ŠคํŠธ, ๊ฒŒ์‹œ๊ธ€ ์ฝ”๋“œ์™€ ๋‹ค๋ฅด๊ฒŒ ๋ฐ˜ํ™˜ํ˜•์ด void์ด๊ธฐ ๋•Œ๋ฌธ์— return์ด ํ•„์š”์—†๋‹ค.

 

๋กœ์ง : id๊ฐ’์— 1์ด ๋“ค์–ด์™”์„ ๋•Œ, 1๋ฒˆ Id๊ฐ’์„ ๊ฐ€์ง„ ๊ธ€์„ deleteById๋ฅผ ํ†ตํ•ด ์‚ญ์ œํ•œ๋‹ค.(id๊ฐ’ = ํŒŒ๋ผ๋ฏธํ„ฐ)

 

01-3. BoardController์— ๋ฉ”์†Œ๋“œ ์ถ”๊ฐ€(url Mapping)

• redirect:

  • ์–ด์›์€ Re(๋‹ค์‹œ) + direct(์š”์ฒญํ•˜๋‹ค/์ง€์‹œํ•˜๋‹ค)์ด๋ฉฐ, ๊ตฌ์ฒด์ ์œผ๋กœ๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์›น ์„œ๋ฒ„์— ์–ด๋–ค URL์„ ์š”์ฒญํ–ˆ์„ ๋•Œ, ์„œ๋ฒ„๊ฐ€ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋ฅผ ์ง€์‹œํ•˜๋Š” ํŠน์ • HTTP ์‘๋‹ต[1]์„ ํ†ตํ•ด ์›น ๋ธŒ๋ผ์šฐ์ €๋กœ ํ•˜์—ฌ๊ธˆ ์ง€์ •๋œ ๋‹ค๋ฅธ URL๋กœ ์žฌ์š”์ฒญํ•˜๋ผ๊ณ  ์ง€์‹œํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.
  • ์‰ฝ๊ฒŒ ๋งํ•ด, ๊ธ€์ด ์‚ญ์ œ๋˜๋ฉด ๋ฆฌ์ŠคํŠธ ํ™”๋ฉด์œผ๋กœ ๋„˜์–ด๊ฐ€๋Š” ๊ฒŒ ์ผ๋ฐ˜์ ์ด๋ฏ€๋กœ ๋ฆฌ์ŠคํŠธ๋กœ  ์ด๋™(์„ ํ–‰)์‹œํ‚จ๋‹ค. ๋”ฐ๋ผ์„œ redirect: ๋’ค์— ์ด๋™์‹œํ‚ฌ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ด์ค€๋‹ค.

 

๋กœ์ง : /board/delete ์ฃผ์†Œ๋กœ ๋“ค์–ด์™”์„ ๋•Œ id๊ฐ’(ํŒŒ๋ผ๋ฏธํ„ฐ)์„ ์ฐพ์•„๋‚ด์„œ ๋„˜์–ด์˜จ id๊ฐ’์„ Service์— ๋ณด๋‚ด์ฃผ๋ฉด ์‚ญ์ œ ์ฒ˜๋ฆฌ๊ฐ€ ๋œ๋‹ค.

 

์‹คํ–‰ํ•˜๊ธฐ(http://localhost:8080/board/list)

list์—์„œ 1๋ฒˆ์˜ '์ œ๋ชฉ ์ž‘์„ฑ ํ…Œ์ŠคํŠธ' ๊ธ€์ด ์‚ญ์ œ ๋˜์—ˆ๋‹ค.

 

01-4. boardview.html์—์„œ ํƒœ๊ทธ ์ˆ˜์ • (thymeleaf)

์ด์ œ ์ƒ์„ธ ํŽ˜์ด์ง€์—์„œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ์‚ญ์ œ๊ฐ€ ๋˜๋„๋ก ํ•œ๋‹ค. 

๋‚ด์šฉ ์ƒ๊ธฐ : ํƒ€์ž„๋ฆฌํ”„ ์‚ฌ์šฉ ์ด์œ  - ๊ธ€์ด ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์œผ๋ฏ€๋กœ ๊ฐ๊ฐ ๋งž๋Š” ํŽ˜์ด์ง€๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•ด์„œ

 

<a> ํƒœ๊ทธ 

<a th:href="@{/board/delete(id=${article.id})}">๊ธ€์‚ญ์ œ</a>

 

 

<button> ํƒœ๊ทธ

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

์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋„˜๊ธด URL๋ณ€์ˆ˜ ์ด์šฉ

    • th:onclick="ํ•จ์ˆ˜๋ช…([[${ํŒŒ๋ผ๋ฏธํ„ฐ๋ช….value๊ฐ’}]])"

location.href๋ฅผ ์ด์šฉํ•œ ๊ฒฝ๋กœ ์ด๋™

  • th:onclick="|location.href='@{html์ด๋ฆ„(ํŒŒ๋ผ๋ฏธํ„ฐ๋ช…=${value๊ฐ’})}'|"

 

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

๋ฒ„ํŠผ ํƒœ๊ทธ

์ƒ์„ธํŽ˜์ด์ง€์—์„œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๊ธ€์ด ์‚ญ์ œ๋œ๋‹ค.

'์ œ๋ชฉ 1' ํŽ˜์ด์ง€์—์„œ ์‚ญ์ œ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €๋”๋‹ˆ ๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€๋กœ ๋„˜์–ด๊ฐ€๊ณ  '์ œ๋ชฉ 1'์ด ์‚ฌ๋ผ์ง„ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 


โ€ป ์ƒ์„ธ ํŽ˜์ด์ง€๋ฅผ ์ค‘์•™์œผ๋กœ ์ •๋ ฌํ•˜๊ณ  ์‹ถ์œผ๋ฉด html ํŒŒ์ผ์—์„œ <body> ํƒœ๊ทธ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•˜๋ฉด ๋œ๋‹ค.

<body style="text-align: center;">

 

728x90