@DateTimeFormat
어떤 형식으로 날짜를 나타낼것인지..
ex) 2024-07-16
2024/07/16
24.07.16 ...
LocalDate, LocalTime, LocalDateTime ..
형식이 일치 하지 않으면 예외 발생
🔸 날짜 조회

MemberController

🔽form에 날짜 입력시!🔽

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

🔽🔽

에러코드 추가


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


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



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

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

🔸 예외 만들어서 동작 확인 해보자
미리 만들어둔 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
...
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를 이용해서 응답코드를 내보낼 수 있는 기능이 스프링에 정의되어있다.