Programing_Java

[Servlet] ์„œ๋ธ”๋ฆฟ์„ ํ™œ์šฉํ•œ ๋น„๋™๊ธฐ ๊ฒŒ์‹œํŒ ์ •๋ ฌ – JSON ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋ฐ ํŽ˜์ด์ง€๋„ค์ด์…˜ ๊ตฌํ˜„ ๐Ÿš€ ๋ณธ๋ฌธ

๐Ÿญ Projects

[Servlet] ์„œ๋ธ”๋ฆฟ์„ ํ™œ์šฉํ•œ ๋น„๋™๊ธฐ ๊ฒŒ์‹œํŒ ์ •๋ ฌ – JSON ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋ฐ ํŽ˜์ด์ง€๋„ค์ด์…˜ ๊ตฌํ˜„ ๐Ÿš€

Joyfullyever 2025. 3. 29. 17:29

๐Ÿ›  ์„œ๋ธ”๋ฆฟ์„ ์ด์šฉํ•œ ๋น„๋™๊ธฐ ๊ฒŒ์‹œํŒ ์ •๋ ฌ ๊ธฐ๋Šฅ ๊ตฌํ˜„

์ •๋ ฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ, ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•˜์ง€ ์•Š๊ณ  ๋น„๋™๊ธฐ(Async) ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ 

BoardComboOrderServlet์„ ์ด์šฉ, ๊ฒŒ์‹œ๊ธ€ ๋ฐ์ดํ„ฐ๋ฅผ JSON ํ˜•์‹์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์— ๋ฐ˜ํ™˜,

์ตœ์‹ ์ˆœ, ์˜ค๋ž˜๋œ์ˆœ, ์ธ๊ธฐ์ˆœ ์ •๋ ฌ ๋ฐ ํŽ˜์ด์ง€๋„ค์ด์…˜ ์ฒ˜๋ฆฌ

 

๐Ÿš€ ์ฃผ์š” ๊ธฐ๋Šฅ

โœ… ๋น„๋™๊ธฐ ์š”์ฒญ ์ฒ˜๋ฆฌ (AJAX์™€ ํ•จ๊ป˜ ๋™์ž‘)
โœ… ๊ฒŒ์‹œํŒ ๋ฐ์ดํ„ฐ ์ •๋ ฌ (์ตœ์‹ ์ˆœ, ์˜ค๋ž˜๋œ์ˆœ, ์ธ๊ธฐ์ˆœ)
โœ… ํŽ˜์ด์ง€๋„ค์ด์…˜ ๊ธฐ๋Šฅ ๊ตฌํ˜„ (๋”๋ณด๊ธฐ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ ๋กœ๋“œ)
โœ… JSON ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ ์‘๋‹ต (View์—์„œ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ)

 

๐Ÿ“Œ ์ฝ”๋“œ ๋ถ„์„ – ํ•ต์‹ฌ ๋กœ์ง ์„ค๋ช…

1๏ธโƒฃ View์—์„œ ์ •๋ ฌ ์กฐ๊ฑด๊ณผ ํŽ˜์ด์ง• ์ •๋ณด ์ „๋‹ฌ

View๋Š” AJAX ์š”์ฒญ์„ ํ†ตํ•ด ์ •๋ ฌ ์กฐ๊ฑด๊ณผ ํŽ˜์ด์ง€ ์ •๋ณด๋ฅผ ์„œ๋ฒ„๋กœ ์ „๋‹ฌ → ์„œ๋ธ”๋ฆฟ์—์„œ request.getParameter()๋กœ ๋ฐ›์•„ ์ฒ˜๋ฆฌ

// ํด๋ผ์ด์–ธํŠธ์—์„œ ์ „๋‹ฌํ•œ ์ •๋ ฌ ์กฐ๊ฑด
String orderCondition = request.getParameter("boardOrderCondition");
System.out.println("๋ฐฑ๋‹จ ๋„์ฐฉ ์—ฌ๋ถ€: " + orderCondition);

// ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ณด๋‚ธ ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ์™€ ๋ณด์—ฌ์ค„ ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜
int boardPageNumber = Integer.parseInt(request.getParameter("boardPageNumber"));
int boardContentCount = Integer.parseInt(request.getParameter("boardContentCount"));

System.out.println("๋”๋ณด๊ธฐ ํšŸ์ˆ˜: [" + boardPageNumber + "]");
System.out.println("๋ณด์—ฌ์ค„ ๋ฐ์ดํ„ฐ ์ˆ˜: [" + boardContentCount + "]");
// View AJAX ์˜ˆ์‹œ
$.ajax({
    url: "/BoardComboOrderServlet",
    method: "GET",
    data: {
        boardOrderCondition: "ORDERUPTODATE",  // ์ตœ์‹ ์ˆœ ์ •๋ ฌ
        boardPageNumber: 1,
        boardContentCount: 10
    },
    success: function(response) {
        console.log(response);  // ์„œ๋ฒ„์—์„œ ๋ฐ›์€ JSON ๋ฐ์ดํ„ฐ
    }
});

 

2๏ธโƒฃ ํŽ˜์ด์ง€๋„ค์ด์…˜ ์ฒ˜๋ฆฌ – ์‹œ์ž‘ ์ธ๋ฑ์Šค ๊ณ„์‚ฐ

