# @ExceptionHandler

27개의 포스트
post-thumbnail

Spring Tips (2)

valdation ExceptionHandler @Valid 애너테이션을 통해 우리는 Controller로 오는 정보들의 유효성을 검사 할 수 있다. 이 때 유효성 검사에서 통과하지 못하면 MethodArgumentNotValidException이 발생한다. 이 예외가 발생했을 때 대처하는 방법은 두가지가 있다. BindingResult 하나는 Controller내부 mapping 메서드들 마다 매개변수로 BindingResult를 받아 hasErrors() 메서드를 사용해서 예외가 발생했는지 확인하고 후처리를 하는 방법. @ExceptionHandler 또 하나는 @ExceptionHandler 애너테이션을 사용해서 MethodArgumentNotValidException을 감지하도록 만들고 그에 따른 responseEntity를 만들어 처리하는 방법. 유효성 검사가 여러개 시행 될 경우 여러개를 담아야하기 때문에 위 코드에서는 Map에 에러요약을

2023년 6월 29일
·
0개의 댓글
·

Spring boot3 ExceptionHandler, Optional

ExceptionHandler ExceptionHandler가 속해있는 controller에서 Handler에 명시된 예외 발생시 동작한다. ResponseEntity는 response의 header, body, status를 설정할 수 있다. 전역 controller에서 예외처리를 하고 싶다면 @ControllerAdvice 같은 키워드를 공부해보자. Optional Optional.ofNullable은 Optional로 value를 Wrapping하고 isPresent는 boolean을 반환한다. why java의 Optional chaining은 어떨까? typescript의 Partial 같은게 없을까? lombok은 상속에 어떻게 적용될까?

2023년 6월 27일
·
0개의 댓글
·

Controller Exception Handler

사용 계기 service logic은 당연히 service단에 있고 service 단에서 exception 처리와 log를 찍는다. 근데 뭔가 킹받는 부분이 있었다. 이건 내가 전에 만든 controller method중 일부인데 문제는 바로 ms.findById에서 무슨 exception을 발생시킬 줄 알고 이렇게 코드를 짜는가 였다. 그래서 생각한 방안은 2가지였다. 메소드의 반환값을 error msg 나 success msg를 string 형식으로 반환하기. -> 이건 시도도 안했다.. 뭔가 시원한 방식이 아니였기 때문에. service metghod에서 exception throw 하기 service 단에서 발생한 예외를 catch 하는 로직인데 짜 증 난 다 뭔가 더럽다. 그리고 service에서 log 를 찍어야 하는데 이러면 controller에서 찍지 않는가 ? 그래서 찾아낸것이 바로 ExceptionHandler 이걸 사

2023년 5월 18일
·
0개의 댓글
·
post-thumbnail

[Spring MVC] 예외처리

예외처리 @RequestMapping 모든 타입의 예외를 발생시킬 수 있음 예외 발생 시 웹 브라우저에 500 응답코드 + 서블릿 컨테이너 출력 에러 페이지 예외 타입에 따라 스프링 MVC와 연동된 뷰를 이용해서 에러 페이지 출력 예외 처리 방법 @ExceptionHandler 어노테이션을 이용 : 해당 어노테이션을 이용한 메소드를 만든 Controller 영역에서만 유효 SimpleMappingExceptionResolver 클래스 이용 : xml문서에서 설정 1과 2를 함께 사용하여 예외 처리 하고 싶을 때 xml 문서에 bean 선언 @ExceptionHandler 어노테이션 현재 컨트롤러 실행시 발생하는 예외처리 SimpleMappingExceptionResolver 클래스 👇@Component 변경 하고 싶을 때 👇Spring 내부에 있는 클래스를 Java

2023년 4월 27일
·
0개의 댓글
·
post-thumbnail

Exception 처리 구현

