묻고 답해요
130만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
ExceptionHandler로 처리할 필수 Exception들?
@RestControllerAdvice와 @ExceptionHandler를 이용해서 REST API의 예외처리시 일반적으로 Handling 해줘야할 Exception들이 뭐가 있을까요?특히 JPA쪽도 다양한 종류의 RuntimeException 상속한 Exception들이 발생하다보니,뭘 얼마나 막아줘야할지 좀 애매? 막막한 부분들이 있는 것 같습니다.현재는 REST API 구현시 Testcase를 통해 다양한 상황을 테스트하면서 발생하는 Exception들을 확인하면서 계속해서 ExceptionHandler를 추가하고 있는데요. Testcase 돌리다가 DataIntegrityViolationException case를 보고 ExceptionHandler 추가...이런식으로 개발하고 있는데, 상위 Exception들로 싹 잡아버려야할지... 강사님의 현업 경험을 바탕으로기본적으로 이러한 Exception들을 handling해줘야한다고 할만한 best practice 없을까요?
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
ExceptionHandler에서 BindingResult 에 값을 넣어줄순없나요?
안녕하세요. 김영한 강사님. BeanValidator로 검증한 내용은 자동으로 BindingResult에 값이 매핑되는데 서비스단에서 검증할때 오류 발생시 사용자 Exception 발생시켜 ExceptionHandler를 통해 공통으로 처리하고 싶습니다. try catch로 감싸서 콘트롤러에서 BindingResult에 addFieldError 해주면 되는데 소스코드가 길어져서 ExceptionHandler에서 처리하고싶은데 ExceptionHandler는 입력값으로 BindingResult를 따로 받지 않더라구요. 방법이 없을까요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
@ResponseStatus와 @ExceptionHandler 함께 사용한 부분 질문있습니다ㅠㅠ
12:00 ~ @ResponseStatus와 @ExceptionHandler 함께 사용한 부분 설명 관련 두가지 궁금한게 있습니다. 전 시간에 ResponseStatus를 사용하면 ResponseStatusExceptionResolver가 상태 코드를 변경해서 sendError를 발생시킨다고 이해했는데 그럼 sendError가 WAS로 해당 에러를 전달하려고할텐데 그 과정에서 중간에서 @ExceptionHandler가 그 예외를 잡아서 처리함으로써 WAS로 예외가 전달되지 못하고 상태 코드만 변경되고 응답은 처리한데로 정상흐름으로 된다는 건가요..? 그럼 서버 내부적으로 로그를 남긴다던가 하는 용으로 쓰이고 클라이언트에게는 정상적으로 응답하도록 하는 효과가 있는건지요...!
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
@ExceptionHandler 질문!
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]여기에 질문 내용을 남겨주세요. 강의에서 다음과 같은 코드를 설명해 주셨습니다. @ResponseStatus(HttpStatus.BAD_REQUEST)@ExceptionHandler(IllegalArgumentException.class)public ErrorResult illegalExHandler(IllegalArgumentException e){ log.error("[exceptionHandler] ex", e); return new ErrorResult("BAD", e.getMessage());} 여기서 IllegalArgumentException 또는 이를 상속한 자식의 예외가 발생했을때, 등록된 @ExceptionHandler를 통해 위의 핸들러로 예외가 처리되고, WAS 에게는 정상 응답후 끝난다고 하셨습니다. 즉, 이전처럼 WAS에서 다시 서블릿으로 예외를 처리할 컨트롤를 호출하지 않는다 하셨습니다. 이는 HandlerExceptionResolver 활용 에서 알려주셨던 내용입니다. 하지만 의문이 있는데, 위 코드에서는 @ResponseStatus가 추가되어 있습니다. @ResponseStatus는 내부적으로 response.sendError(statusCode, resolvedReason); 를 통해 response 내부에 오류가 발생했었음을 상태로 저장하게 됩니다.(이전 강의에서 알려주셨던 내용) 이후 이를 WAS가 인지하게 되어 기본 에러 페이지인 "/error"로 재요청을 보내야 하는것 아닌가요? 스프링 부트는 response.sendError(...) 가 호출되면 모든 오류는 "/error" 를 호출하게 된다. 라고 알려주신게 생각납니다! 이부분이 어떻게 처리되는 것 인가요?? 조금만 더 알려주시면 감사하겠습니다!!
-
미해결스프링과 JPA 기반 웹 애플리케이션 개발
@ExceptionHandler 메서드에서 ResponseEntity 반환 시 상황 질문
안녕하세요 백기선 강사님! 덕분에 강의를 완주하고 사이드프로젝트로 api 서버를 만들고 있습니다. restapi를 만들고있는데 view기반이랑 조금은 달라서 찾아볼게 많네요.!!ㅎ 익셉션핸들러 처리 중 질문거리가 생겨서 달려왔습니다. @RestControllerAdvice public class ControllerExceptionHandler { @ExceptionHandler(IllegalArgumentException.class) @ResponseStatus(value=HttpStatus.BAD_REQUEST) public ResponseEntity<ErrorResponse> handleIllegalArgumentException(IllegalArgumentException e){ System.out.println(e.toString()); ErrorResponse response = ErrorResponse.builder() .status(HttpStatus.BAD_REQUEST.value()) .message(e.getMessage()) .build(); return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST); } @Getter @Builder public class ErrorResponse { @Builder.Default private LocalDateTime timestamp = LocalDateTime.now(); private String message; //예외 메시지 저장 @Builder.Default private String code = ""; // 예외를 세분화하기 위한 사용자 지정 코드 private int status; // HTTP 상태 값 저장 400, 404, 500 등 } 익셉션핸들러에 대해 위처럼 작성하였고 핸들러메서드에서 return으로 ResponseEntity 가 반환되고, body부로 ErrorResponse 객체 전달하고 있습니다. ExceptionHandlerExceptionResolver : Failure in @ExceptionHandler com.itevent.iteventapi.common.error.ControllerExceptionHandler#handleIllegalArgumentException org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation 위와 같은 에러가 났었는데 결론은 ErrorResponse에 @Getter를 붙이지 않아서 에러가 났고 @Getter 붙여서 해결하였는데요. 어떤 이유로 게터가 없어서 에러가 났는지 짐작이 안되서 질문드립니다. ErrorResponse객체에 getter가 왜 필요한건가요? (jackson변환할 때 getter가 필요..? POJO 객체의 필수조건? 다양한 생각은 드는게 확신이 안서서 질문드립니다.. 아시면 답변 부탁드리겠습니다 :) )