윤개발
Vue.js + Spring Boot + MySQL+JPA 게시판 만들기(8) - 에러처리 구현 본문
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로 등록된 에러만이 처리됩니다.
에러 플로우
- Service에서 이메일 중복 에러가 발생 Controller로 예외를 던짐
- 던져진 예외는 ControllerAdvice 에서 처리
- ExceptionHandler에 등록된 함수로 실행
에러 처리 구현이 완료되었으니 swagger를 이용해 직접 예외를 발생시켜보겠습니다.
정보를 넣고 Try it out 을 누르면 처음에는 회원가입이 잘 되지만 한번 더 누르게되면 아래와 같이 에러코드를 볼 수 있습니다.
또한 다음과 같이 콘솔에 뜨는 것을 볼 수 있습니다.
이후의 에러처리
이후에 생성할 비지니스 에러는 아래와 같은 방법으로 처리할 수 있습니다.
- Exception 클래스 생성
- GlobalExcetion에 ExceptionHandler 등록
이것으로 에러처리가 완료되었습니다.
전체 코드는 아래 링크에서 확인할 수 있습니다.
https://github.com/sungjaeyoon/board
'프로젝트 > Vue.js, Spring 게시판' 카테고리의 다른 글
Vue.js + Spring Boot + MySQL+JPA 게시판 만들기(7) - 회원가입 API 생성 (16) | 2020.11.15 |
---|---|
Vue.js + Spring Boot + MySQL+JPA 게시판 만들기(6) - 백엔드API Domain 생성 (2) | 2020.10.25 |
Vue.js + Spring Boot + MySQL+JPA 게시판 만들기(5) - 백엔드API 구조 알아보기 (0) | 2020.10.09 |
Vue.js + Spring Boot + MySQL+JPA 게시판 만들기(4) - Intelij 설정 (4) | 2020.10.04 |
Vue.js + Spring Boot + MySQL+JPA 게시판 만들기(3) - 프론트 생성 (1) | 2020.07.29 |