๊ธ๋ชฉ๋ก๊ณผ ํ์ด์ง๋ค์ด์ (Pagination)
๊ฒ์๋ฌผ์ DB์์ ๋ถ๋ฌ์ ํ๋ฉด์ ํ์ํ๋ ค๋ฉด ๊ฒ์๊ธ ๋ชฉ๋ก์ ๊ฐ์ ธ์ค๋ ์์
๊ณผ ํ์ด์ง ์ฒ๋ฆฌ ๋ ๊ฐ์ง๋ฅผ ๊ณ ๋ คํด์ผ ํ๋ค.
๊ฒ์๊ธ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ๋ถ๋ฌ์ค๊ธฐ ์ํด ArrayList๋ฅผ ์ฌ์ฉํ์ฌ DB์์ ์์ฑ์, ์ ๋ชฉ ๋ฑ ๊ฒ์๊ธ์ ์ฃผ์ ์ ๋ณด๋ฅผ ํฌํจํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค. ์ด ๋ ์ค์ํ ์ ์ ํ์ด์ง ์ฒ๋ฆฌ์ด๋ค. ํ์ด์ง ์ฒ๋ฆฌ๋ ํ ํ์ด์ง์ ๋ช ๊ฐ์ ๊ฒ์๊ธ์ ๋ณด์ฌ์ค์ง ๊ฒฐ์ ํ๋ ๊ณผ์ ์ด๋ฉฐ, ์๋ฅผ ๋ค์ด ํ ํ์ด์ง์ ์ด 10๊ฐ์ ๊ฒ์๊ธ์ ๊ฐ์ ธ์ค๋๋ก ์ค์ ํ ์ ์๋ค.
๊ทธ๋์ ์ค๋์ `BbsDAO`์ ํน์ ํ์ด์ง ๋ฒํธ(pageNumber)์ ํด๋นํ๋ ๊ฒ์๊ธ ๋ชฉ๋ก์ ๋ฐํํ๋ ๋ฉ์๋ โก `getList(int pageNumber)`๋ฅผ ๋ง๋ค์ด ๋ณผ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ํ์ด์ง ์ฒ๋ฆฌ์์ ํ์ด์ง ๋ฒํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ค์ ํ์ด์ง๊ฐ ์กด์ฌํ๋์ง ์ฌ๋ถ๋ฅผ ๋ฐํํ๋ ๋ฉ์๋ โก`boolean nextPage(int pageNumber)`๋ ๋ง๋ค์ด์ค ๊ฒ์ด๋ค.
`getList()` ๋ฉ์๋๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํน์ ๋ฒ์์ ๊ฒ์๊ธ์ ๋ถ๋ฌ์ค๊ณ , ์ฌ์ฉ์๊ฐ "๋ค์ ํ์ด์ง" ๋ฒํผ์ ํด๋ฆญํ์ ๋, ๊ทธ ํ์ด์ง๊ฐ ์ค์ ๋ก ์กด์ฌํ๋์ง `boolean nextPage(int pageNumber)` ๋ก ํ๋จํด ์ฃผ๋ ๊ฒ์ด๋ค.
ํ์ด์ง๋ค์ด์ (Pagination)
1. ํ์ด์ง๋ค์ด์ ์ด๋?
Pagination์ด๋, ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ถ์ ์ผ๋ก ๋ถ๋ฌ์ค๋ ๊ธฐ์ ์ ์๋ฏธํ๋ค. ์ฐ๋ฆฌ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ ๋, ๋ง์ฝ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ฒ ๋๋ฉด ๋งค์ฐ ๋นํจ์จ์ ์ผ ๊ฒ์ด๋ค.
์๋์ ๊ฐ์ด ๋ณดํต ์น์ฌ์ดํธ ๊ฒ์ํ ์๋์๋ ํ์ด์ง ๋ฒํธ๊ฐ ์๋ค. ํ์ด์ง ๋ฒํธ๋ฅผ ํ๋ ๋๋ฅด๋ฉด 10๊ฐ์์ 15๊ฐ ์ ๋์ ๊ฒ์๋ฌผ์ด ๋๋์ด์ ํ๋ฉด์ ๋ณด์ฌ์ง๊ฒ ๋๋ค. ์ด๋ ๊ฒ ํน์ ํ์ด์ง๋ฅผ ํด๋ฆญํ๋ฉด ๊ทธ ํ์ด์ง์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ง ๋ถ๋ฌ์์ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ด ํ์ด์ง๋ค์ด์
(ํ์ด์ง ์ฒ๋ฆฌ, ํ์ด์ง ๊ธฐ๋ฒ์ด๋ผ๊ณ ๋ ํจ)์ด๋ค.
๋ง์ฝ ์ด ์์
์ ํ์ง ์์ผ๋ฉด ํ ํ๋ฉด์ ์์ฒ๊ฐ ์๋ง๊ฐ์ ๊ฒ์๋ฌผ์ด ๋ถ๋ฌ์์ง ๊ฒ์ด๋ค.
2. ํ์ด์ง๋ค์ด์ ๊ธฐ๋ณธ ์๋ฆฌ
์๋๋ ํ์ด์ง๋ค์ด์
์ ํ์ํ ๊ธฐ๋ณธ์ ์ธ ์์์ด๋ค.
- ํ์ด์ง ํฌ๊ธฐ (page size): ํ ํ์ด์ง์ ํ์ํ ๊ฒ์๊ธ ์๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ๋๋ 10๊ฐ๋ก ์ง์ ํ ๊ฒ์ด๋ค.
- ํ์ฌ ํ์ด์ง (current page): ์ฌ์ฉ์๊ฐ ๋ณด๊ณ ์๋ ํ์ด์ง ๋ฒํธ๋ฅผ ๊ธฐ์ค์ผ๋ก, ํด๋น ํ์ด์ง์ ๋ง๋ ๊ฒ์๊ธ์ ๋ถ๋ฌ์จ๋ค.
- DB ์ฟผ๋ฆฌ์์ `LIMIT` ์ฌ์ฉ: DB์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๋, `LIMIT`๊ณผ `OFFSET`์ ์ฌ์ฉํ์ฌ ํ์ฌ ํ์ด์ง์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค.
์๋ฅผ ๋ค๋ฉด ๊ฒ์๊ธ์ด 100๊ฐ ์๋ ๊ฒ์ํ์ ํ์ฌ ํ์ด์ง๊ฐ 3์ผ ๊ฒฝ์ฐ, 3ํ์ด์ง๋ `80 ~ 71`๋ฒ์งธ ๊ฒ์๊ธ์ ๋ถ๋ฌ์จ๋ค.
`SELECT * FROM ๊ฒ์๊ธ LIMIT 10 OFFSET 80`์ ํด์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ด๋ค `OFFSET`์ด ๋ฌด์์ธ์ง ์ 80์ธ์ง๋ ์๋์ ์์ธํ ๊ธฐ์ ํ๋๋ก ํ๊ฒ ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ณดํต ๊ฒ์ํ์์๋ ์ต๊ทผ๊ธ ์์ผ๋ก ๋ถ๋ฌ์ค๊ธฐ ๋๋ฌธ์ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ์ ํด ์ค๋ค.
+ ํ์ด์ง ์ฒ๋ฆฌ๋ฅผ ํ ๋, ์ฌ์ฉ์์๊ฒ ํ์ด์ง ๋ค๋น๊ฒ์ด์
์ ๋ณด์ฌ์ฃผ๋ ๊ฒ๋ ์ค์ํ๋ค. ํ๋ฉด ํ๋จ์ ํ์ด์ง ๋ฒํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก '์ด์ ', '๋ค์' ๋ฒํผ์ ๋ง๋ค๊ฑฐ๋, ํ์ด์ง ๋ฒํธ๋ฅผ ์ง์ ์
๋ ฅํ ์ ์๊ฒ ํ๋ ์์
์ด๋ค.
์ผ๋ฐ์ ์ธ ๊ฒ์ํ์ ํ๋จ์ 1๋ถํฐ 10๊น์ง, 11๋ถํฐ 20๊น์ง, 21๋ถํฐ 30๊น์ง 10๊ฐ์ฉ ๋ถ๋ถ์ ์ผ๋ก ํ์ด์ง ์๋ฅผ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๋๋ฐ ๋๋ ๊ทธ๋ฅ ๊ฐ๋จํ๊ฒ `์ด์ `, `๋ค์` ๋ฒํผ์ผ๋ก ํ์ด์ง๋ฅผ ์ด๋ํ ์ ์๋๋ก ์ฒ๋ฆฌํ๋ ค๊ณ ํ๋ค.
ํ์ด์ง์ฒ๋ฆฌ ์์์ฝ๋
// ํ์ด์ง ์ฒ๋ฆฌ ๊ธฐ๋ณธ๊ฐ
int pageSize = 10; // ํ ํ์ด์ง์ 10๊ฐ์ ๊ฒ์๊ธ์ ํ์
int currentPage = 1; // ๊ธฐ๋ณธ์ ์ผ๋ก 1ํ์ด์ง๋ถํฐ ์์
// DB์์ ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ (์: currentPage๊ฐ 1์ผ ๊ฒฝ์ฐ)
int offset = (currentPage - 1) * pageSize; // OFFSET ๊ณ์ฐ
String sql = "SELECT * FROM ๊ฒ์๊ธ LIMIT ? OFFSET ?";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setInt(1, pageSize); // LIMIT: ํ ํ์ด์ง์ ํ์ํ ๊ฒ์๊ธ ์
ps.setInt(2, offset); // OFFSET: ํ์ฌ ํ์ด์ง์ ๋ง๋ ์์ ์ธ๋ฑ์ค
ResultSet rs = ps.executeQuery();
// ๊ฒฐ๊ณผ๋ฅผ ArrayList์ ์ ์ฅ
ArrayList<Post> posts = new ArrayList<>();
while (rs.next()) {
String author = rs.getString("author");
String title = rs.getString("title");
// ํ์ํ ํ๋ ์ถ๊ฐ
posts.add(new Post(author, title)); // Post ํด๋์ค๋ ๊ฒ์๊ธ ์ ๋ณด๋ฅผ ๋ด๋ ๊ฐ์ฒด
}
// posts ๋ฆฌ์คํธ์๋ ํด๋น ํ์ด์ง์ ๊ฒ์๊ธ๋ค์ด ๋ค์ด๊ฐ
โก ํ์ด์ง ๋ฒํธ์ ํด๋นํ๋ ๊ธ๋ชฉ๋ก์ ๋ฐํํ๋ getList ๋ฉ์๋
// ํน์ ํ ํ์ด์ง์ ๋ง๋ ๊ฒ์๊ธ ๋ฆฌ์คํธ๊ฐ list์ ๋ด๊ฒจ ๋ฐํ
public ArrayList<Bbs> getList(int pageNumber) {
String SQL = "SELECT * FROM BBS WHERE bbsID < ? AND bbsAvailable = 1 ORDER BY bbsID DESC LIMIT 10";
ArrayList<Bbs> list = new ArrayList<>();
try {
PreparedStatement psmt = conn.prepareStatement(SQL);
psmt.setInt(1, getNext() - (pageNumber-1) * 10);
rs = psmt.executeQuery();
while (rs.next()) {
Bbs bbs = new Bbs();
bbs.setBbsID(rs.getInt(1));
bbs.setBbsTitle(rs.getString(2));
bbs.setUserID(rs.getString(3));
bbs.setBbsDate(rs.getString(4));
bbs.setBbsContent(rs.getString(5));
bbs.setBbsAvailable(rs.getInt(1));
list.add(bbs);
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
๐ `SELECT * FROM BBS` BBS ํ
์ด๋ธ์์ ๋ชจ๋ ์ด์ ๊ฐ์ ธ์ด
`WHERE bbsID < ?: bbsID` ๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋ ๊ฐ๋ณด๋ค ์์ ๊ฒ์๊ธ๋ค์ ์ ํ(ํ์ด์ง๋ค์ด์
)
`bbsAvailable = 1` ํ์ฌ ๊ฒ์๊ธ์ด ์ฌ์ฉ ๊ฐ๋ฅํ ์ํ(์ญ์ ์๋๊ฒ)์ธ ๊ฒ๋ง ์ ํ
`ORDER BY bbsID DESC` bbsID๋ฅผ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ, ์ฆ ์ต์ ๊ฒ์๊ธ๋ถํฐ ๊ฐ์ ธ์ค๊ฒ ์ค์ ํ ๊ฒ
`LIMIT 10` ํ ๋ฒ์ 10๊ฐ์ ๊ฒ์๊ธ๋ง ๊ฐ์ ธ์ค๊ธฐ. ์ฆ, ํ์ด์ง๋น 10๊ฐ์ ๊ฒ์๊ธ์ ๋ฐํํ๋๋ก ์ค์
๐ `psmt.setInt(1, getNext() - (pageNumber-1) * 10)`
ํ์ด์ง ๋ฒํธ์ ๋ง๋ ๊ฒ์๊ธ์ ๊ฐ์ ธ์ค๊ธฐ ์ํด ์คํ์
์ ์ค์ ํ๋ ๋ถ๋ถ
`getNext()`์ `(pageNumber - 1) * 10`์ ๊ฒฐํฉํด์ `์์ ์์น(์คํ์
)` ๊ฒฐ์
๐์คํ์
(offset)
์คํ์
์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฟผ๋ฆฌ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๋, ๊ฐ์ ธ์ฌ ๋ฐ์ดํฐ์ `์์ ์์น`๋ฅผ ์๋ฏธํ๋ค. ์ฃผ๋ก ์ฌ์ฉ์๊ฐ ์์ฒญํ ํ์ด์ง์ ๋ง๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด `์ด๋์๋ถํฐ` ๋ฐ์ดํฐ๋ฅผ ์์ํ ์ง๋ฅผ ๊ฒฐ์ ํ๋ค.
getNext()๋ ๋ณดํต ๊ฒ์๊ธ ๋ชฉ๋ก์์ ๊ฐ์ฅ ์ต์ ์ ๊ฒ์๊ธ ID๋ฅผ ๋ฐํํ๋ ๊ฐ์ด๋ค. ์ ํํ ๋งํ๋ฉด getNext() ๋ฉ์๋๋ `๋ค์ ๊ฒ์๊ธ ๋ฒํธ`๋ฅผ ๋ฐํํ๋ ๋ฉ์๋์ธ๋ฐ ์ด๊ฑธ๋ก ํด๋น ํ์ด์ง์ ๋ง๋ ๊ฒ์๊ธ ์์ ๋ฒํธ(OFFSET)๋ฅผ ๊ณ์ฐํ๋๋ฐ ์ฐ์ธ๋ค. getNext() ๊ฐ์ด 100์ด๋ผ๊ณ ๊ฐ์ ํด ๋ณด์.
์ฌ์ฉ์๊ฐ ํ์ด์ง 1์ ์์ฒญํ๋ค๊ณ ๊ฐ์ ํ๋ฉด, pageNumber = 1์ด ๋๋ค.
`(pageNumber - 1) * 10 = (1 - 1) * 10 = 0`
๋ฐ๋ผ์, psmt.setInt(1, getNext() - 0)์ด ๋์ด, psmt.setInt(1, 100)์ผ๋ก ์ค์ ๋๋ค.
์ฆ, 100๋ฒ์งธ ๊ฒ์๊ธ๋ถํฐ 10๊ฐ๋ฅผ ๊ฐ์ ธ์จ๋ค.
์ฌ์ฉ์๊ฐ ํ์ด์ง 2๋ฅผ ์์ฒญํ๋ค๊ณ ๊ฐ์ ํ๋ฉด, pageNumber = 2์ด๋ค.
`(pageNumber - 1) * 10 = (2 - 1) * 10 = 10`
๋ฐ๋ผ์, psmt.setInt(1, getNext() - 10)์ด ๋์ด, psmt.setInt(1, 100 - 10) โ psmt.setInt(1, 90)์ผ๋ก ์ค์ ๋๋ค.
90๋ฒ์งธ ๊ฒ์๊ธ๋ถํฐ 10๊ฐ๋ฅผ ๊ฐ์ ธ์จ๋ค.
์ด๋ฐ ์์ผ๋ก ์ฌ์ฉ์๊ฐ ํ์ด์ง 3์ ์์ฒญํ๋ค๊ณ ๊ฐ์ ํ๋ฉด, pageNumber = 3์ด๊ณ ,
`(pageNumber - 1) * 10 = (3 - 1) * 10 = 20`
๋ฐ๋ผ์, psmt.setInt(1, getNext() - 20)์ด ๋์ด, psmt.setInt(1, 100 - 20) โ psmt.setInt(1, 80)์ผ๋ก ์ค์ ๋๋ค.
80๋ฒ์งธ ๊ฒ์๊ธ๋ถํฐ 10๊ฐ๋ฅผ ๊ฐ์ ธ์จ๋ค.
ํ์ด์ง 1: psmt.setInt(1, 100) โ 100๋ฒ ๊ฒ์๊ธ๋ถํฐ 10๊ฐ
ํ์ด์ง 2: psmt.setInt(1, 90) โ 90๋ฒ ๊ฒ์๊ธ๋ถํฐ 10๊ฐ
ํ์ด์ง 3: psmt.setInt(1, 80) โ 80๋ฒ ๊ฒ์๊ธ๋ถํฐ 10๊ฐ
์ด ๋ฐฉ์์ผ๋ก ํ์ด์ง๋ง๋ค ์์ํ๋ ๊ฒ์๊ธ์ ์์น(์คํ์
)๋ฅผ ๊ณ์ฐํด์ LIMIT 10์ ์ฌ์ฉํด์ ํ ํ์ด์ง์ 10๊ฐ์ ๊ฒ์๊ธ์ ๊ฐ์ ธ์ฌ ์ ์๋ค. ์ด ๊ณผ์ ์์ ๊ฒ์๊ธ์ ๊ฐ์ ธ์ค๋ ๋ฐฉ์์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ๋๊ธฐ ๋๋ฌธ์, ๊ฐ์ฅ ํฐ ๊ฐ์ธ 100๋ฒ ๊ฒ์๊ธ๋ถํฐ ์์ํ๋ ๊ฒ์ด๋ค.
๊ฒ์๊ธ์ด ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ ๊ฒฝ์ฐ, ๊ฐ์ฅ ํฐ ๊ฒ์๊ธ ID๊ฐ 100๋ฒ์ด๋ผ๊ณ ๊ฐ์ ํ์ ๋
ํ์ด์ง 1์ psmt.setInt(1, 100) โ 100๋ฒ ๊ฒ์๊ธ๋ถํฐ 10๊ฐ ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ณผ์ ์ผ๋ก 100๋ฒ, 99๋ฒ, 98๋ฒ, ... ์ด๋ ๊ฒ ๋ด๋ฆผ์ฐจ์์ผ๋ก 10๊ฐ์ ๊ฒ์๊ธ์ด ๋ฐํ๋๋ค.
๊ทธ ์ด์ ๋ ๊ฐ์ฅ ์ต์ ์ ์์ฑ๋ ๊ธ๋ถํฐ ๋ณด์ฌ ์ฃผ๊ธฐ ์ํด์์ด๋ค. ๊ทธ๋์ `ORDER BY bbsID DESC (๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ)`์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์, 100๋ฒ์ด ๊ฐ์ฅ ๋จผ์ ๋์จ๋ค. ํ์ด์ง 1์์ 100๋ฒ๋ถํฐ ์์ํ๊ณ , ํ์ด์ง๊ฐ ๋ฐ๋ ๋๋ง๋ค ๋ด๋ฆผ์ฐจ์์ผ๋ก ๋ค์ ๊ฒ์๊ธ๋ค์ ๊ฐ์ ธ์จ๋ค.
// ํน์ ํ ํ์ด์ง์ ๋ง๋ ๊ฒ์๊ธ ๋ฆฌ์คํธ๊ฐ list์ ๋ด๊ฒจ ๋ฐํ
public ArrayList<Bbs> getList(int pageNumber) {
String SQL = "SELECT * FROM BBS WHERE bbsID < ? AND bbsAvailable = 1 ORDER BY bbsID DESC LIMIT 10";
ArrayList<Bbs> list = new ArrayList<>();
try {
PreparedStatement psmt = conn.prepareStatement(SQL);
psmt.setInt(1, getNext() - (pageNumber-1) * 10);
rs = psmt.executeQuery();
while (rs.next()) {
Bbs bbs = new Bbs();
bbs.setBbsID(rs.getInt(1));
bbs.setBbsTitle(rs.getString(2));
bbs.setUserID(rs.getString(3));
bbs.setBbsDate(rs.getString(4));
bbs.setBbsContent(rs.getString(5));
bbs.setBbsAvailable(rs.getInt(1));
list.add(bbs);
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
โก ๋ค์ ํ์ด์ง๊ฐ ์๋์ง ํ์ธํ๋ nextPage() ๋ฉ์๋
public boolean nextPage(int pageNumber) {
String SQL = "SELECT * FROM BBS WHERE bbsID < ? AND bbsAvailable = 1 ORDER BY bbsID DESC LIMIT 10";
try {
PreparedStatement psmt = conn.prepareStatement(SQL);
psmt.setInt(1, getNext() - (pageNumber - 1) * 10);
rs = psmt.executeQuery();
if (rs.next()) {
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
๋ค์ ํ์ด์ง๊ฐ ์์ผ๋ฉด true, ์์ผ๋ฉด false ๋ฐํ
3. bbs.jsp ํ์ด์ง์์ ๊ธ๋ชฉ๋ก ๋ถ๋ฌ์ค๊ธฐ
์ด์ ์ค์ ๋ก ๊ธ๋ชฉ๋ก์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด์ ์ด์ ๊ฒ์ํ ๋ฉ์ธ ํ๋ฉด์ผ๋ก ๋์๊ฐ์.
bbs.BbsDao, bbs.Bbs, ArrayList ์ํฌํธ ํด ์ค๋ค.
์คํฌ๋ฆฝํธ๋ฆฟ ์์ ๊ธฐ๋ณธ์ ์ผ๋ก pageNumber๋ฅผ 1 ๋ก ์ค์ ํ๋ค.
ํ๋ผ๋ฏธํฐ ๊ฐ์ ๋ฐ์์์ pageNumber๋ก ์ค์ ํด์ฃผ์. `request.getParameter`๋ ํญ์ `๋ฌธ์์ด(String)`๋ก ๊ฐ์ ๋ฐํํ๋ฏ๋ก ๋ฐ๋์ `Integer.parseInt`๋ก ํ๋ณํ ํด ์ฃผ์ด์ผ ํ๋ค.
์ด์ body ์์ ์คํฌ๋ฆฝํธ๋ฆฟ ์ด์ด์ bbsDAO ๊ฐ์ฒด ์์ฑํด ์ฃผ๊ณ ArrayList๋ก ๊ธ ๋ด์ฉ๋ค์ ๋ถ๋ฌ์จ๋ค.
for๋ฌธ๋๋ฆฌ๋ฉด์ ํ ์ค์ฉ ๋์ฌ ๋ด์ฉ์ ์ถ๋ ฅํด์ค๋ค.
๐ ๊ฒ์๊ธ ์ ๋ชฉ์๋ `<a>`ํ๊ทธ ๋ฌ์์ค๋ค. ํน์ ๊ฒ์๊ธ์ ์ ๋ชฉ์ ํด๋ฆญํ๋ฉด ์์ธ๋ณด๊ธฐ ํ์ด์ง๋ก ์ด๋ํ ์ ์๋๋ก ๋งํฌ๋ฅผ ์์ฑํด ์ฃผ์ด์ผ ํ๋ค. ๊ฒ์๊ธ์ ID์ ์ ๋ชฉ์ ์ฌ์ฉํด์ view.jsp๋ก ๋์ด๊ฐ ์ ์๋๋ก ํด ์ค๋ค. view.jsp ํ์ด์ง๋ ๋์ค์ ๋ง๋ค๋์
๐ DB์์ ์๋ฒ์ ํ์ฌ ์๊ฐ ๊ฐ์ ธ์ฌ ๋ `NOW()`๋ฅผ ์ฐ๋๋ฐ ๊ธฐ๋ณธ์ ์ผ๋ก YYYY-MM-DD HH:MM:SS ํ์์ผ๋ก ๋ ์ง์ ์๊ฐ์ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ์,๋ถ ํ์์ผ๋ก ๋ฐ๊ฟ์ฃผ์๋ค.
<tbody>
<%
BbsDAO bbsDAO = new BbsDAO();
ArrayList<Bbs> list = bbsDAO.getList(pageNumber);
for(int i = 0; i < list.size(); i++) {
%>
<tr>
<td><%= list.get(i).getBbsID() %></td>
<td><a href="view.jsp?bbsID=<%= list.get(i).getBbsID() %>"><%= list.get(i).getBbsTitle() %></a></td>
<td><%= list.get(i).getUserID() %></td>
<td><%= list.get(i).getBbsDate().substring(0, 11) + list.get(i).getBbsDate().substring(11, 13) + "์" + list.get(i).getBbsDate().substring(14, 16) + "๋ถ" %></td>
</tr>
<%
}
%>
</tbody>
์ฌ๊ธฐ๊น์ง ํ๊ณ ํ
์คํธ
๋ค์ ์น๋ธ๋ผ์ฐ์ ๋ก ๋์์์ ์๋ก๊ณ ์นจํ๋ฉด ์ต๊ทผ์ ๋ฑ๋ก๋ ๋ฐ์ดํฐ๋ถํฐ ํ๋ฉด์ ์ถ๋ ฅ๋๋ ๊ฑธ ํ์ธํ ์ ์๋ค.
์ด์ `<table>` ํ๊ทธ ๋ฐ์๋ค๊ฐ ํ์ด์ง ์ด๋์ ์ํ `์ด์ `, `๋ค์` ๋ฒํผ์ ๋ฌ์ ์ฃผ์๋ค.
`style="width: auto;"` ์ ๋ฃ์ด์ฃผ๋ฉด ๋ฒํผ์ด ํ๋ฉด ์ ์ฒด์ ๊ฝ์ฐธ;;
<%
if(pageNumber != 1) {
%>
<a href="bbs.jsp?pageNumber=<%=pageNumber - 1%>" class="btn btn-success btn-arrow-left"
style="width: auto;">์ด์ </a>
<%
} if(bbsDAO.nextPage(pageNumber + 1)) {
%>
<a href="bbs.jsp?pageNumber=<%=pageNumber + 1%>" class="btn btn-success btn-arrow-left"
style="width: auto;">๋ค์</a>
<%
}
%>
์๋ก๊ณ ์นจํด๋ณด๋๊น ๋ฒํผ์ด ์ ์์ฑ๋์์.
์ด์ ๊ฒ์๊ธ ์ ๋ชฉ์ ๊ฑธ๋ฆฐ ํ์ดํผ๋งํฌ cssํจ๊ณผ๋ฅผ ์์ ์ฃผ๋ ค๊ณ ํ๋ค.
๋ฐ์ค์ด๋ ํ๋ ๊ธ์จ๋ฅผ ์์ ๋ณด์.
<style type="text/css">
a, a:hover {
color:#000000;
text-decoration: none;
}
</style>
์ค๋์ ์ฌ๊ธฐ๊น์ง ์์ฑ!