ABOUT ME

주니어 개발자

Today
Yesterday
Total
  • [과제] 일정 관리 앱 만들기 도전 Lv5, Lv6
    내일배움캠프/과제 2025. 3. 25. 18:24

    ✅ Lv5. 일정 생성 및 조회

    1️⃣ 과제 조건

    • 설명
      • 예외 상황에 대한 처리를 위해 HTTP 상태 코드(링크)와 에러 메시지를 포함한 정보를 사용하여 예외를 관리할 수 있습니다.
        1. 필요에 따라 사용자 정의 예외 클래스를 생성하여 예외 처리를 수행할 수 있습니다.
        2. @ExceptionHandler를 활용하여 공통 예외 처리를 구현할 수도 있습니다.
        3. 예외가 발생할 경우 적절한 HTTP 상태 코드와 함께 사용자에게 메시지를 전달하여 상황을 관리합니다.
    • 조건
      • 수정, 삭제 시 요청할 때 보내는 비밀번호가 일치하지 않을 때 예외가 발생합니다.
      • 선택한 일정 정보를 조회할 수 없을 때 예외가 발생합니다.
        1. 잘못된 정보로 조회하려고 할 때
        2. 이미 삭제된 정보를 조회하려고 할 때

     

    기존에 구현을 하면서 Exception을 처리하고 있어서 Lv5는 무난히 넘어갔다.

     

     

    ✅ Lv6. null 체크 및 특정 패턴에 대한 검증 수행

    1️⃣ 과제 조건

    • 설명
      • 유효성 검사
        1. 잘못된 입력이나 요청을 미리 방지할 수 있습니다.
        2. 데이터의 무결성을 보장하고 애플리케이션의 예측 가능성을 높여줍니다.
        3. Spring에서 제공하는 @Valid 어노테이션을 이용할 수 있습니다.
    • 조건
      • 할일은 최대 200자 이내로 제한, 필수값 처리
      • 비밀번호는 필수값 처리
      • 담당자의 이메일 정보가 형식에 맞는지 확인

     

    이 부분도 기존에 Valid 를 사용하여 미리 검증을 해놓았기 때문에 무난하게 구현이 완료된 상태였다.

    2️⃣ 트러블 슈팅

    그러나 각 valid 에 따라 다른 에러 메세지를 보내고 싶었다.

     

    찾아보니 각 어노테이션에 message를 입력하여 Excpetion을 처리하면 가능했다.

     

    1. ExceptionAdvice 수정

     

    Valid에 실패할 경우 MethodArgumentNotValidException 에러가 발생한다.

    에러가 뜬 field를 찾아 message 를 다시 return 해주었다.

    
      
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(code = HttpStatus.BAD_REQUEST)
    public Object handleMethodArgumentNotValidException(HttpServletRequest request, MethodArgumentNotValidException e) {
    log.error("MethodArgumentNotValidException URI : " + request.getRequestURI());
    log.error("MethodArgumentNotValidException : " + e.getMessage(), e);
    List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors();
    FieldError fieldError = fieldErrors.get(fieldErrors.size() - 1); // 가장 첫 번째 에러 필드
    String fieldName = fieldError.getField(); // 필드명
    Object rejectedValue = fieldError.getRejectedValue(); // 입력값
    BaseResponse res = new BaseResponse();
    res.setJsonResult(JSONResult.validFailBuilder(e, fieldError.getDefaultMessage()));
    return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(res);
    }

     

    2. 객체 Valid 어노테이션 message 수정

    
      
    public class ScheduleReqDto {
    @Schema(description = "일정 내용")
    @NotBlank(message = "일정 내용을 입력해주세요.")
    @Max(value = 200, message = "일정 내용은 최대 200자 입력 가능합니다.")
    private String schedule;
    @Schema(description = "비밀번호")
    @NotBlank(message = "비밀번호를 입력해주세요.")
    private String password;
    @Schema(description = "작성자 이메일")
    @NotBlank(message = "작성자 이메일을 입력해주세요.")
    @Email(message = "유효하지 않는 이메일입니다.")
    private String email;
    }

     

    
      
    public class ScheduleModDto {
    @Schema(description = "일정 내용")
    @NotBlank(message = "일정 내용을 입력해주세요.")
    @Max(value = 200, message = "일정 내용은 최대 200자 입력 가능합니다.")
    private String schedule;
    @Schema(description = "비밀번호")
    @NotBlank(message = "비밀번호를 입력해주세요.")
    private String password;
    }

     

    일정 내용에는 @Max로 최대 글자수를 제한

    
      
    public class ScheduleDelDto {
    @Schema(description = "비밀번호")
    @NotBlank(message = "비밀번호를 입력해주세요.")
    private String password;
    }

     

    
      
    public class WriterReqDto {
    @Schema(description = "이름")
    @NotBlank(message = "이름을 입력해주세요.")
    private String name;
    @Schema(description = "이메일")
    @NotBlank(message = "이메일을 입력해주세요.")
    @Email(message = "유효하지 않는 이메일입니다.")
    private String email;
    }

     

    
      
    public class CustomPageable {
    @Schema(description = "페이지 번호 (1부터 시작)", defaultValue = "1")
    @Min(value = 1, message = "페이지 번호는 1 이상이어야 합니다.")
    private int page = 1;
    @Schema(description = "한 페이지에 표시할 데이터 개수", defaultValue = "10")
    @Min(value = 1, message = "표시 데이터 개수는 1 이상이어야 합니다.")
    private int size = 10;
    public int getOffset() {
    return (this.page - 1) * this.size;
    }
    }

     

    paging 객체에는 최소 값 @Min 을 설정해주었다.

Designed by Tistory.