JAVA

페이징 처리 내용

Stater 2024. 6. 16. 21:59
설명
  • UserMapper: MyBatis의 매퍼 인터페이스에서 OFFSET과 FETCH 또는 ROWNUM을 사용하여 페이징 쿼리를 정의합니다.
  • UserService: 페이지 번호와 페이지 크기를 받아서 MyBatis 매퍼를 호출하여 페이징된 데이터를 가져옵니다.
  • UserController: 요청된 페이지에 따라 데이터를 조회하고, JSP에 전달할 데이터를 설정합니다.
  • user-list.jsp: 받은 데이터를 테이블로 표시하고, 데이터가 없을 경우 알림창을 띄웁니다. 이전 페이지와 다음 페이지를 제어하는 링크를 생성합니다. 다음 페이지가 없는 경우에는 다음 버튼이 나타나지 않습니다.
이 방법은 MyBatis의 기능을 최대한 활용하여 데이터베이스에서 효율적으로 페이징된 데이터를 가져오는 방법입니다. SQL 쿼리에서 OFFSET과 FETCH 또는 ROWNUM을 사용하여 특정 범위의 데이터만을 가져오므로, 전체 데이터의 개수를 미리 알 필요가 없습니다.

 

 

자바부분

// UserMapper.java
@Mapper
public interface UserMapper {

    List<User> getUsersWithPagination(@Param("offset") int offset, @Param("limit") int limit);

    int getUserCount(); // 전체 데이터 수를 구하는 메서드는 유지합니다.
}

 

 

서비스

// UserService.java
@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public List<User> getUsersByPage(int page, int pageSize) {
        int offset = (page - 1) * pageSize;
        return userMapper.getUsersWithPagination(offset, pageSize);
    }

    public int getUserCount() {
        return userMapper.getUserCount();
    }
}

 

 

컨트롤러부분

// UserController.java
@Controller
public class UserController {

    @Autowired
    private UserService userService;

    private static final int PAGE_SIZE = 10;

    @GetMapping("/users")
    public String getUsers(@RequestParam(name = "page", defaultValue = "1") int page, Model model) {
        List<User> users = userService.getUsersByPage(page, PAGE_SIZE);

        model.addAttribute("users", users);
        model.addAttribute("currentPage", page);

        return "user-list";
    }
}

 

 

jsp부분

<!-- user-list.jsp -->
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
    <title>User List</title>
</head>
<body>
    <h1>User List</h1>
    
    <table border="1">
        <thead>
            <tr>
                <th>ID</th>
                <th>Name</th>
                <th>Email</th>
            </tr>
        </thead>
        <tbody>
            <c:forEach items="${users}" var="user">
                <tr>
                    <td>${user.id}</td>
                    <td>${user.name}</td>
                    <td>${user.email}</td>
                </tr>
            </c:forEach>
        </tbody>
    </table>
    
    <br>
    
    <c:if test="${empty users}">
        <script>
            alert("데이터가 없습니다.");
            history.back();
        </script>
    </c:if>
    
    <br>
    
    <c:if test="${currentPage > 1}">
        <a href="?page=${currentPage - 1}">이전</a>
    </c:if>
    
    <!-- 다음 페이지 링크를 제어하기 위해 users의 크기가 페이지 크기와 같을 때만 다음 링크를 생성합니다 -->
    <c:if test="${not empty users && users.size() == 10}">
        <a href="?page=${currentPage + 1}">다음</a>
    </c:if>
    
</body>
</html>

 

 

 

반응형

'JAVA' 카테고리의 다른 글

페이징 처리 내용 2  (0) 2024.06.16
Chpter01. 변수  (0) 2023.03.07
Chapter01. 변수  (0) 2023.02.23
멀티쓰레드 프로그래밍 multi-thread programming  (0) 2019.10.29
멀티쓰레드 프로그래밍 multi-thread programming  (0) 2019.10.28