JPA에서 제일 매력적인 부분은 Pageable 이라고 저는 개인적으로 생각을 합니다.
아직 JPA의 Entity를 완전히 사용해서 개발을 하는 것은 현재 무리라고 생각을 합니다.
제 개인적인 사견이지만 Table 의 설계가 좀 완벽할 때 사용하는게 나을것 같아요.
그래서 이 좋은 PageRequest Class를 어떻게 하면 Mybatis에서 사용을 할 수 있을까 하고 고민을 해봤습니다.
먼저 PageRequest가 AbstractPageRequest라는 추상 클래스를 상속받은 것을 알 수 있습니다.
그럼 나도 현재 쓰는 DB에 맞게 하나더 만들어서 사용하면 되지 않을까? 라는 생각을 문득 했습니다.
저는 무조건 이 class를 사용해서 페이징의 지옥에서 벗어나고 mybatis에 들어가는 xml의 숫자를 줄여보자고 말이죠.
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를 생성했답니다.
소스코드는 더 있으나 필요한 부분만 발췌했습니다.
@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를 사용할 수 있습니다.
스트레스를 아주 시원하게 풀었답니다.
[Eureka Server] Netflix Eureka Server 소스 (0) | 2022.08.24 |
---|---|
[Logback] Logback configuration error detected (0) | 2022.08.16 |
[Springboot] Springdoc 설정 및 사용방법 (0) | 2022.05.23 |
[SpringBoot] Context-path 설정하는 방법 (0) | 2022.04.12 |
[JWT] Springboot jwt MAVEN 추가하는 방법 (0) | 2022.04.08 |