feat: Exception Handler 구현

This commit is contained in:
dongHyo
2022-06-23 15:26:34 +09:00
parent a5cc6f2513
commit d7c17cdfa6
10 changed files with 196 additions and 31 deletions

View File

@@ -0,0 +1,22 @@
package com.ticketing.server.global.exception.handle;
import com.ticketing.server.global.exception.AlreadyDeletedException;
import com.ticketing.server.global.exception.handle.dto.ErrorResponseDTO;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@Slf4j
@RestControllerAdvice
public class AlreadyDeletedHandler {
@ExceptionHandler(value = AlreadyDeletedException.class)
protected ResponseEntity<ErrorResponseDTO> handleException(AlreadyDeletedException e) {
ErrorResponseDTO errorDTO = ErrorResponseDTO.of(e.getClass().getSimpleName(), List.of(e.getMessage()));
return ResponseEntity.status(HttpStatus.CONFLICT).body(errorDTO);
}
}

View File

@@ -0,0 +1,50 @@
package com.ticketing.server.global.exception.handle;
import com.ticketing.server.global.exception.handle.dto.ErrorResponseDTO;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@Slf4j
@RestControllerAdvice
public class CustomMethodArgumentNotValidHandler {
@ExceptionHandler(value = MethodArgumentNotValidException.class)
protected ResponseEntity<ErrorResponseDTO> handleException(MethodArgumentNotValidException e) {
List<ObjectError> allErrors = e.getBindingResult().getAllErrors();
List<String> messages = getMessages(allErrors.iterator());
ErrorResponseDTO result = ErrorResponseDTO.of(e.getClass().getSimpleName(), messages);
return ResponseEntity.badRequest().body(result);
}
private List<String> getMessages(Iterator<ObjectError> errorIterator) {
List<String> messages = new ArrayList<>();
while (errorIterator.hasNext()) {
StringBuilder messageBuilder = new StringBuilder();
ObjectError error = errorIterator.next();
messageBuilder
.append("['")
.append(((FieldError) error).getField()) // 유효성 검사가 실패한 속성
.append("' is '")
.append(((FieldError) error).getRejectedValue()) // 유효하지 않은 값
.append("' :: ")
.append(error.getDefaultMessage()) // 유효성 검사 실패 시 메시지
.append("]");
log.error(messageBuilder.toString());
messages.add(messageBuilder.toString());
}
return messages;
}
}

View File

@@ -0,0 +1,22 @@
package com.ticketing.server.global.exception.handle;
import com.ticketing.server.global.exception.EmailNotFoundException;
import com.ticketing.server.global.exception.handle.dto.ErrorResponseDTO;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@Slf4j
@RestControllerAdvice
public class EmailNotFoundHandler {
@ExceptionHandler(value = EmailNotFoundException.class)
protected ResponseEntity<ErrorResponseDTO> handleException(EmailNotFoundException e) {
ErrorResponseDTO errorDTO = ErrorResponseDTO.of(e.getClass().getSimpleName(), List.of(e.getMessage()));
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(errorDTO);
}
}

View File

@@ -0,0 +1,25 @@
package com.ticketing.server.global.exception.handle;
import com.ticketing.server.global.exception.PasswordMismatchException;
import com.ticketing.server.global.exception.handle.dto.ErrorResponseDTO;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@Slf4j
@RestControllerAdvice
public class PasswordMismatchHandler {
private static final String MESSAGE = "패스워드가 일치하지 않습니다";
@ExceptionHandler(value = {PasswordMismatchException.class, BadCredentialsException.class})
protected ResponseEntity<ErrorResponseDTO> handleException(RuntimeException e) {
ErrorResponseDTO errorDTO = ErrorResponseDTO.of(e.getClass().getSimpleName(), List.of(MESSAGE));
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(errorDTO);
}
}

View File

@@ -0,0 +1,22 @@
package com.ticketing.server.global.exception.handle;
import com.ticketing.server.global.exception.handle.dto.ErrorResponseDTO;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.Order;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@Slf4j
@RestControllerAdvice
@Order
public class RuntimeHandler {
@ExceptionHandler(value = RuntimeException.class)
protected ResponseEntity<ErrorResponseDTO> handleException(RuntimeException e) {
ErrorResponseDTO errorDTO = ErrorResponseDTO.of(e.getClass().getSimpleName(), List.of(e.getMessage()));
return ResponseEntity.badRequest().body(errorDTO);
}
}

