์ค๋์ ์ค์ ๊ฒ์ํ ํ๋ฉด์ ๊ตฌ์ฑํ๋ ๋จ๊ณ์ ๋๋ค. ๋ชฉ๋ก, ์์ธ, ๊ธ์ฐ๊ธฐ, ์์ , ์ญ์ ๊น์ง JSP ๋ทฐ๋ฅผ ์ง์ ๋ถ์ฌ๋ณด๋ฉด์ ์ ๋ฆฌํ ๋ด์ฉ์ ๋ด์์ต๋๋ค.
์์ ํ์ด์ง๋ฅผ ๋ชฉ๋ก์ผ๋ก redirect

๊ฐ๋ฐ ์ค์๋ ๋งค๋ฒ ์์ผ๋ก URL์ ์น๋ ๊ฒ ๋ถํธํฉ๋๋ค. ๊ทธ๋์ ํ ์ปจํธ๋กค๋ฌ์ index ์ฒ๋ฆฌ๋ฅผ ์ ๊น ๋ฐ๊ฟ์, ๊ธฐ๋๋์๋ง์ ๊ฒ์ํ ๋ชฉ๋ก(/board/list)์ผ๋ก redirect ๋๊ฒ ํ์ต๋๋ค.
์๋ index๋ก ๊ฐ๋ ์ฝ๋๋ ์ฃผ์์ผ๋ก ๋ง์๋๊ณ , ๊ฐ๋ฐ์ด ๋๋๋ฉด ๋ค์ ํ์ด์ฃผ๋ฉด ๋ฉ๋๋ค. ๊ฐ๋ฐํ๋ ๋์ ๊ณ์ ๊ฒ์ํ์ ํ์ธํ ๊ฑฐ๋ผ ๋ชฉ๋ก๋ถํฐ ๋ณด์ด๋ ๊ฒ ํธํฉ๋๋ค.
๋ชฉ๋ก ๋ณด๊ธฐ, JSTL ๋ฃจํ์ ๋ ์ง ํฌ๋งท

๋ชฉ๋ก์ ํ๋ก ๋ง๋ค๊ณ ์๋์ ๊ธ์ฐ๊ธฐ ๋ฒํผ์ ๋ก๋๋ค. ๊ธ ๋ชฉ๋ก์ ์ถ๋ ฅํ๋ ค๋ฉด ๋ฐ๋ณต๋ฌธ์ด ํ์ํ๋ JSTL c:forEach๋ฅผ ์๋๋ค.
<c:forEach var="board" items="${list}">
<tr>
<td>${board.no}</td>
<td><a href="get?no=${board.no}">${board.title}</a></td>
<td>${board.writer}</td>
<td class="text-end">
<fmt:formatDate value="${board.regDate}" pattern="yyyy-MM-dd"/>
</td>
</tr>
</c:forEach>
์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์ ๋ ๊ฐ์ง์
๋๋ค. ํ๋๋ items ์์ฑ์ ๋ค์ด๊ฐ๋ list๋ผ๋ ์ด๋ฆ์ด ์ปจํธ๋กค๋ฌ์์ addAttribute๋ก ๋๊ธด ์ด๋ฆ๊ณผ ์ผ์นํด์ผ ํ๋ค๋ ๊ฒ์
๋๋ค. ๋ค๋ฅธ ํ๋๋ ์์ธ ๋ณด๊ธฐ ๋งํฌ๋ฅผ ๋ง๋ค ๋ get?no=... ํํ๋ก URL์ ๋ง์ถฐ์ค์ผ ํ๋ค๋ ๊ฒ์
๋๋ค.
๋ ์ง๋ fmt:formatDate์ ํจํด์ ์ง์ ํด์ ์ถ๋ ฅํ์ต๋๋ค.
์๋ ๊ฒฝ๋ก๋ ์ ๊ฒฝ ์จ์ผ ํฉ๋๋ค. ์ฒซ ํ์ด์ง์ index๋ ๋ฃจํธ์ ์์ง๋ง, ๊ฒ์ํ JSP๋ board ํด๋ ์์ ์์ด์ ์์ ๋๋ ํ ๋ฆฌ๋ก ํ ๋ฒ ์ฌ๋ผ๊ฐ๋ค ๋ด๋ ค์ค๋ ๊ฒฝ๋ก๊ฐ ๋ฉ๋๋ค.
์์ธ ๋ณด๊ธฐ์ ๋ถํธ์คํธ๋ฉ flex