상황 스프링 부트 프로젝트에서 회원 가입을 하는 상황에서 여러 정보를 받는 상황에서 아이디의 길이가 짧거나 비밀번호가 양식에 맞지 않는 등 여러 종류의 Exception이 발생하게 된다. 이런 예외를 어떻게 하면 한 곳에서 처리하고 더 간편한 방법으로 처리할 수 있는 방식을 찾으면서 내가 겪었던 일들이다. 프로젝트 java springboot spring security spring data jpa h2 DB 초기 생각 내가 가장 중요하게 생각한 점은 공통화였다. 지금은 내가 회원 가입에서 받는 정보 중에서 내가 정한 양식(regex)에 맞지 않는 정보에 대한 예외를 발생시키지만, 다른 개발자는 게시판이나 댓글과 같은 상황에서도 이런 정보들의 양식을 검증하는 일을 할 것이라고 생각했다. 따라서 회원 정보를 검증하는 로직이라는 생각보다 어떤 정보든 내가 검증하길 원하는 정보는 어느 곳에서나 검증하고 그런 검증에 발생하는 오류 메세지를 한

2023년 4월 24일
·
0개의 댓글
·
post-thumbnail

Exception

아래의 방식들은 예외가 발생했을 시, 예외를 처리하지 않고 예외가 발생한 메서드를 호출한 곳에서 에러 처리를 할 수 있게 전가하는 상황일때 주로 사용한다. (혹은 에러를 한 곳으로 모을때) 예외 상황을 파악해서 문제를 해결하는 방식은 try/catch가 효율적이다. 스프링 부트의 예외 처리 방식 스프링 부트의 예외 처리 방식은 크게 2가지가 존재 @ControllerAdvice와 @ExceptionHandler를 통한 모든 Controller에서 발생할 수 있는 예외 처리 @ExceptionHandler를 통한 특정 Controller의 예외 처리 > @ControllerAdvice 대신 @RestControllerAdvice를 사용하면 결과값을 JSON 형태로 반환할 수 있습니다. <span st

2023년 3월 25일
·
0개의 댓글
·
post-thumbnail

스프링의 예외 처리 - API

ExceptionResolver 디스페처 서블릿은 컨트롤러에서 발생한 예외를 처리하기 위한 ExceptionResolver를 제공한다. 여기서 처리되지 않고 WAS까지 예외가 전달되면 뷰 템플릿을 찾기 위해 내부적으로 다시 컨트롤러까지 호출되는 일이 발생한다. 이는 컨트롤러는 물론, 필터와 인터셉터까지 재호출이 되기 때문에 비효율적인 동작이 추가되어 버린다. ExceptionResolver는 이 현상을 방지하고자 컨트롤러에서 발생한 예외를 해결하기 위해 ViewResolver나 HttpConverter이 호출되기 전에 ExceptionResolver를 호출하여 적절한 처리를 하게 한다. 인터셉터를 통해 컨트롤러에서 발생한 예외처리를 하려고 하면 preHandler나 afterCompletion에

2023년 2월 22일
·
0개의 댓글
·
post-thumbnail

Validation, 정규식

Validation validation 이란 프로그래밍에 있어서 가장 중요. 에러를 방지 하기 위해서 미리 검증을 하는 과정을 validation이라고 한다. 검증해야 할 값이 많을 경우 코드의 길이가 길어 진다. 구현에 따라서 달라 질 수 있지만 Service Logic과의 분리가 필요하다. 흩어져 있는 경우 어디에서 검증을 하는지 알기 어려우며, 재사용의 한계가 있다. 구현에 따라 달라 질 수 있지만, 검증 Logic이 변경 되는 경우 테스트 코드 증 참조하는 클래스에서 Logic이 변경되어야 하는 부분이 발생 할 수 있다. Validation Annotation | @Size | 문자 길이 측정 | Int Type 불가 | | --- | --- | --- | | @NotNull | null 불가 | | | @NotEmpty | null, “”불가 | | | @NotBlank | null, “”, “{space}“ 불가 | | | @P

2023년 1월 21일
·
0개의 댓글
·
post-thumbnail

Spring MVC에서의 예외처리