View File

@@ -0,0 +1,24 @@
package com.ticketing.server.global.exception.handle.dto;
import java.util.List;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Getter
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class ErrorResponseDTO {
private String code;
private List<String> messages;
private ErrorResponseDTO(String code, List<String> messages) {
this.code = code;
this.messages = messages;
}
public static ErrorResponseDTO of(String code, List<String> messages) {
return new ErrorResponseDTO(code, messages);
}
}

View File

@@ -29,7 +29,7 @@ public class UserServiceImpl implements UserService {
public User register(@Valid SignUpDTO signUpDto) { public User register(@Valid SignUpDTO signUpDto) {
Optional<User> user = userRepository.findByEmail(signUpDto.getEmail()); Optional<User> user = userRepository.findByEmail(signUpDto.getEmail());
if (user.isPresent()) { if (user.isPresent()) {
log.error("이미 존재하는 이메일이기 때문에 신규 회원가입을 진행할 수 없습니다. :: {}", signUpDto); log.error("이미 존재하는 이메일이기 때문에 신규 회원가입을 진행할 수 없습니다. :: {}", signUpDto.getEmail());
throw new IllegalArgumentException("이미 존재하는 이메일이기 때문에 신규 회원가입을 진행할 수 없습니다."); throw new IllegalArgumentException("이미 존재하는 이메일이기 때문에 신규 회원가입을 진행할 수 없습니다.");
} }

View File

@@ -1,10 +1,10 @@
validation.not.empty.name="\uC774\uB984\uC740 \uD544\uC218 \uC785\uB2C8\uB2E4." validation.not.empty.name=\uC774\uB984\uC740 \uD544\uC218 \uC785\uB2C8\uB2E4.
validation.not.empty.email="\uC774\uBA54\uC77C\uC740 \uD544\uC218 \uC785\uB2C8\uB2E4." validation.not.empty.email=\uC774\uBA54\uC77C\uC740 \uD544\uC218 \uC785\uB2C8\uB2E4.
validation.not.empty.password="\uD328\uC2A4\uC6CC\uB4DC\uB294 \uD544\uC218 \uC785\uB2C8\uB2E4." validation.not.empty.password=\uD328\uC2A4\uC6CC\uB4DC\uB294 \uD544\uC218 \uC785\uB2C8\uB2E4.
validation.not.empty.oldpassword="\uD604\uC7AC \uD328\uC2A4\uC6CC\uB4DC\uB294 \uD544\uC218 \uC785\uB2C8\uB2E4." validation.not.empty.oldpassword=\uD604\uC7AC \uD328\uC2A4\uC6CC\uB4DC\uB294 \uD544\uC218 \uC785\uB2C8\uB2E4.
validation.not.empty.newpassword="\uBCC0\uACBD\uD560 \uD328\uC2A4\uC6CC\uB4DC\uB294 \uD544\uC218 \uC785\uB2C8\uB2E4." validation.not.empty.newpassword=\uBCC0\uACBD\uD560 \uD328\uC2A4\uC6CC\uB4DC\uB294 \uD544\uC218 \uC785\uB2C8\uB2E4.
validation.not.empty.grade="\uC0AC\uC6A9\uC790 \uB4F1\uAE09\uC740 \uD544\uC218 \uC785\uB2C8\uB2E4." validation.not.empty.grade=\uC0AC\uC6A9\uC790 \uB4F1\uAE09\uC740 \uD544\uC218 \uC785\uB2C8\uB2E4.
validation.not.empty.phone="\uD734\uB300\uBC88\uD638\uB294 \uD544\uC218 \uC785\uB2C8\uB2E4." validation.not.empty.phone=\uD734\uB300\uBC88\uD638\uB294 \uD544\uC218 \uC785\uB2C8\uB2E4.
validation.email="\uC774\uBA54\uC77C\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4." validation.email=\uC774\uBA54\uC77C\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
validation.phone="\uD734\uB300\uBC88\uD638\uAC00 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4." validation.phone=\uD734\uB300\uBC88\uD638\uAC00 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
validation.password.not.change="\uB3D9\uC77C\uD55C \uD328\uC2A4\uC6CC\uB4DC\uB85C \uBCC0\uACBD\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4." validation.password.not.change=\uB3D9\uC77C\uD55C \uD328\uC2A4\uC6CC\uB4DC\uB85C \uBCC0\uACBD\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.

View File

@@ -1,10 +1,10 @@
validation.not.empty.name="name is required." validation.not.empty.name=name is required.
validation.not.empty.email="email is required." validation.not.empty.email=email is required.
validation.not.empty.password="password is required." validation.not.empty.password=password is required.
validation.not.empty.oldpassword="Old Password is required." validation.not.empty.oldpassword=Old Password is required.
validation.not.empty.newpassword="New Password is required." validation.not.empty.newpassword=New Password is required.
validation.not.empty.grade="user grade is required." validation.not.empty.grade=user grade is required.
validation.not.empty.phone="phone is required." validation.not.empty.phone=phone is required.
validation.email="email is not valid." validation.email=email is not valid.
validation.phone="phone is not valid." validation.phone=phone is not valid.
validation.password.not.change="password not change." validation.password.not.change=password not change.

View File

@@ -1,10 +1,10 @@
validation.not.empty.name="\uC774\uB984\uC740 \uD544\uC218 \uC785\uB2C8\uB2E4." validation.not.empty.name=\uC774\uB984\uC740 \uD544\uC218 \uC785\uB2C8\uB2E4.
validation.not.empty.email="\uC774\uBA54\uC77C\uC740 \uD544\uC218 \uC785\uB2C8\uB2E4." validation.not.empty.email=\uC774\uBA54\uC77C\uC740 \uD544\uC218 \uC785\uB2C8\uB2E4.
validation.not.empty.password="\uD328\uC2A4\uC6CC\uB4DC\uB294 \uD544\uC218 \uC785\uB2C8\uB2E4." validation.not.empty.password=\uD328\uC2A4\uC6CC\uB4DC\uB294 \uD544\uC218 \uC785\uB2C8\uB2E4.
validation.not.empty.oldpassword="\uD604\uC7AC \uD328\uC2A4\uC6CC\uB4DC\uB294 \uD544\uC218 \uC785\uB2C8\uB2E4." validation.not.empty.oldpassword=\uD604\uC7AC \uD328\uC2A4\uC6CC\uB4DC\uB294 \uD544\uC218 \uC785\uB2C8\uB2E4.
validation.not.empty.newpassword="\uBCC0\uACBD\uD560 \uD328\uC2A4\uC6CC\uB4DC\uB294 \uD544\uC218 \uC785\uB2C8\uB2E4." validation.not.empty.newpassword=\uBCC0\uACBD\uD560 \uD328\uC2A4\uC6CC\uB4DC\uB294 \uD544\uC218 \uC785\uB2C8\uB2E4.
validation.not.empty.grade="\uC0AC\uC6A9\uC790 \uB4F1\uAE09\uC740 \uD544\uC218 \uC785\uB2C8\uB2E4." validation.not.empty.grade=\uC0AC\uC6A9\uC790 \uB4F1\uAE09\uC740 \uD544\uC218 \uC785\uB2C8\uB2E4.
validation.not.empty.phone="\uD734\uB300\uBC88\uD638\uB294 \uD544\uC218 \uC785\uB2C8\uB2E4." validation.not.empty.phone=\uD734\uB300\uBC88\uD638\uB294 \uD544\uC218 \uC785\uB2C8\uB2E4.
validation.email="\uC774\uBA54\uC77C\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4." validation.email=\uC774\uBA54\uC77C\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
validation.phone="\uD734\uB300\uBC88\uD638\uAC00 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4." validation.phone=\uD734\uB300\uBC88\uD638\uAC00 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
validation.password.not.change="\uB3D9\uC77C\uD55C \uD328\uC2A4\uC6CC\uB4DC\uB85C \uBCC0\uACBD\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4." validation.password.not.change=\uB3D9\uC77C\uD55C \uD328\uC2A4\uC6CC\uB4DC\uB85C \uBCC0\uACBD\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.