SNS 프로젝트를 진행하면서 해결 과정과 오류들을 기록하기로 하였다.
해당 프로젝트는 아래와 같은 목표를 갖고 있다.


@AllArgsConstructor
@Getter
public enum ErrorCode {
DUPLICATED_USER_NAME(HttpStatus.CONFLICT, "UserName이 중복됩니다."),
USERNAME_NOT_FOUND(HttpStatus.NOT_FOUND,"UserName Not founded"),
INVALID_PASSWORD(HttpStatus.UNAUTHORIZED, "패스워드가 잘못되었습니다."),
INVALID_PERMISSION(HttpStatus.UNAUTHORIZED, "사용자가 권한이 없습니다."),
POST_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 포스트가 없습니다."),
COMMENT_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 댓글이 없습니다."),
DATABASE_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "DB에러"),
// ADMIN 회원이 일반회원 업로드 하기위해 id로 조회
ID_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 ID가 없습니다."),
ID_NOT_MATCH(HttpStatus.NOT_FOUND, "ID가 서로 일치하지 않습니다."),
// Filter에서 Admin회원 아닐때 접근하기 위함
FORBIDDEN_REQUEST(HttpStatus.FORBIDDEN, "ADMIN 회원만 접근할 수 있습니다."),
EXPIRED_TOKEN(HttpStatus.UNAUTHORIZED, "만료된 토큰입니다."),
INVALID_TOKEN(HttpStatus.UNAUTHORIZED, "잘못된 토큰입니다."),
TOKEN_NOT_FOUND(HttpStatus.UNAUTHORIZED, "토큰이 존재하지 않습니다."),
;
private HttpStatus httpStatus;
private String message;
}
@AllArgsConstructor
@Getter
public class Response<T> {
private String resultCode;
private T result;
//에러 리턴
public static Response<ErrorResponse> error(ErrorResponse errorResponse) {
return new Response("ERROR", errorResponse);
}
// 성공 리턴
public static <T> Response<T> success(T result) {
return new Response("SUCCESS", result);
}
}
@AllArgsConstructor
@Getter
public class ErrorResponse {
private String errorCode;
private String message;
}
@AllArgsConstructor
@Getter
public class AppException extends RuntimeException{
private ErrorCode errorCode;
private String message;
}
@RestControllerAdvice
public class ExceptionManager {
@ExceptionHandler(AppException.class)
public ResponseEntity<Response> AppExceptionHandler(AppException e) {
return ResponseEntity.status(e.getErrorCode().getHttpStatus()).
body(Response.error(new ErrorResponse(e.getErrorCode().name(), e.getMessage())));
}
}