@ExceptionHandler (1) MethodArgumentNotValidException 객체에서 getBindingResult().getFieldErrors() 를 통해 발생한 에러 정보를 확인할 수 있다. (2) (1)에서 얻은 에러 정보를 ResponseEntity 를 통해 Response Body 로 전달한다. 위와 같이, 유효성 검사 실패에 대한 에러 메시지를 구체적으로 전송해주기 때문에 클라이언트 입장에서는 이제 어느 곳에 문제가 있는지를 구체적으로 알 수 있게 되었다. 하지만, 굳이 알 수 없는 모든 정보를 포함한 메세지를 받을 필요성은 없어보인다. 문제가 되는 정보만 받아볼 수 있으면 더 효율적이지 않을까? DTO 클래스의 유효성 검증 실패 시, 실패한 필드(멤버 변수)에 대한 Error 정보만 담아서 응답으로 전송하기 위한 ErrorResponse 클래스다. (1) 과 같이 한 개

2022년 10월 25일
·
0개의 댓글
·
post-thumbnail

호출될 거라 예상했던 @ExceptionHandler가 일을 안 하네?

스프링에서 @ControllerAdvice를 통해서 예외를 처리할 때 내부에 @ExceptionHandler를 등록하게 됩니다. 그런데 RuntimeException을 상속한 특정 도메인의 예외를 만들고 처리하기 위해서 새로운 Advice와 Handler를 등록했는데 상위의 Handler만 호출되는 문제를 겪었습니다. 왜 위와 같은 문제가 생겼는지, 어떻게 해결 할 수 있을지에 대해서 알아보겠습니다. 문제 상황 재현 아래와 같이 TestController가 있고 TextException이 발생되는 test() 메소드가 있습니다. 그리고 RuntimeException을 처리할 수 있는 AControlllerAdvice와 RuntimeException의 하위 클래스인 TestException을 처리할 수 있는 BControllerAdvice가 있습니다. 여기서 /throw를 외부에서 호출하게 되면 어떤 `@Ex

2022년 9월 24일
·
1개의 댓글
·
post-thumbnail

ExceptionHandler 에서 @CookieValue 를 사용할 수 없는 이유

문제상황 RefreshToken 이 유효하지 않은 경우 예외를 던지고 쿠키가 삭제되도록 구현했다. Controller 에서 사용했던 것 처럼 @CookieValue 를 사용해 쿠키를 인자로 받으려고 했지만 해당 테스트가 계속 실패했다.(해당 ExceptionHandler가 동작하지 않았다) 원인 Controller 와 다르게 ExceptionHandler 에서는 @CookieValue를 지원하는 ServletCookieValueMethodArgumentResolver 를 가지고 있지 않다. 그래서 Cookie 로 바인딩하려고 할 때 처리할 ArgumentResolver 를 찾을 수 없어서 테스트가 실패했던 것이다.(아래 사진 참고) ![](https://velog.velcdn.com/ima

2022년 9월 17일
·
0개의 댓글
·

API 오류 처리 @ExceptionHandler, @ControllerAdvice

스프링이 제공하는 ExceptionResolver 스프링 부트가 기본으로 제공하는 ExceptionResolver는 다음과 같다. 다음의 우선 순위로 HandlerExceptionResolverComposite에 등록된다. ExceptionHandlerExceptionResolver @ExceptionHandler를 처리한다. ResponseStatusExceptionResolver HTTP 상태 코드를 지정해준다. (@ResponseStatus(value = HttpStatus.NOT_FOUND) DefaultHandlerExceptionResolver 스프링 내부 기본 예외를 처리한다. @ExceptionHandler 스프링은 API 예외 처리 문제를 해결하기 위해 @ExceptionHandler라는 애노테이션을 사용하는 매우 편리한 예외 처리 기능을 제공하는데, 이것이 바로 앞서 언급한 ExceptionHa

2022년 8월 23일
·
0개의 댓글
·

Chapter14 MVC4 : 날짜 값 변환, @PathVariable, 익셉션 처리

커맨드 객체 Date 타입 프로퍼티 변환처리: @DateTimeFormat 커맨드 객체(form태그에서 받아오는 객체 값)에 @DateTimeFormat 어노테이션이 적용되어 있으면 @DateTimeFormat에서 지정한 형식을 이용해서 문자열을 LocalDateTime 타입으로 변환한다. pattern 속성값으로 "yyyyMMddHH"를 주었는데 이 경우 "2022081024"의 문자열 즉, "2022년 8월 10일 24시" 값을 갖는 LocalDateTime 객체로 변환해준다. 변환 처리에 대한 이해 > @DateTimeFormat 어노테이션을 사용하면 지정한 형식의 문자열을 LocalDateTime타입으로 변환해주는 것은 WebDataBinder이다. > > 스프링 MVC는 요청 매핑 어노테이션 적용 메서드와 DispatcherServlet 사이를 연결하기 위해 RequestMappingHandlerAdapter 객체를 이용한다. > 이 핸들러

2022년 8월 10일
·
0개의 댓글
·
post-thumbnail

[Spring] @ControllerAdvice, @ExceptionHandler

스프링 부트의 예외 처리 방식 @ControllerAdvice로 모든 컨트롤러에서 발생할 예외를 정의 @ExceptionHandler를 통해 발생하는 예외마다 처리할 메소드를 정의 @ControllerAdvice @Controller나 @RestController에서 발생한 예외를 한 곳에서 관리하고 처리할 수 있게 도와주는 어노테이션 try-catch 를 통한 예외 처리는 코드라인도 길어지고 가독성이 떨어짐 예외 발생 시 json 형태로 결과를 반환하기 위해서는 @RestControllerAdvice 를 사용하면 됨 동일한 유형의 Error Response 반환 확장성이 용이한 Custom Exception 사용 @ExceptionHandler 예외 처리 상황이 발생하면 해당 Handler로 처리하겠다고 명시하는 어노테이션 어노테이션 뒤에 괄호를 붙여 어떤 ExceptionClass

2022년 8월 2일
·
0개의 댓글
·

@ExceptionHandler, @ControllerAdvice를 활용한 API 예외 처리

why: API는 어떻게 예외처리 해야할까?! API는 각 시스템마다 응답의 모양이 다르고 ex. 같은 예외가 발생하더라도 메뉴 api와 주문 api는 응답이 달라질 수 있음 스펙도 다르다 ex. 어떤 상황에선 예외지만, 어떤 상황에선 정상흐름일 수 있음 따라서, 세밀한 예외처리가 필요하다 @ExceptionHandler, @ControllerAdvice 없이, 세밀한 예외처리를 할 수 있을까? BasicErrorController를 이용할 수 있을까? BasicErrorController는 웹 브라우저에서 html 화면을 통해 예외 정보를 전달할 땐 편리하지만, api 응답으론 어렵다. api서버가 표준화된 html에러를 만드는 것도 매번 정의하기 번잡스럽다 받는쪽에서 html을 파싱해서 그 예외를 핸들링해야하는 것도 귀찮다. HandlerExceptionResolver를 직접 구현하는건 어떨지? ModelAndV

2022년 5월 22일
·
0개의 댓글
·

Spring MVC의 예외 처리

스프링에서 클라이언트의 요청을 서버가 처리할 때 발생하는 예외 처리의 방법은 크게 3가지가 있다. 이 방법들의 공통점은 스프링의 핵심 기술인 aop를 사용해 스프링이 로직을 수행할 때 발생하는 error를 대신 catch하고 개발자가 의도한 에러 메세지나 error status 정보로 응답해주기 때문에 개발자는 예외 처리를 비즈니스 로직 내에 작성하지 않아도 되는 관심사의 분리가 가능해진다. @ExceptionHandler 특정 Controller나 RestController에서 발생하는 예외를 catch하는 아노테이션으로 아래의 사용 예시처럼 catch를 할 예외 클래스 지정이 가능하고 해당 아노테이션이 붙은 메소드에서는 예외 처리로 수행할 동작을 구현하면 된다. @ControllerAdvice 특정 컨트롤러에만 적용되는 것이 아닌 빈으로 등록된 모든 컨트롤러에 대한 예외 처리 수행이 가능하게 하는 아노테이션으로 해당 클래스내 @ExcepitionHandler가

2022년 5월 4일
·
0개의 댓글
·

2022년 04월 26일 TIL

@ExceptionHandler Controller, RestController에만 적용할 수 있다. 를 등록한 Controller에만 적용된다. @ControllerAdvice 모든 @Controller 즉, 전역에서 발생할 수 있는 예외를 잡아 처리해주는 annotation이다. + 는 controller에서 정의된 @ExceptionHandler보다 우선순위가 밀린다. spring-jdbc & h2 datasource 설정(설정 파일)을 하지 않으면 자동으로 인메모리 DB를 실행한다. Spring boot에서 db를 사용하기 위해서는 사용하는 DB에 맞는 driver(mysql-connector-java)와 spring-boot-starter-jdbc 의존성이 필요하다. 이러한 필요요소들을 다 준비되면 설정파일에 datasource에 대해 설정해야한다.(url, username, password) Template engine

2022년 4월 26일
·
0개의 댓글
·
post-thumbnail

Exception Handling과 Response 코드 개선

Intro 지난 작업 기록에선 Postman에 나타나는 Response Body 내용에 대한 개선점이 필요했었다. 이번 작업에선 이를 해결하기 위해 일관성 있는 코드 스타일을 유지하면서 Exception을 처리하고, 더 나아가 API의 Response 형태 또한 다듬고자 하였다. Exception Handling Spring에서 제공하는 @RestControllerAdvice, @ExceptionHandler를 활용하여 API 예외 처리를 하였다. 목표점은 다음과 같은 형식들이다. 일관된 ErrorResponse 반환 구성한 도메인을 통틀어 공통적으로 처리해야 하기 때문에 다음과 같은 패키지 구조로 만들었다. ![](https://media.vlpt.us/images/songs4805/post/e5151993-fc0e-4a16-9340-c0e0e63c48da/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%

2022년 4월 4일
·
0개의 댓글
·
post-thumbnail

[Spring] 예외처리

본 글은 인프런 김영한님의 스프링 완전 정복 로드맵을 기반으로 정리했습니다. 0. 들어가며 예외 처리는 애플리케이션의 매우 중요한 부분입니다. MVC 예외 처리는 서블릿의 기능을 사용할 수도 있고 스프링 부트가 제공하는 기능을 사용할 수도 있습니다. 먼저, 서블릿이 제공하는 기능을 살펴보며 내부적인 원리를 살펴본 다음, 스프링 부트가 제공하는 기능의 편리함을 이용하는 방향으로 글을 정리했습니다. API의 경우 예외처리를 할 수 있는 방법이 다양하기 때문에 따로 정리했습니다. 1. MVC 예외처리 with 서블릿 웹 애플리케이션은 사용자 요청마다 쓰레드가 할당되고, 쓰레드는 서블릿 컨테이너 내부의 서블릿을 이용해서 실행된다. 전형적인 스프링 애플리케이션의 경우 서블릿을 디스패쳐 서블릿으로 이해하면 된다. 만약, 쓰레드 실행중에 예외가 발생했는데 try-catch 로 잡지 못하고 서블릿 밖으로 예외가 세어나가면 결국 톰캣같은 WAS 까지 예

2022년 3월 10일
·
0개의 댓글
·
post-thumbnail

exceptionhandler를 이용한 404페오류페이지 처리

참고포스팅 | https://hongs-coding.tistory.com/118 @ControllerAdvice @controller, @restcontroller에서 발생한 예외를 한 클래스에서 모두 관리하고 처리할 수 있게 해주는 어노테이션입니다. @Exceptionhandler @ExceptionHandler는 @controller, @restController가 적용된 Bean내에서 발생하는 예외를 하나의 메서드에서 처리해주는 어노테이션입니다. @controllerAdvice 내에서 exception처리를 해주는 메서드에 부착해서 사용합니다. Exception (추가설명) ControllerAdvice에서 기능별 예외들을 만들 땐 runtimeException을 상속하는 CustomException 클래스를 생성해 이 클래스를 상속받는 여러 종류의 Exception클래스를 만들어 사용할 수 있습니다. <img src="https://images.v

2022년 2월 19일
·
0개의 댓글
·