24.08.14

윤지현·2024년 8월 14일

TIL

목록 보기
41/75

오늘의 루틴

  • 개인과제 추가 구현 7~8번째 코드 작성 (O)
  • Spring 내용 복습 (O)

이번에도 어떻게 해야할까라는 생각으로 시작을 했다...

7단계 기능: 페이지네이션
-------------------------------------------------------
🔻 설명
   - 많은 양의 데이터를 효율적으로 표시하기 위해 데이터를 여러 페이지로 나눕니다. 
       - 페이지 번호와 페이지 크기를 쿼리 파라미터로 전달하여 요청하는 항목을 나타냅니다.
       - 전달받은 페이지 번호와 크기를 기준으로 쿼리를 작성하여 필요한 데이터만을 조회하고 반환합니다.
-------------------------------------------------------
🔻 조건
   - 등록된 일정 목록을 페이지 번호와 크기를 기준으로 모두 조회합니다. 
   - 조회한 일정 목록에는 담당자 이름이 포함되어 있습니다.
   - 범위를 넘어선 페이지를 요청하는 경우 빈 배열을 반환합니다.
-------------------------------------------------------

문제를 읽어보면 쿼리를 작성해야 한다고 되어있는데 페이지 번호페이지 크기를 파라미터로 입력받아 기존에 만든 쿼리에 넣어 조회하게 만들어야 겠다.

1. MyScheduleController.java

    // 일정 목록 조회
    @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);
    }

2. MyScheduleService.java

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;
    }

3. MyScheduleRepository

// 정렬 추가
        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를 만들었다.

1. ErrorResponse

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);
    }
}

어쨌든 잘 되는 것 같다.

  • 오늘의 후기
    • 일단 작성을 하는데 내가 잘 작성하면서도 의문이 드는 부분들도 있어서 검색하면서 하다 보니 시간이 좀 걸린 것 같다. 아무래도 내일 한 번더 확인하고 강의도 다시 들어야겠다.
profile
첫 시작

0개의 댓글