스프링 MVC_날짜 값 변환, @PathVariable, 컨트롤러 예외 처리

예지성준·2024년 7월 16일

스프링프레임워크

목록 보기
11/14
post-thumbnail

1. 날짜 값 변환

@DateTimeFormat

  • 어떤 형식으로 날짜를 나타낼것인지..
    ex) 2024-07-16
    2024/07/16
    24.07.16 ...

  • LocalDate, LocalTime, LocalDateTime ..

  • 형식이 일치 하지 않으면 예외 발생

    • 메세지 코드 typeMismatch

🔸 날짜 조회

MemberController

🔽form에 날짜 입력시!🔽

@DateTimeFormat 지정하기 전에는 20240701이런식으로 숫자만 입력해서 날짜 검색을 했을 경우 패턴을 읽지 못하고 오류가 생긴다. (400오류)

@DateTimeFormat 형식 지정하고 나서는 패턴 읽고 날짜 잘 출력됨

🔽🔽


에러코드 추가

자체 커맨드 객체에서 검증

validation.properties
typeMismatch.java.time.LocalDate=날짜 형식이 아닙니다(ex - 20240716).
//로컬데이터에 한정에서 typeMismatch 오류 메시지를 보여줌

2. @PathVariable : 경로 변수

값이 반드시 있어야 문제 없이 나옴

기본값 true이기 때문에 경로 작성 없었을때 오류가 나는거임

위처럼 해주면 값이 없으면 오류없이 null값으로 들어감

3. 컨트롤러 익셉션 처리하기

1) @ExceptionHandler

  • 발생 예외를 정의
  • 예외발생시 특정 페이지를 노출
  • 메서드에 자동 주입
    • 발생한 예외 객체
    • Model
    • HttpServletRequest
    • HttpServletResponse
    • HttpSession

🔸 예외 만들어서 동작 확인 해보자

미리 만들어둔 BadRequestException 활용

🔼 기본 오류 페이지 🔼

꾸미기 ~...

같은 오류지만 내가 꾸며준대로 나왔다

문제를 알기 위해 에러 객체 주입

public String errorHandler(BadRequestException e){
        e.printStackTrace();
        return "error/common";
    }

에러 종류가 달라도 보통 에러페이지 디자인은 하나의 뷰 가지고 쓰는 경우가 대부분임 -> Exception으로 유입받음

@ExceptionHandler(Exception.class) //발생할 예외정보 클래스 정의(여러개 가능)
    public String errorHandler(Exception e, HttpServletRequest request, HttpServletResponse response, Model model){
        e.printStackTrace();
        return "error/common"; //위에 예외 클래스 발생시 이 경로로 반환(뷰)
    }

참고) 스프링 부트
에러페이지 기초 정보가 이미 el속성으로 추가되어있다.
status: HTTP 상태코드
error: 에러코드
path: 예외가 발생한 URI
exception
message
timestamp
...

2) @ControllerAdvice

  • 컨트롤러의 공통적이 처리를 담당
  • 특정 패키지 범위 있는 공통적인 값 처리할때
    ex)에러 페이지 등
    • 공통 값 유지-> @ModelAttribute
    • 공통 에러 페이지 처리 -> @ExceptionHandler

MemberController에 정의했던 errorHandler메서드는 지우고 따로 공통 컨트롤러 만들어서 정의

@Slf4j
@ControllerAdvice("org.choongang")//공통 처리 할 경로
public class CommonControllerAdvice {

    @ExceptionHandler(Exception.class) //발생할 예외정보 클래스 정의(여러개 가능)
    public String errorHandler(Exception e, HttpServletRequest request, HttpServletResponse response, Model model){
        e.printStackTrace();
        log.info("advice 유입");
        return "error/common"; //위에 예외 클래스 발생시 이 경로로 반환(뷰)
    }
}

하지만 400응답코드가 나와야하는데 200이 나오고있다

@Slf4j
@ControllerAdvice("org.choongang")//공통 처리 할 경로
public class CommonControllerAdvice {

    @ExceptionHandler(Exception.class) //발생할 예외정보 클래스 정의(여러개 가능)
    public ModelAndView errorHandler(Exception e, HttpServletRequest request, HttpServletResponse response, Model model){
        e.printStackTrace();
        log.info("advice 유입");

        //기본 상태코드 500으로 설정하고 예외 객체에 상태코드가 있으면 바꿔주는 형식으로 만들기
        HttpStatus status = HttpStatus.INTERNAL_SERVER_ERROR; //500
        
        //instanceof로 객체 체크(500이 아닌 다른 예외객체일 경우)
        if(e instanceof CommonException commonException){
            //CommonException commonException = (CommonException) e;
            status = commonException.getStatus();
        }//내가 정의한 예외는 정확히 내가 지정한 응답코드를 내보내기 위함
        //정의 한 예외의 가장 상위 클래스는 CommonException 유연성을 위해 해당 객체로 출처 검사

//스프링에서 정의한 상태코드 내보낼수있는 형태 사용( 반환값을 String에서 Model로 바꿨다)
        ModelAndView mv = new ModelAndView();
        mv.setStatus(status); //응답코드

        mv.setViewName("error/common");

        return mv;
    }
}

참고) *ResponseEntity를 이용해서 응답코드를 내보낼 수 있는 기능이 스프링에 정의되어있다.

profile
꽁꽁 얼어붙은 한강 위로 😺

0개의 댓글