์ ๋ชฉ์ ํด๋ฆญํ๋ฉด get ์์ฒญ์ผ๋ก ์์ธ ํ์ด์ง์ ๋์ด๊ฐ๋๋ค. ์ ๋ฌ๋ ๊ธ ๋ฒํธ๊ฐ ์ถ์ถ๋์ด board๋ผ๋ ์ด๋ฆ์ผ๋ก request scope์ ๋ด๊ธฐ๊ณ , JSP์์ board.writer ๊ฐ์ ์์ผ๋ก ๊บผ๋ด ์๋๋ค.
ํ ์ค์ ์ปฌ๋ผ์ ์ฌ๋ฌ ๊ฐ ๋ฐฐ์นํ ๋๋ ๋ถํธ์คํธ๋ฉ์ d-flex๋ฅผ ์๋๋ค. justify-content-between์ ์ฃผ๋ฉด ์ ๋์ผ๋ก ์ ๋ ฌ๋๋ฉด์ ๋จ๋ ์ฌ๋ฐฑ์ด ์ฌ์ด์ ๊ณ ๋ฅด๊ฒ ๋ฐฐ๋ถ๋ฉ๋๋ค.
ํ๋จ์๋ ๋ฒํผ 3๊ฐ๋ฅผ ๋ก๋๋ค. ๋ชฉ๋ก์ผ๋ก ๋์๊ฐ๊ธฐ, ์์ ์ผ๋ก ๊ฐ๊ธฐ, ์ญ์ ํ๊ธฐ์ ๋๋ค.
์ญ์ ๋ ์ ๊น๋ค๋ก์ด๊ฐ

์์ธ ํ์ด์ง์์ ํ ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค. a ํ๊ทธ๋ก ๋๊ฐ๋ ์์ฒญ์ GET์
๋๋ค. ๊ทธ๋ฐ๋ฐ ์ญ์ ๋ POST ์์ฒญ์ผ๋ก ์ฒ๋ฆฌํ๋๋ก ํด๋จ์ต๋๋ค. ๊ทธ๋๋ก ๋๋ฉด "ํด๋น ๋ฉ์๋๋ฅผ ์ง์ํ์ง ์๋๋ค"๋ ์๋ฌ๊ฐ ๋ฉ๋๋ค.
๊ทธ๋์ ์ญ์ ๋ ์คํฌ๋ฆฝํธ ์ฒ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค. ๋งํฌ๋ฅผ #์ผ๋ก ๋ฐ๊พธ๊ณ delete ํด๋์ค๋ฅผ ๋ฐฐ์ ํ ๋ค์, ํ๋ฉด์ ๋ณด์ด์ง ์๋ ํผ(๊ธ ๋ฒํธ๋ hidden)์ ๋ฐ๋ก ๋ก๋๋ค.
document.querySelector('.delete').addEventListener('click', () => {
if (confirm('์ญ์ ํ ๊น์?')) {
document.getElementById('deleteForm').submit();
}
});
ํด๋ฆญํ๋ฉด confirm์ผ๋ก ํ ๋ฒ ๋ฌผ์ด๋ณด๊ณ , ํ์ธ์ ๋๋ฅด๋ฉด hidden ํผ์ด POST๋ก ์ ์ถ๋๋ฉด์ ์ญ์ ๊ฐ ์ฒ๋ฆฌ๋ฉ๋๋ค. querySelector๋ ์ฒซ ๋ฒ์งธ ์์ ํ๋๋ง, querySelectorAll์ ํด๋น ํด๋์ค ์ ์ฒด๋ฅผ ์ก๋๋ค๋ ์ฐจ์ด๋ ์ง๊ณ ๋์ด๊ฐ์ต๋๋ค.
๊ธ์ฐ๊ธฐ์ ์์ , GET์ ํผ POST๋ ์ฒ๋ฆฌ

๊ธ์ฐ๊ธฐ ๋ฒํผ์ ๋๋ฅด๋ฉด GET ์์ฒญ์ผ๋ก ํผ ํ๋ฉด์ด ๋จ๊ณ , ์ค์ ๋ฑ๋ก์ POST๊ฐ ๋ด๋นํฉ๋๋ค. create์ update ๋ชจ๋ ๊ฐ์ ๊ตฌ์กฐ์ ๋๋ค. GET์ ํผ์ ๋ณด์ฌ์ฃผ๋ ์ญํ , POST๋ ์ค์ ์ฒ๋ฆฌ์ ๋๋ค.
ํผ์ ๋ง๋ค ๋ ์ฃผ์ํ ์ ์ input์ name์ด DTO์ ํ๋๋ช ๊ณผ ์ผ์นํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ์ผ์นํ์ง ์์ผ๋ฉด ๊ฐ์ด ์ธํ ๋์ง ์์ต๋๋ค.

