01. ์ญ์ ๋ฒํผ ์์ฑ
์ญ์ ๋ฒํผ์ ์์ฑํ๊ณ , ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์ญ์ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- html ํ์ผ์ ๋ฒํผ์ ์ถ๊ฐ
- ์ฒ๋ฆฌ service
- controller์ url ๋งคํ
- 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)


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;">
'๐ป PROJECT > [์คํ๋ง ๋ถํธ] ๊ฒ์ํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [์คํ๋ง ๋ถํธ] 8. ๊ฒ์ํ ๋ง๋ค๊ธฐ ๋ฉ์์ง ์ฐฝ ๋์ฐ๊ธฐ (0) | 2023.10.26 |
|---|---|
| [์คํ๋ง ๋ถํธ] 7. ๊ฒ์ํ ๋ง๋ค๊ธฐ ์์ ์ฒ๋ฆฌ (1) | 2023.10.26 |
| [์คํ๋ง ๋ถํธ] 5. ๊ฒ์ํ ๋ง๋ค๊ธฐ ๊ฒ์๋ฌผ ๋ฆฌ์คํ (0) | 2023.10.24 |
| [์คํ๋ง ๋ถํธ] 4. ๊ฒ์ํ ๋ง๋ค๊ธฐ ๊ฒ์๊ธ ์์ฑํผ ์์ฑ๊ณผ ์ฒ๋ฆฌ (1) | 2023.10.23 |
| [์คํ๋ง ๋ถํธ] 3. ๊ฒ์ํ ๋ง๋ค๊ธฐ ํ ์ด๋ธ ์์ฑ (0) | 2023.10.22 |