ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 패스트캠퍼스 챌린지 13일차
    JAVA/Spring 2021. 11. 13. 23:50

    1. 글로벌 예외 처리 (Global Exception)

    예전에는 대개 예외들을 try catch로 잡아낸 후 이 예외에 대한 결과값을 짜서 return하는 방식(true와 false를 return하는 방식을 많이 사용)으로 예외 처리에 대한 코드를 작성했다. 이런 코드가 짜여질 경우 return되는 값에 대한 처리가 필요하기 때문에 코드가 훨씬 길어지게 된다.

     

    지금까지는 코드 작성 시 예외 발생 없이 성공하는 경우들에 처리를 구체적으로 진행했다면 이번에는 실패에 대한 예외 처리를 구체적으로 정의하는 코드들을 학습한다.

     

    우선 아래와 같이 Controller에 포함된 각각의 메서드에 try catch를 통해 Exception을 처리할 수도 있다.

     

    dmaker.controller.DMakerController

    @PostMapping("/create-developer")
        public CreateDeveloper.Response createDeveleoper(
                @Valid @RequestBody CreateDeveloper.Request request
        ) {
            log.info("GET /create-developer HTTP/1.1");
    		
            // 아래 코드와 같이 모든 Controller의 메서드에 try catch를 걸어주었다.
            try {
                return dMakerService.createDeveloper(request);
            } catch (Exception e) {
                return errorCase;
            }
        }

    위와 같이 코드를 짤 경우 모든 Controller에 포함된 메서드마다 try catch를 정의해주어야 하기 때문에 번거로울 수 밖에 없다.

    이를 해소하기 위해 Controller마다 하나씩 Exception Handler 메서드를 넣어준다.

     

    dmaker.Controller.DMakerController

    @ExceptionHandler(DMakerException.class)
    public DMakerErrorResponse handleException(DMakerException e) {
    }

    아직 DMakerErrorResponse가 정의되지 않았기에 dto 하위에다 정의해준다.

     

    dmaker.dto.DMakerResponse

    @Getter
    @Setter
    @Builder
    @AllArgsContstructor
    @NoArgsConstructor
    public class DMakerErrorResponse {
        private DMakerErrorCode errorCode;
        private String errorMessage;
    }

    DMakerResponse 정의 후 Controller에 선언해두었던 handleException을  정의해준다.

     

    dmaker.controller.DMakerController

    // ExceptionHandler는 요청이 들어온 HttpServletRequest를 매개변수에 함께 받을 수 있다.
    @ExceptionHandler(DMakerException.class)
    public DMakerErrorResponse handleException(
        DMakerException e,
        HttpServletRequest request
        ) {
        log.error("errorCode: {}, url: {}, mesage: {}", 
                    e.getDMakerErrorCode(), request.getRequestURI(), e.getDetailMessage());
                    
        return DMakerErrorResponse.builder()
        .errorCode(e.getDMakerErrorCode())
        .errorMessage(e.getDetilMessage())
        .build();
    }

    위와 같이 Exception Handler를 정의하고 나면 아이디 중복 오류 발생 시 아래와 같이 자동적으로 응답을 return하는 것을 확인할 수 있다.

     

    HttpResponse

    HTTP/1.1 200
    Content-Type: application/json
    
    .......
    
    {
        "errorCode" : "DUPLICATED_MEMBER_ID",
        "errorMessage" : "MemberId가 중복되는 개발자가 있습니다."
    }

    하나 수정해야할 점은 오류 발생 시 위의 응답에서 나타난 것과 같이 200 OK가 아니라 400대 오류를 발생시켜야 한다.

    이를 위해 ExceptionHandler에 ResponseStatus 어노테이션을 추가해준다.

     

    dmaker.controller.DMakerController

    // @ResponeStatus 어노테이션을 추가해준다.
    @ResponseStatus(value = httpStatus.CONFLICT)
    @ExceptionHandler(DMakerException.class)
    public DMakerErrorResponse handleException(
        DMakerException e,
        HttpServletRequest request
        ) {
        log.error("errorCode: {}, url: {}, mesage: {}", 
                    e.getDMakerErrorCode(), request.getRequestURI(), e.getDetailMessage());
                    
        return DMakerErrorResponse.builder()
        .errorCode(e.getDMakerErrorCode())
        .errorMessage(e.getDetilMessage())
        .build();
    }

    이제 아래와 같은 응답을 받게 된다.

     

    HttpResponse

    HTTP/1.1 409
    Content-Type: application/json
    
    .......
    
    {
        "errorCode" : "DUPLICATED_MEMBER_ID",
        "errorMessage" : "MemberId가 중복되는 개발자가 있습니다."
    }

     

     

    본 포스팅은 패스트 캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
    https://bit.ly/3FVdhDa

     

    수강료 100% 환급 챌린지 | 패스트캠퍼스

    딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!

    fastcampus.co.kr

     

    댓글

Designed by Tistory.