본문 바로가기

개발/BACK

[SpringFramework] 게시판 페이징 기능 예제 ,쉽게 페이징을 구현하자

728x90

 


이번 포스팅에서는 게시글의 생성일을 파라미터로 이용해서

 

간단한 게시판 페이징 (Paging) 기능을 구현하는 API를 만들려고 한다

 

Paging ? 

게시판 글을 page 단위로 나누는 작업이다

한 page에 몇개의 데이터를 보여줄 건지도 개발자가 직접 정할 수 있도록 구현할 예정이다

 

 

API를 개발하기 위해 각각의 Controller,Service,DAO를 생성한다


사전작업


먼저, VO를 생성해서 구현했기 때문에, 해당 요청들에서 필요한 VO를 먼저 정의한다

 

[SearchVO]

게시글 리스트를 조회하기 위한 요청 파라미터 VO

 

user_no : 어떤 사용자가 조회했는지 확인하기 위한 사용자 번호

 

last_grid_date : 마지막에 보여진 게시글

 

length : 보여질 게시글 숫자

public class SearchVO {
 
    private long user_no;
    private String last_grid_date;
    private int length;
    
        
    public long getUser_no() {
        return user_no;
    }
    public void setUser_no(long user_no) {
        this.user_no = user_no;
    }
    public String getLast_grid_date() {
        return last_grid_date;
    }
    public void setLast_grid_date(String last_grid_date) {
        this.last_grid_date = last_grid_date;
    }
    public int getLength() {
        return length;
    }
    public void setLength(int length) {
        this.length = length;
    }
    
}
cs

 

[ReadVO]

매퍼에서 조회한 데이터를 담을 응답 VO

seq : 게시글 번호

 

write_user_no : 작성자

 

create_date : 생성 일자

 

title : 제목

 

description : 내용

public class ReadVO {
 
    private long seq;
    private long write_user_no;
    private String create_date;
    private String title;
    private String description;
 
 
 
 
    public long getSeq() {
        return seq;
    }
    public void setSeq(long seq) {
        this.seq = seq;
    }
    public long getWrite_user_seq() {
        return write_user_seq;
    }
    public void setWrite_user_seq(long write_user_seq) {
        this.write_user_seq = write_user_seq;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
}
cs

 


게시글 리스트 페이징 하는 법


TestController

 

@Controller
@RequestMapping(value="/test/")
public class TestController {
    
    @Autowired
    TestService testService;
    
    @RequestMapping(value="list", method = RequestMethod.GET)
    @ResponseBody
    public List<ReadVO> findList(@ModelAttribute SearchVO searchVO) {
        
        List<ReadVO> list = testService.findList(searchVO);
        
        return list;
    }
cs

 

list를 조회하는 Controller 요청을 만든다

 

해당 findList 메소드는 /test/list 로 요청했을 때, List<Map> 형태로 리스트를 조회해서 리턴하는 메소드다

 


TestService

 

@Service
public class TestService {
    
    @Autowired
    TestDao testDao;    
    
 
    public List<ReadVO> findList(SearchVO searchVO) {
        List<ReadVO> resultList = testDao.findList(searchVO);
        return resultList; 
    }
}
cs

TestDao

 

Resource 어노테이션 매개 변수로는 SqlSessionFactoryBean을 설정했을 때, bean id를 입력해주면 된다

 

( 대게 db connection 설정은 app-context, root-context 라는 명칭으로 생성한다 )

 

@Repository
public class CommunityDao {
 
    @Resource(name="[db bean id]")
    private SqlSession sqlSession;
    
    private static final String NAME_SPACE = "[dao의 현재 위치]"// ex) com.test.test.dao.testDao
    
    
    /**
     * 커뮤니티 게시글 리스트 조회
     * @param searchVO
     * @return
     */
    public List<ReadVO> findList(SearchVO searchVO) {
        return sqlSession.selectList(NAME_SPACE+".findList",searchVO);
    }
}
cs

testMapper.xml

 

<mapper namespace="com.test.test.dao.testDao">

mapper 의 namespace에는 DAO에 입력해주었던 DAO 경로를 적어준다

 

last_grid_date :

해당 파라미터는 페이징을 하기 위한 데이터다

첫 조회 시 빈 값을 조회해서 length 만큼의 데이터를 가지고오고,

마지막 데이터의 create_date를 last_grid_date 파라미터로 입력해주면 

마지막으로 조회된 글의 다음글부터 조회가 된다

 

ORDER BY A.create_date DESC

최신순으로 데이터를 가져오기 위한 정렬 조건

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
          PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
          "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
          
<mapper namespace="com.test.test.dao.testDao">
    <select id="findList" resultType="com.test.test.vo.ReadVO" parameterType="com.test.test.vo.SearchVO">
        SELECT seq,
               write_user_no,
               create_date,
               title,
               description    
        FROM board A 
        WHERE 1=1
        AND A.delete_date IS NULL
        <if test="last_grid_date != null and last_grid_date != ''">
            AND A.create_date <![CDATA[<]]> #{last_grid_date}
        </if>
ORDER BY A.create_date DESC
        limit #{length}
    </select>
</mapper>
cs

 

이제 데이터를 조회해보자

 

/test/list 라는 요청을 주게 되면 해당 데이터가 List 형태로 게시글을 리턴한다

 

다음 데이터를 조회하기 위해선, 마지막 게시글의 생성일자(last_grid_date)를 파라미터로 넘겨주면

 

마지막 게시글 다음 데이터부터 length 만큼의 데이터를 조회하게 된다

 

728x90