이번에도 어떻게 해야할까라는 생각으로 시작을 했다...
7단계 기능: 페이지네이션 ------------------------------------------------------- 🔻 설명 - 많은 양의 데이터를 효율적으로 표시하기 위해 데이터를 여러 페이지로 나눕니다. - 페이지 번호와 페이지 크기를 쿼리 파라미터로 전달하여 요청하는 항목을 나타냅니다. - 전달받은 페이지 번호와 크기를 기준으로 쿼리를 작성하여 필요한 데이터만을 조회하고 반환합니다. ------------------------------------------------------- 🔻 조건 - 등록된 일정 목록을 페이지 번호와 크기를 기준으로 모두 조회합니다. - 조회한 일정 목록에는 담당자 이름이 포함되어 있습니다. - 범위를 넘어선 페이지를 요청하는 경우 빈 배열을 반환합니다. -------------------------------------------------------
문제를 읽어보면 쿼리를 작성해야 한다고 되어있는데 페이지 번호와 페이지 크기를 파라미터로 입력받아 기존에 만든 쿼리에 넣어 조회하게 만들어야 겠다.
// 일정 목록 조회
@GetMapping("/schedules")
public List<MyScheduleResponseDto> getSchedules(
@RequestParam(value = "updatedDay", required = false) String updatedDay,
@RequestParam(value = "manager", required = false) String manager,
Integer pageNumber, Integer pageSize) {
MyScheduleService myScheduleService = new MyScheduleService(jdbcTemplate);
return myScheduleService.getSchedules(updatedDay, manager, pageNumber, pageSize);
}
public List<MyScheduleResponseDto> getSchedules(String updatedDay, String manager, Integer pageNumber, Integer pageSize) {
// DB 저장
MyScheduleRepository myScheduleRepository = new MyScheduleRepository(jdbcTemplate);
int pageNum = (pageNumber != null) ? pageNumber : 1;
int pageSz = (pageSize != null) ? pageSize : 10;
// 날짜 필터링 처리
String formattedDate = null;
if (updatedDay != null && !updatedDay.isEmpty()) {
try {
// 날짜 형식 검증
Timestamp.valueOf(updatedDay + " 00:00:00"); // YYYY-MM-DD 형식 확인
formattedDate = updatedDay;
} catch (IllegalArgumentException e) {
throw new IllegalArgumentException("수정일 입력 형식이 맞지 않습니다. YYYY-MM-DD 형태로 입력해주세요.");
}
}
List<MyScheduleResponseDto> schedule = myScheduleRepository.getSchedules(formattedDate, manager, pageNum, pageSz);
// 가져온 일정이 있는지 혹인
if (schedule.isEmpty()) {
throw new NoSuchElementException("해당하는 스케줄이 없습니다.");
}
return schedule;
}
// 정렬 추가
sql.append(" ORDER BY s.updated_day DESC");
// 페이지네이션 조회
int offset = (pageNumber -1) * pageSize;
sql.append(" LIMIT ? OFFSET ? ");
params.add(pageSize);
params.add(offset);
이를 넣고 실행하니 성공했다.
8단계 기능: 예외 발생 처리 ------------------------------------------------------- 🔻 설명 - 예외 상황에 대한 처리를 위해 'HTTP 상태 코드'와 `에러 메시지`를 포함한 정보를 사용하여 예외를 관리할 수 있습니다. - 필요에 따라 사용자 정의 예외 클래스를 생성하여 예외 처리를 수행할 수 있습니다. - `@ExceptionHandler`를 활용하여 공통 예외 처리를 구현할 수도 있습니다. - 예외가 발생할 경우 적절한 HTTP 상태 코드와 함께 사용자에게 메시지를 전달하여 상황을 관리합니다. ------------------------------------------------------- 🔻 조건 - 수정, 삭제 시 요청할 때 보내는 비밀번호가 일치하지 않을 때 예외가 발생합니다. - 선택한 일정 정보를 조회할 수 없을 때 예외가 발생합니다. - 1. 잘못된 정보로 조회하려고 할 때 - 이미 삭제된 정보를 조회하려고 할 때 -------------------------------------------------------
8단계를 보는데..... 하 예외 발생처리를 해야한다. 기존에 있던 예외처리를 수정하고, GlobalExceptionHandler.java를 만들어서 거기에 예외 처리에 대한 내용을 작성해야겠다.
먼저 상태코드와 메시지를 받고 전달할 ErrorResponse.java를 만들었다.
package com.sparta.myscheduleserver.exception;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@AllArgsConstructor
public class ErrorResponse {
private int status;
private String message;
}
그리고 GlobalExceptionHandler.java를 생성했다.
package com.sparta.myscheduleserver.exception;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.NoSuchElementException;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(NoSuchElementException.class)
public ResponseEntity<ErrorResponse> handleNoSuchElementException(NoSuchElementException ex) {
ErrorResponse errorResponse = new ErrorResponse(HttpStatus.NOT_FOUND.value(), ex.getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.NOT_FOUND);
}
@ExceptionHandler(IllegalArgumentException.class)
public ResponseEntity<ErrorResponse> handleIllegalArgumentException(IllegalArgumentException ex) {
ErrorResponse errorResponse = new ErrorResponse(HttpStatus.BAD_REQUEST.value(), ex.getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);
}
@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleGenericException(Exception ex) {
ErrorResponse errorResponse = new ErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(), "예기치 않은 오류가 발생했습니다.");
return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
어쨌든 잘 되는 것 같다.