쌓고 쌓다

Enum 타입으로 에러 메시지 및 응답 관리하기 본문

프로그래밍/spring

Enum 타입으로 에러 메시지 및 응답 관리하기

승민아 2024. 1. 24. 00:34

 

에러 메시지를 보다 깔끔하게 관리하고 응답으로 보낼 수 있는 방법으로 Enum 타입이 있다.

 

먼저 Enum 타입을 보자.

 

ErrorCode

package com.example.spotserver.exception;


import lombok.Getter;
import org.springframework.http.HttpStatus;

@Getter
public enum ErrorCode {

    DUPLICATE_LOGINID(HttpStatus.CONFLICT,"중복된 아이디가 존재합니다."),
    DUPLICATE_NAME(HttpStatus.CONFLICT, "중복된 닉네임이 존재합니다."),
    FAIL_LOGIN(HttpStatus.UNAUTHORIZED, "아이디 또는 비밀번호를 잘못 입력했습니다."),
    NOT_VALID(HttpStatus.BAD_REQUEST, "올바른 입력을 해주세요.");

    private HttpStatus httpStatus;
    private String message;


    ErrorCode(HttpStatus httpStatus, String message) {
        this.httpStatus = httpStatus;
        this.message = message;
    }
}

ErrorCode 또는 Enum 객체가 사용할 수 있는 주요 필드 및 메서드는 다음과 같다.

 

ErrorCode errorCode = ErrorCode.DUPLICATE_LOGINID

  • ErrorCode.DUPLICATE_LOGINID : 반환값으로 상수 데이터 DUPLICATE_LOGINID를 가리킵니다.
  • errorCode.name() : 문자열로 "DUPLICATE_LOGINID"가 반환된다. 열거 타입 정의할때 사용한 상수 이름과 동일하다.
  • errorCode.getMessage() : Getter로 "중복된 아이디가 존재합니다" 문자열을 얻을 수 있다.

 

이제 ErrorCode를 만들기 원하는 사용자 정의 예외 클래스에 다음과 같이 넣어주자.

 

DuplicateException

package com.example.spotserver.exception;

import lombok.Getter;

@Getter
public class DuplicateException extends Exception {

    private ErrorCode errorCode;

    public DuplicateException(ErrorCode errorCode) {
        super(errorCode.getMessage());
        this.errorCode = errorCode;
    }
}

생성자로 받은 ErrorCode의 메시지로 예외 Msg를 설정하며 ErrorCode 필드를 초기화한다.

 

이제 이 예외를 다음과 같이 특정 조건에 터뜨려주자!

if (memberService.existLoginId(loginId)) {
    throw new DuplicateException(ErrorCode.DUPLICATE_LOGINID);
}

 

 

이 예외의 처리는 다음과 같이 컨트롤러단에 코드를 작성하여 응답 처리했다.

@ExceptionHandler(value = DuplicateException.class)
public ResponseEntity<ErrorResponse> duplicateException(DuplicateException e) {
    ErrorCode errorCode = e.getErrorCode();
    ErrorResponse errorResponse = new ErrorResponse();
    errorResponse.setErrorCode(errorCode.name());
    errorResponse.setMessage(errorCode.getMessage());
    return ResponseEntity
        .status(errorCode.getHttpStatus())
        .body(errorResponse);
}

왜 굳이 e.getErrorCode()로 ErrorCode를 꺼내 처리했냐면

중복 예외에 아이디, 닉네임으로 또 중복의 종류가 나눠지기에

ErrorCode를 꺼내 어떤 중복인지 name과 message를 꺼내 응답으로 보내기 위해서이다.

 

응답은 다음과 같이 내려오며 HTTP 상태 코드도 맞춰진다.

{
  "errorCode": "NOT_VALID",
  "message": "아이디를 비울 수 없습니다."
}

 

 

 

+ 더 깔끔한 방법을 찾았다.

ErrorResponse에 생성자로 ErrorCode를 넣어주면 ErrorResponse가 자동으로 완성된다.

 

 

@ExceptionHandler의 코드가 훨 간결해지고 깔끔해진다!

Comments