SMALL
Spring ControllerAdvice, RestControllerAdvice, ExceptionHandler 란?
@ExceptionHandler 는 @Controller , @RestController 가 적용된 Bean 에서 발생하는 예외를 잡아서 하나의 메서드에서 처리해주는 기능이다. 또한, @ControllerAdvice, @ResControllerAdvice 는 @Controller 에서 오류 발생한것을 잡느냐, @RestController 에서 잡느냐 에 따라 바뀌게 된다. 즉,
개발자가 생각해서 발생시켜 오류를 던지면 Advice 에서 잡아서 다시 return 해주는 방식이다.
아래의 예제를 통해 이해해보자.
예제
ApplicationException 는 내가 만든, RuntimeException 상속받아 만든 class 이다.
@Slf4j
@RestControllerAdvice
public class GlobalRestController {
@ExceptionHandler(ApplicationException.class)
public ResponseEntity<?> applicationHandler(ApplicationException e){
log.error("Error : "+e.toString()); //에러 출력.
return ResponseEntity.status(e.getErrorCode().getStatus())
.body(Response.error(e.getErrorCode().name(),e.getErrorCode().getMessage()));
}
}
ErrorCode는 내가 설정하여 만든 Enum 이다.
@Getter
@AllArgsConstructor
public class ApplicationException extends RuntimeException{
private final ErrorCode errorCode;
}
아래에 Enum 클래스로 오류들을 전부 적어놓고 Font-end 개발자와 상의하여 에러코드를 보내주게된다.
@Getter
@AllArgsConstructor
public enum ErrorCode {
//로그인
USERID_NO(HttpStatus.UNAUTHORIZED,"비밀번호가 틀렸습니다."),
USERID_NOT_JOIN(HttpStatus.UNAUTHORIZED,"가입되지 않은 아이디입니다."),
//회원가입
USERID_SAME(HttpStatus.UNAUTHORIZED,"동일한 아이디가 존재합니다.")
;
private final HttpStatus status;
private final String message;
}
이제 Response 클래스를 만들어 성공과 실패를 만들어보자.
@Getter
@AllArgsConstructor
public class Response<T> {
private String result_code;
private T result;
public static <T> Response<T> error(String errorcode, T errorCode){
return new Response<>(errorcode,errorCode);
}
public static <T> Response<T> success(T result){
return new Response<>("Success",result);
}
}
이제 RestController 로 login 기능을 담아서 오류가 발생이 안됬다면, succes() 보내면 된다.
@RestController
@AllArgsConstructor
@RequestMapping("/api")
public class MainController {
private final UserService userService;
@PostMapping("/login")
public Response<UserRegisterResponse> register(@RequestBody UserLoginRequest request){
UserRegisterResponse userLoginResponse = userService.user_login(request);
return Response.success(userLoginResponse);
}
}
UserService.class
위에 Enum 에서 정의한 코드를 가지고 Advice 에게 던져준다. 그러면 Advice 는 받아 Response 에 Response.error() 발생시켜 JSON 방식으로 Font-end 에게 보내진다.
@Slf4j
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository repository;
public UserRegisterResponse user_login(UserLoginRequest request) {
UserEntity userEntity = repository.findById(request.userId())
.orElseThrow(() -> {
throw new ApplicationException(ErrorCode.USERID_NOT_JOIN);
});
if (!request.password().equals(userEntity.getPassword()))) {
throw new ApplicationException(ErrorCode.USERID_NO);
}
return new UserRegisterResponse(userEntity.getNickname(), "임시token값");
}
}
반응형
LIST
'Spring' 카테고리의 다른 글
Redis (2) (0) | 2023.06.01 |
---|---|
Redis (1) (2) | 2023.06.01 |
Lombok (0) | 2023.05.27 |
WebSocket(2) (0) | 2023.05.25 |
Spring Security (1) (0) | 2023.05.24 |