View์—์„œ ํ˜„์žฌ ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ์™€ ํ•œ ํŽ˜์ด์ง€์— ๋ณด์—ฌ์ค„ ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜๋ฅผ ์ „์†ก, ์„œ๋ฒ„๋Š” startIndex๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ์ ์ ˆํ•œ ๋ฐ์ดํ„ฐ ๋ฒ”์œ„๋ฅผ ์„ค์ •

// ํŽ˜์ด์ง€๋„ค์ด์…˜์„ ์œ„ํ•œ ์‹œ์ž‘ ์ธ๋ฑ์Šค ๊ณ„์‚ฐ
int startIndex = (boardPageNumber - 1) * boardContentCount;
System.out.println("์‹œ์ž‘ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ: [" + startIndex + "]");

๋”๋ณด๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค ๋‹ค์Œ ํŽ˜์ด์ง€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋„๋ก ๊ตฌํ˜„

 

3๏ธโƒฃ ๋ฐ์ดํ„ฐ ์กฐํšŒ ๋ฐ JSON ๋ณ€ํ™˜

DB์—์„œ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋ฅผ JSON ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์— ์‘๋‹ต

BoardComboDAO boardComboDAO = new BoardComboDAO();
ArrayList<BoardComboDTO> boardComboDatas = boardComboDAO.selectAll(boardComboDTO);
if (boardComboDatas == null) {
    boardComboDatas = new ArrayList<>();
}

JSONArray boardComboArray = new JSONArray();
for (BoardComboDTO boardCombo : boardComboDatas) {
    JSONObject boardComboObject = new JSONObject();
    boardComboObject.put("boardComboNumber", boardCombo.getBoardComboNumber());
    boardComboObject.put("memberName", boardCombo.getMemberName());
    boardComboObject.put("boardComboTitle", boardCombo.getBoardComboTitle());
    boardComboObject.put("boardComboViewCount", boardCombo.getBoardComboViewCount());
    boardComboObject.put("boardComboLikedCount", boardCombo.getBoardComboLikedCount());
    boardComboObject.put("boardComboRegisterDate", boardCombo.getBoardComboRegisterDate().toString());

    boardComboArray.add(boardComboObject);
}

// JSON ๋ฐ์ดํ„ฐ ์‘๋‹ต
response.getWriter().write(boardComboArray.toJSONString());
// View๊ฐ€ ๋ฐ›๋Š” JSON ์‘๋‹ต
[
    {
        "boardComboNumber": 1,
        "memberName": "ํ™๊ธธ๋™",
        "boardComboTitle": "์˜ค๋Š˜์˜ ์ถ”์ฒœ ์กฐํ•ฉ",
        "boardComboViewCount": 150,
        "boardComboLikedCount": 23,
        "boardComboRegisterDate": "2025-03-30 14:25:00"
    },
    {
        "boardComboNumber": 2,
        "memberName": "์ด์ˆœ์‹ ",
        "boardComboTitle": "์ตœ๊ณ ์˜ ๊ฐ€์„ฑ๋น„ ์ฝค๋ณด",
        "boardComboViewCount": 98,
        "boardComboLikedCount": 10,
        "boardComboRegisterDate": "2025-03-29 10:10:00"
    }
]

 

โœจ ๊ฐœ์„  ํ›„ ๊ธฐ๋Œ€ ํšจ๊ณผ

โœ… ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ UX ํ–ฅ์ƒ

• ํŽ˜์ด์ง€ ์ƒˆ๋กœ๊ณ ์นจ ์—†์ด AJAX ์š”์ฒญ์œผ๋กœ ๋น ๋ฅด๊ฒŒ ๋ฐ์ดํ„ฐ ๋กœ๋“œ ๊ฐ€๋Šฅ

• ๋”๋ณด๊ธฐ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

โœ… ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ ์ฆ๊ฐ€

• ์ •๋ ฌ ์กฐ๊ฑด์ด ์ถ”๊ฐ€๋  ๊ฒฝ์šฐ, if-else ๊ตฌ๋ฌธ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ์ƒˆ๋กœ์šด ์ •๋ ฌ ๋ฐฉ์‹ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ

• JSON ํฌ๋งท์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ํด๋ผ์ด์–ธํŠธ์™€ ์—ฐ๋™ ๊ฐ€๋Šฅ

โœ… ์„œ๋ฒ„ ๋ถ€ํ•˜ ๊ฐ์†Œ

• ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ ธ์˜ค๋Š” ํŽ˜์ด์ง€๋„ค์ด์…˜ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•œ DB ์ฟผ๋ฆฌ ์‹คํ–‰ ๋ฐฉ์ง€

• ํด๋ผ์ด์–ธํŠธ์—์„œ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์š”์ฒญํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ํŠธ๋ž˜ํ”ฝ ๊ฐ์†Œ

 

๐Ÿš€ ๊ฒฐ๋ก : ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ํšจ์œจ์ ์ธ ๊ฒŒ์‹œํŒ ์ •๋ ฌ ๊ตฌํ˜„

์„œ๋ธ”๋ฆฟ์„ ํ™œ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ๊ฒŒ์‹œํŒ ์ •๋ ฌ๊ณผ ํŽ˜์ด์ง• ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„

๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์•„ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)์„ ๊ฐœ์„ , ์„œ๋ฒ„ ๋ถ€ํ•˜ ๊ฐ์†Œ, ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด

 ๋” ์ตœ์ ํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์†๋„๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ• ๊ณ ๋ฏผ