쌓고 쌓다
Enum 타입으로 에러 메시지 및 응답 관리하기 본문
에러 메시지를 보다 깔끔하게 관리하고 응답으로 보낼 수 있는 방법으로 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의 코드가 훨 간결해지고 깔끔해진다!
'프로그래밍 > spring' 카테고리의 다른 글
consumes, produces와 Content-Type 예외 처리 방법 (1) | 2024.01.25 |
---|---|
Spring Security 인증/인가 예외 JSON 처리 (1) | 2024.01.24 |
REST API에서 DTO 유효성 검사와 예외 처리 응답 방법 (1) | 2024.01.22 |
Entity와 DTO의 분리 필요성 및 방법 (0) | 2024.01.22 |
BCryptPasswordEncoder.encode 값이 매번 달라지는 이유 및 비교방법 (0) | 2024.01.20 |
Comments