์์ ํผ์ ๊ธ์ฐ๊ธฐ ํผ๊ณผ ๊ฑฐ์ ๊ฐ์์ ๋ณต์ฌํด์ ๋ง๋ญ๋๋ค. ์ฐจ์ด์ ์ ๊ธฐ์กด ๊ฐ์ ๋ณต์ํด์ค์ผ ํ๋ค๋ ๊ฒ, ๊ทธ๋ฆฌ๊ณ primary key๊ฐ ํ์ํ๋ฐ ํ๋ฉด์ ๋ณด์ผ ํ์๋ ์์ผ๋ hidden์ผ๋ก ๋ฃ์ด๋๋ค๋ ๊ฒ์ ๋๋ค.
redirect ํ ๋ฉ์์ง ์ ๋ฌ, flash attribute

๋ฑ๋ก์ด ๋๋๋ฉด ๋ชฉ๋ก์ผ๋ก redirect ํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ฌ์ฉ์ ์
์ฅ์์๋ "๋ฑ๋กํ๋๋ฐ ์ ๋ชฉ๋ก์ผ๋ก ์ค์ง?" ํ๊ณ ๋นํฉํ ์ ์์ต๋๋ค. ์ ๋๋ก ๋ฑ๋ก๋๋ค๋ ์๋ด๊ฐ ์์ผ๋ฉด ๋ ์น์ ํ ํ๋ฉด์ด ๋ฉ๋๋ค.
๋ฌธ์ ๋ redirect ์ํฉ์์๋ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ์ ๋ณด๋ฅผ ์ ๋ฌํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์ด๋ ์ฐ๋ ๊ฒ addFlashAttribute์
๋๋ค.
์ด ๊ฐ์ ์ฒ์์ session scope์ ๋ค์ด๊ฐ๋ค๊ฐ, redirect ๋์ด ๋ค์ด์ฌ ๋ session์์ ๊บผ๋ด์ง๊ณ ์ถ์ถ ํ ์ญ์ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ฐ์ request scope์ ๋ด๊น๋๋ค. ๊ทธ๋์ JSP์์ ๋ฐ๋ก ํ์ธํ ์ ์์ต๋๋ค.
์ด ๊ฐ์ด ์์ผ๋ฉด redirect๋ฅผ ํตํด ์จ ๊ฒ์ด๊ณ , ์์ผ๋ฉด ๊ทธ๋ฅ ๋ชฉ๋ก์ผ๋ก ์จ ๊ฒ์ผ๋ก ๊ตฌ๋ถํ ์ ์์ต๋๋ค. ์๋ก๊ณ ์นจ์ ํ๋ฉด ์ด๋ฏธ session์์ ์ญ์ ๋๊ธฐ ๋๋ฌธ์ ๋ฉ์์ง๊ฐ ์ฌ๋ผ์ง๋๋ค. ๋ฑ๋ก ์งํ ํ ๋ฒ๋ง ์๋ด๊ฐ ๋จ๊ณ ์๋ก๊ณ ์นจํ๋ฉด ์์ด์ง๋, ํํ ๋ณด๋ ๊ทธ ๋์์ ๋๋ค.
์ ๋ฆฌ
์ด๋ฒ ๋จ๊ณ๋ ๋ฐฑ์๋์์ ๋ง๋ ๊ธฐ๋ฅ์ ์ค์ ํ๋ฉด์ ๋ถ์ด๋ ์์ ์ด์์ต๋๋ค. JSTL ๋ฃจํ, ๋ถํธ์คํธ๋ฉ ๋ ์ด์์, GET/POST ๊ตฌ๋ถ, ์ญ์ ์คํฌ๋ฆฝํธ ์ฒ๋ฆฌ, redirect ํ ๋ฉ์์ง ์ ๋ฌ๊น์ง ํ๋ฉด๋จ์์ ์ ๊ฒฝ ์ธ ๋ถ๋ถ์ ํ ๋ฒ์ฉ ์ง์์ต๋๋ค.
์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
