hoony's web study

728x90
반응형

JPA에서 제일 매력적인 부분은 Pageable 이라고 저는 개인적으로 생각을 합니다. 
아직 JPA의 Entity를 완전히 사용해서 개발을 하는 것은 현재 무리라고 생각을 합니다. 
제 개인적인 사견이지만 Table 의 설계가 좀 완벽할 때 사용하는게 나을것 같아요. 

그래서 이 좋은 PageRequest Class를 어떻게 하면 Mybatis에서 사용을 할 수 있을까 하고 고민을 해봤습니다. 

1. PageRequest 개조하기 

먼저 PageRequest가 AbstractPageRequest라는 추상 클래스를 상속받은 것을 알 수 있습니다.
그럼 나도 현재 쓰는 DB에 맞게 하나더 만들어서 사용하면 되지 않을까? 라는 생각을 문득 했습니다. 
저는 무조건 이 class를 사용해서 페이징의 지옥에서 벗어나고 mybatis에 들어가는 xml의 숫자를 줄여보자고 말이죠.

2. MariaDB용  PageRequest  class 생성 

public class MybatisMariaDBPageRequest extends AbstractPageRequest {
    private static final long serialVersionUID = -4050909938956089562L;
    private final Sort sort;

    protected MybatisMariaDBPageRequest(int page, int size, Sort sort) {
        super(page, size);
        Assert.notNull(sort, "Sort must not be null!");
        this.sort = sort;
    }


    //mariadb 용으로 offSet 계산식 변경 적용 by LSH
    public long getOffset() {
        return (long)(super.getPageNumber()-1) * (long)super.getPageSize();
    }

위와 같이 class를 생성했답니다. 
소스코드는 더 있으나 필요한 부분만 발췌했습니다.

3. 사용해보기

@Operation(summary = "공통코드 목록 조회")
    @ApiResponses({
            @ApiResponse(responseCode = "200", description = "API 요청 성공"),
            @ApiResponse(responseCode = "500", description = "에러 발생")
    })
    @RequestMapping(value = {"Get_SampleCmmncdDetail"}, method = {RequestMethod.POST}, produces = "application/json")
    public ResponseEntity<Object> getCmmncdDetail(HttpServletRequest request, HttpServletResponse response, @Parameter(hidden = true) ModelAndView mv,
                                                        @Parameter(name = "parentId", required = true, description = "부모 코드 ID", examples = {
                                                                @ExampleObject(value = "authGrade")
                                                        })
                                                        @RequestParam String parentId,
                                                        @Parameter(name = "page", required = true, description = "페이지")
                                                        @RequestParam(defaultValue = "1") Integer page,
                                                        @Parameter(name = "size", required = true, description = "페이지 사이즈")
                                                        @RequestParam(defaultValue = "10") Integer size) throws Exception {
        log.info("[API : {}]", request.getRequestURI());

        String clientIP = commonUtils.getIp(request);
        Map<String, Object> rtnMap = new HashMap<String, Object>();

        try {
            Pageable pageable = MybatisMariaDBPageRequest.of(page, size);
            Map<String, Object> params = new HashMap<>();
            params.put("parentId", parentId);
            params.put("offset", pageable.getOffset());
            params.put("pageSize", pageable.getPageSize());

            Page<SampleDTO> cmmncdList = sampleService.getCmmncdDetailList(params, pageable);

            rtnMap.put("sampleList", cmmncdList);
            rtnMap.put(ApiMsg.RES_CODE, ApiMsg.SUCCESS_CODE);
            rtnMap.put(ApiMsg.RES_MSG, ApiMsg.SUCCESS_MSG);

            String json = objectMapper.writeValueAsString(rtnMap);
            return ResponseEntity.ok()
                    .body(json);
        } catch (Exception e) {
            e.printStackTrace();
            rtnMap.put("error_code", "9099");
            rtnMap.put("error_msg", e.toString());

            return ResponseEntity.status(500)
                    .contentType(MediaType.APPLICATION_JSON)
                    .header("error_code", "9099")
                    .header("error_msg", "Exception occured.")
                    .body(rtnMap);
        }
    }

위에 보시면 MybatisMariaDBPageRequest.of 라는 부분이 보이시죠.
아주 쉽게 JPA를 사용하지 않고 Mybatis에서 PageRequest를 사용할 수 있습니다. 
스트레스를 아주 시원하게 풀었답니다. 

 

 

728x90

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading