@JsonFormat(shape = JsonFormat.Shape.OBJECT)
@Getter
public enum ErrorCode {
// Common
INVALID_INPUT_VALUE(400, "C001", "Invalid input value"),
METHOD_NOT_ALLOWED(405, "C002", "Method not allowed"),
ENTITY_NOT_FOUND(400, "C003", "Entity is not found"),
INTERNAL_SERVER_ERROR(500, "C004", "Server error"),
INVALID_TYPE_VALUE(400, "C005", "Invalid type value"),
HANDLE_ACCESS_DENIED(403, "C006", "Access is denied"),
// Admin
ADMIN_NOT_FOUND(400, "A001", "Admin account is not found"),
ADMIN_PASSWORD_MISMATCHED(400, "A002", "Admin password is mismatched"),
ADMIN_AND_GROUP_NOT_MAPPED(400, "A003", "Admin and root group is not mapped."),
;
private final String code;
private final String message;
private final int status;
ErrorCode(final int status, final String code, final String message) {
this.status = status;
this.message = message;
this.code = code;
}
}
안녕하세요. 쓰신 글 너무 감명깊게 읽었습니다. 그래서 제가 현재 진행중인 프로젝트에 @cheese10yun 님의 global exception 전략을 적용하고 싶은데 한 가지 문제가 생겨서 여쭤보고 싶어서 이렇게 글 남깁니다.
먼저 제가 이해한 바로는 @Valid로 예외가 발생한 경우에만 errors에 해당 FieldError가 담기고 그 이외에 개발자가 의도적으로 발생시켜준 예외(BussinessException을 상속받은 예외)에는 FieldError가 담기지 않는 거로 저는 이해했습니다.
현재 저는 웹 프로젝트를 개발하고 있는데 해당 프로젝트는 4개 국어(한국어, 영어, 일본어, 스페인어)를 지원하기 때문에 에러 메시지 역시 국제화를 해줘야 합니다. 하나의 언어만 지원한다면 에러 메시지를 ErrorCode의 message에 적어주면 좋겠지만, 4개 국어를 지원하기 때문에 에러 메시지가 동적으로 바뀌어야 합니다. 그래서 messages(messages_ko.properties, messages_en.properties, messages_ja.properties, messages_es.properties)에 각각의 언어로 적힌 에러메시지를 정의해놓고, 해당 메시지를 locale 값을 기준으로 동적으로 ErrorCode의 메시지 부분에 바인딩 해주고 싶습니다. FieldError 같은 경우는 필드에 메시지를 정의해주면 알아서 번역이 되지만(e.g. @NotNull(message = "{login.password.notnull}")) 필드에서 발생하는 에러가 아닌 개발자가 던지는 에러에 에러 메시지는 어떻게 동적을 바인딩할 수 있는지 잘 감이 안 옵니다... 제가 하고 싶은 방법은 2가지 중에 하나입니다.
- ErrorCode enum class에서 -> INVALID_INPUT_VALUE(400, "c001", "{input.invalid_value}") 같이 작성을 하면 Locale 값에 의해 동적으로 메시지 바인딩
- 에러를 던지는 부분 코드에서, throw new AdminUserNotFoundException("{input.invalid_value}", ErrorCode.ADMIN_NOT_FOUND);
사실 2번은 제가 첨부한 코드에서 이미 error message를 정의한 상태에서 메시지 부분만 오버라이팅한다는 점이 조금 어색하지만 enum class 내에서 resouces의 메시지를 동적으로 바인딩할 수 없다면 2번도 나쁘지 않다고 생각합니다. @cheese10yun 님 같으면 어떻게 하실지 궁금합니다.
그리고 웹 프로젝트다 보니, 예외가 발생하면 사용자에게 에러 메시지를 보여주려고 하는데, 만약 field error 값이 담겨있다면 field error의 reason 값을 에러 메시지로 보여주고 그 이외에 개발자가 발생시킨 에외는 field error가 없다보니 message 필드 값을 보여주려고 하는데, 그냥 일관성 있게 예외가 발생하면 message 부분만 보여주는 게 더 나을려나요?
너무 두서없이 글을 써서 죄송하고 답변해주시면 정말 감사하겠습니다!!