윤개발

Vue.js + Spring Boot + MySQL+JPA 게시판 만들기(8) - 에러처리 구현 본문

프로젝트/Vue.js, Spring 게시판

Vue.js + Spring Boot + MySQL+JPA 게시판 만들기(8) - 에러처리 구현

DEV_SJ 2020. 11. 20. 14:08

에러처리 구현

이번 포스팅에서는 이전에 완료하지 못했던 에러처리에 대해 설명합니다.

 

에러처리에는 여러 방법이 있으나 이번 게시판에서는 네이버에서 사용하는 에러처리방법을 사용해보겠습니다.

 

 

네이버의 에러처리

{
 	"errorMessage": "Authentication failed (인증에 실패하였습니다.)",
 	"errorCode": "024"
}

네이버는 에러코드와 함께 에러 메시지를 리턴하는 형식을 가지고있습니다.

 

 

에러처리 구현

이에 맞게 exception 폴더에 ErrorResponse 객체를 생성하겠습니다. 

생성 전에 JSON으로 에러를 리턴하기위해 JSON-simple 이라는 의존성을 가져오도록 하겠습니다.

pom.xml에 아래 의존성을 추가한 후 메이븐을 새로고침해줍니다.

<!-- https://mvnrepository.com/artifact/com.googlecode.json-simple/json-simple -->
<dependency>
    <groupId>com.googlecode.json-simple</groupId>
    <artifactId>json-simple</artifactId>
    <version>1.1.1</version>
</dependency>

 

그 후 아래와 같이 ErrorResponse를 생성합니다.

package com.board.My.Board.exception;

import org.json.simple.JSONObject;

public class ErrorResponse {
    public static JSONObject JsonErrorResponse(int errorCode, String errorMessage) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("errorCode", errorCode);
        jsonObject.put("errorMessage", errorMessage);
        return jsonObject;
    }
}

여러 방법이 있지만 저는 다음과 같이 정적메소드를 호출하여 JSON 형식을 리턴하도록 구현하였습니다.

 

 

에러코드 정의

HTTP 상태 코드 에러 원인 상세
400(요청 오류) 요청이 잘못되었을 경우
401(인증실패) 애플리케이션 클라이언트 아이디와 시크릿 값이 없거나 잘못되었을 경우
403(서버가 허용하지 않는 호출) 필수 요청 변수가 빠졌거나 요청변수 이름이 잘못되었을 경우
404(API 없음) API 요청 URL이 잘못되었을 경우
500(서버오류) API 호출은 정상적으로 했지만, API 서버 유지보수나 시스템 오류로 인한 에러가 발생하였을 경우

운영 환경에서 500에러와 에러로그는 절대 사용자에게 보여져서는 안되며 테스트 수준에서 예상치 못한 에러를 발견하는 용도여야합니다.

 

 

GlobalException 생성

다음으로 Controller에서 발생하는 모든 에러가 도달하는 GlobalException을 생성하겠습니다.

package com.board.My.Board.exception;

import org.json.simple.JSONObject;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

@ControllerAdvice
@ResponseBody
public class GlobalException {

    @ExceptionHandler(DuplicateEmailException.class)
    public JSONObject duplicateEmailException(){
        return ErrorResponse.JsonErrorResponse(400, "중복된 이메일 입니다.");
    }
}

 

@ControllerAdvice는 @Controller에서 발생할 수 있는 예외를 잡아 처리해주는 annotation입니다.

 

Controller뿐 아니라 Repository는 Service로 Service는 Controller로 예외를 던지기 때문에 3곳 모두의 에러를 처리하게 됩니다.

다만 @ExceptionHandler로 등록된 에러만이 처리됩니다.

 

 

에러 플로우

  1. Service에서 이메일 중복 에러가 발생 Controller로 예외를 던짐
  2. 던져진 예외는 ControllerAdvice 에서 처리
  3. ExceptionHandler에 등록된 함수로 실행

에러 처리 구현이 완료되었으니 swagger를 이용해 직접 예외를 발생시켜보겠습니다.

정보를 넣고 Try it out 을 누르면 처음에는 회원가입이 잘 되지만 한번 더 누르게되면 아래와 같이 에러코드를 볼 수 있습니다.

 

 

또한 다음과 같이 콘솔에 뜨는 것을 볼 수 있습니다.

 

 

이후의 에러처리

이후에 생성할 비지니스 에러는 아래와 같은 방법으로 처리할 수 있습니다.

  1. Exception 클래스 생성
  2. GlobalExcetion에 ExceptionHandler 등록

이것으로 에러처리가 완료되었습니다.

전체 코드는 아래 링크에서 확인할 수 있습니다.

https://github.com/sungjaeyoon/board

 

sungjaeyoon/board

블로그에 포스팅중인 게시판 만들기입니다. Contribute to sungjaeyoon/board development by creating an account on GitHub.

github.com

 

Comments