diff --git a/src/main/java/com/goldbalance/dive/domain/member/service/MemberService.java b/src/main/java/com/goldbalance/dive/domain/member/service/MemberService.java index 5159948..685bfba 100644 --- a/src/main/java/com/goldbalance/dive/domain/member/service/MemberService.java +++ b/src/main/java/com/goldbalance/dive/domain/member/service/MemberService.java @@ -3,6 +3,8 @@ import com.goldbalance.dive.domain.member.domain.Member; import com.goldbalance.dive.domain.member.dto.request.MemberSignin; import com.goldbalance.dive.domain.member.repository.MemberRepository; +import com.goldbalance.dive.global.exception.CustomException; +import com.goldbalance.dive.global.exception.ErrorCode; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -20,7 +22,7 @@ public class MemberService { public void signin(MemberSignin request) { boolean isDuplicate = memberRepository.existsByNickname(request.nickname()); if (isDuplicate) { - throw new IllegalArgumentException(); + throw new CustomException(ErrorCode.MEMBER_NICKNAME_DUPLICATE); } Member member = Member.create(request.nickname()); diff --git a/src/main/java/com/goldbalance/dive/global/exception/CustomException.java b/src/main/java/com/goldbalance/dive/global/exception/CustomException.java new file mode 100644 index 0000000..57f56cf --- /dev/null +++ b/src/main/java/com/goldbalance/dive/global/exception/CustomException.java @@ -0,0 +1,19 @@ +package com.goldbalance.dive.global.exception; + +import lombok.Getter; + +@Getter +public class CustomException extends RuntimeException { + + private final ErrorCode errorCode; + + public CustomException(ErrorCode errorCode) { + super(errorCode.getMessage()); + this.errorCode = errorCode; + } + + public CustomException(ErrorCode errorCode, String errorMessage) { + super(errorMessage); + this.errorCode = errorCode; + } +} diff --git a/src/main/java/com/goldbalance/dive/global/exception/ErrorCode.java b/src/main/java/com/goldbalance/dive/global/exception/ErrorCode.java new file mode 100644 index 0000000..dffc7e8 --- /dev/null +++ b/src/main/java/com/goldbalance/dive/global/exception/ErrorCode.java @@ -0,0 +1,17 @@ +package com.goldbalance.dive.global.exception; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.http.HttpStatus; + +@Getter +@AllArgsConstructor +public enum ErrorCode { + INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "서버 에러입니다."), + + // Member + MEMBER_NICKNAME_DUPLICATE(HttpStatus.BAD_REQUEST, "이미 존재하는 닉네임입니다."); + + private final HttpStatus status; + private final String message; +} diff --git a/src/main/java/com/goldbalance/dive/global/exception/ErrorResponse.java b/src/main/java/com/goldbalance/dive/global/exception/ErrorResponse.java new file mode 100644 index 0000000..27191fb --- /dev/null +++ b/src/main/java/com/goldbalance/dive/global/exception/ErrorResponse.java @@ -0,0 +1,8 @@ +package com.goldbalance.dive.global.exception; + +public record ErrorResponse(String errorCodeName, String errorMessage) { + + public static ErrorResponse of(ErrorCode errorCode) { + return new ErrorResponse(errorCode.name(), errorCode.getMessage()); + } +} diff --git a/src/main/java/com/goldbalance/dive/global/exception/GlobalExceptionHandler.java b/src/main/java/com/goldbalance/dive/global/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..3a22e33 --- /dev/null +++ b/src/main/java/com/goldbalance/dive/global/exception/GlobalExceptionHandler.java @@ -0,0 +1,26 @@ +package com.goldbalance.dive.global.exception; + +import static com.goldbalance.dive.global.exception.ErrorCode.*; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; + +@Slf4j +@RestControllerAdvice +public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { + + @ExceptionHandler(CustomException.class) + public ResponseEntity handleCustomException(CustomException e) { + log.error("CustomException : {}", e.getMessage(), e); + return ResponseEntity.status(e.getErrorCode().getStatus()).body(ErrorResponse.of(e.getErrorCode())); + } + + @ExceptionHandler(Exception.class) + public ResponseEntity handleException(Exception e) { + log.error("INTERNAL_SERVER_ERROR : {}", e.getMessage(), e); + return ResponseEntity.status(INTERNAL_SERVER_ERROR.getStatus()).body(ErrorResponse.of(INTERNAL_SERVER_ERROR)); + } +}