컨트롤러 에러 처리 과정

강우엉·2023년 10월 10일
0

study

목록 보기
21/44

리턴코드 생성

package project.stylemate.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public enum ReturnCode {
    // 1400번대는 style, 클라이언트 에러
    // 1500 style의 서버 에러
    SUCCESS("0000", "요청에 성공하였습니다."),

    WRONG_PARAMETER("1000", "잘못된 파라미터입니다."),

    USERNAME_ALREADY_EXISTS("4000", "이미 사용중인 아이디입니다."),
    INVALID_GENDER("4001", "잘못된 성별 값입니다."),
    EXPIRED_OR_INVALID_VERIFICATION_CODE("4002", "인증번호가 유효하지 않거나 만료되었습니다. 새 코드를 요청하세요."),
    INVALID_PARAMETER_VALUE("4003", "잘못된 파라미터 값입니다."),
    INVALID_KEY("4004", "잘못된 키 값입니다."),
    INVALID_STYLE_CATEGORY("4005", "잘못된 스타일 카테고리 값입니다."),
    INVALID_USERNAME_OR_PASSWORD("4006", "사용자 이름과 비밀번호를 확인하세요."),

    COMMENT_NOT_FOUND("4007", "해당 댓글을 찾을 수 없습니다."),
    POST_NOT_FOUND("4008", "해당 게시물을 찾을 수 없습니다."),
    MEMBER_NOT_FOUND("4009", "해당 회원을 찾을 수 없습니다.");


    private final String returnCode;
    private final String returnMessage;
}

프로젝트 이름을 딴 SmException 생성

package project.stylemate.exception;

import lombok.Getter;
import lombok.RequiredArgsConstructor;
import project.stylemate.enums.ReturnCode;

@Getter
@RequiredArgsConstructor
public class SmException extends RuntimeException {
    private final ReturnCode returnCode;
}

SmException을 상속받는 클라이언트, 서버 단위 Exception 분리

  • 분리해놓지 않으면 클라이언트에서 에러가 발생했는데도 문제없다고 판단하여 계속 요청을 할 수 있다.
package project.stylemate.exception;

import lombok.Getter;
import project.stylemate.enums.ReturnCode;

@Getter
public class SmRequestException extends SmException {
    public SmRequestException(ReturnCode returnCode) {
        super(returnCode);
    }
}
package project.stylemate.exception;

import project.stylemate.enums.ReturnCode;

public class SmLogicException extends SmException {
    public SmLogicException(ReturnCode returnCode) {
        super(returnCode);
    }
}

공통 ApiResponse 개발

  • 오버로딩을 활용하여 리턴코드와 데이터를 응답할때와 리턴코드만을 응답할때를 구분한다.
package project.stylemate.dto.common;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Getter;
import project.stylemate.enums.ReturnCode;

@Getter
public class ApiResponse<T> {

    private String code;
    private String message;

    @JsonInclude(JsonInclude.Include.NON_NULL)
    private T data;

    public static <T> ApiResponse of(T data) {
        ApiResponse<T> response = new ApiResponse<>();
        response.code = ReturnCode.SUCCESS.getReturnCode();
        response.message = ReturnCode.SUCCESS.getReturnMessage();
        response.data = data;

        return response;
    }

    public static <T> ApiResponse of(ReturnCode returnCode) {
        ApiResponse<T> response = new ApiResponse<>();
        response.code = returnCode.getReturnCode();
        response.message = returnCode.getReturnMessage();

        return response;
    }

}

@RestControllerAdvice

package project.stylemate.exception;

import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import project.stylemate.dto.common.ApiResponse;
import project.stylemate.enums.ReturnCode;

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(SmException.class)
    public ApiResponse<?> handleSmException(SmException e) {
        return ApiResponse.of(e.getReturnCode());
    }

    @ExceptionHandler(value = {
        MethodArgumentTypeMismatchException.class
    })
    public ApiResponse<?> handleRequestException(Exception e) {
        return ApiResponse.of(ReturnCode.WRONG_PARAMETER);
    }


}
profile
우엉이의 코딩 성장일기💻

0개의 댓글