먼저, 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();
}

커스텀 예외를 구현하고, 그에 따른 테스트도 수행하였다.