์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

[KB IT's Your Life 7๊ธฐ]๊ฒŒ์‹œํŒ ํ™”๋ฉด๋‹จ ๋งŒ๋“ค๊ธฐ | JSP ๋ทฐ๋ถ€ํ„ฐ redirect๊นŒ์ง€

yeye 2026. 6. 29. 15:27

์˜ค๋Š˜์€ ์‹ค์ œ ๊ฒŒ์‹œํŒ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•˜๋Š” ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. ๋ชฉ๋ก, ์ƒ์„ธ, ๊ธ€์“ฐ๊ธฐ, ์ˆ˜์ •, ์‚ญ์ œ๊นŒ์ง€ 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 ํ›„ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ๊นŒ์ง€ ํ™”๋ฉด๋‹จ์—์„œ ์‹ ๊ฒฝ ์“ธ ๋ถ€๋ถ„์„ ํ•œ ๋ฒˆ์”ฉ ์งš์—ˆ์Šต๋‹ˆ๋‹ค.

์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!