리턴코드 생성
package project.stylemate.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum ReturnCode {
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);
}
}