먼저, IllegalAccessException
으로 도배해두었던 Member 관련 예외를 커스터마이징 해보자.
커스터마이징 공통 부모 객체로 사용할 추상 클래스인 SidersException
을 상속받아 커스터마이징 하였다.
원래 메시지를 예외 클래스마다 static final String을 만들어서 사용했는데, Enum도 제대로 공부해본 김에 Enum을 적용해서, 한 곳에서 예외들의 status, message, errorCode를 관리해보기로 했다.
@Getter
public enum ErrorUtils {
POST_NOT_FOUND(
404,
"존재하지 않는 글입니다.",
"POST-ERR-404"
),
MEMBER_NOT_FOUND(
404,
"존재하지 않는 회원입니다.",
"MEMBER-ERR-404"
),
IS_NOT_OWNER(
403,
"해당 글에 대한 권한이 없습니다.",
"MEMBER-ERR-403"
),
JWT_NOT_AVAILABLE(
403,
"토큰이 유효하지 않습니다.",
"JWT-ERR-403"
);
private final int status;
private final String message;
private final String errorCode;
ErrorUtils(int status, String message, String errorCode) {
this.status = status;
this.message = message;
this.errorCode = errorCode;
}
}
public class MemberNotExistException extends SidersException {
public MemberNotExistException() {
super(MEMBER_NOT_EXIST.getMessage());
}
public MemberNotExistException(Throwable cause) {
super(MEMBER_NOT_EXIST.getMessage(), cause);
}
@Override
public int getStatus() {
return MEMBER_NOT_EXIST.getStatus();
}
@Override
public String getErrorCode() {
return MEMBER_NOT_EXIST.getErrorCode();
}
}
그 후, IllegalAccessException
으로 도배해두었던 로직을 전부 변경해주었고, 예외 발생에 대한 테스트 로직도 구성하기로 했다.
적용하다보니, 작성자가 아닐 때 수정/삭제 요청을 할 때도 IllegalAccessException
을 적용해두었었다. 이에 대한 예외도 생성해주기로 했다.
public class IsNotOwnerException extends SidersException {
public IsNotOwnerException() {
super(IS_NOT_OWNER.getMessage());
}
public IsNotOwnerException(Throwable cause) {
super(IS_NOT_OWNER.getMessage(), cause);
}
@Override
public int getStatus() {
return IS_NOT_OWNER.getStatus();
}
@Override
public String getErrorCode() {
return IS_NOT_OWNER.getErrorCode();
}
}
SidersException
은 한번에 묶어서 처리하고 있기 때문에, ControllerAdvice에 따로 추가해주지 않아도 된다. 하지만, 멤버 중복으로 인해 발생되는 IllegalArgumentException
의 경우에는 따로 추가해줘야 한다.
(이는 커스텀 예외를 처리하려다가, 예외 던지는게 과한 것 같아서 삭제 고민 중이다. 필터에서 authId에 대해 한번 검증을 수행해주기 때문에.. 물론 과하게 악질인 유저가 접근한다면 말이 달라지겠지..)
@ResponseStatus(code = BAD_REQUEST)
@ExceptionHandler(IllegalArgumentException.class)
public ErrorResult illegalArgumentExceptionHandler(IllegalArgumentException e) {
return ErrorResult.builder()
.status(400)
.code("MEMBER-ERR-400")
.message(e.getMessage())
.build();
}
커스텀 예외를 구현하고, 그에 따른 테스트도 수행하였다.