Json으로 반환 되는 응답 클래스를 담기 위한 데이터 메시지 포맷을 설정하였다.
@Data
public class DataMessage<T> {
private ResponseCode status;
private T data;
public static <T> DataMessage<T> success(T data){
return new DataMessage<>(SUCCESS, data);
}
private DataMessage(ResponseCode status, T data){
this.status = status;
this.data = data;
}
}
@Getter
@AllArgsConstructor
public enum ResponseCode {
// 200
SUCCESS(200, "SUCCESS", "요청 성공"),
// 400
INVALID_JWT(400, "JWT-ERROR-01", "유효하지 않은 JWT"),
EMPTY_JWT(400, "JWT-ERROR-00", "JWT 에러"),
// 500
INTERNAL_SERVER_ERROR(500, "SERVER-ERROR-00", "서버 에러"),
;
private final int status;
private final String code;
private final String description;
}
데이터 생성 시 발생하는 응답 클래스를 해당 포멧에 담아 ResponseEntity의 바디 값으로 전달해준다.
스프링 부트에서 제공하는 응답 엔티티 클래스
/**
* Create a {@code ResponseEntity} with a body and status code.
* @param body the entity body
* @param status the status code
*/
public ResponseEntity(@Nullable T body, HttpStatus status) {
this(body, null, status);
}
import com.jpa.practice.config.BusinessException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BusinessException.class)
protected ResponseEntity<ErrorResponse> handleBusinessException(BusinessException e) {
ResponseCode responseCode = e.getErrorCode();
ErrorResponse response = new ErrorResponse(responseCode.getCode(), responseCode.getDescription());
return new ResponseEntity<>(response, HttpStatus.valueOf(responseCode.getStatus()));
}
}
@Getter
@AllArgsConstructor
public class ErrorResponse {
private final String code;
private final String message;
}
public class BusinessException extends RuntimeException{
private ResponseCode responseCode;
public BusinessException(ResponseCode responseCode) {
this.responseCode = responseCode;
}
public ResponseCode getErrorCode(){
return responseCode;
}
}
비즈니스에서 예외 발생시 해당 커스텀 예외 클래스에 응답 코드를 할당하여 반환되는 값을 설정할 예정이다.
이전에 예외처리 핸들러를 작성하지 않았을 때는 모든 함수가 예외 처리를 핸들링 하도록 throws 예약어를 사용해야했고, try catch 등을 써서 항상 블럭을 나눠야했다.
예외처리 핸들러를 통해 클린코드를 작성 가능했음..!
예외처리
https://jaehoney.tistory.com/275
https://velog.io/@doker/Spring-boot-%EC%98%88%EC%99%B8%EC%97%90%EB%9F%AC-%EC%B2%98%EB%A6%AC