티스토리 뷰
반응형
reference: jeong-pro.tistory.com/195
서버 개발하면서 익셉션 컨트롤을 해야 하는 경우가 종종 생깁니다.
예를 들어 회원의 세션이 만료된 경우 세션 익셉션을 던져주는 경우가 있죠.
public String getUsernameInCache(HttpSession session) {
User user = findUserBySession(session);
if(user == null) {
throw new UnauthorizedUserException("세션이 만료되었습니다.");
}
String redisKey = "USERNAME:" + user.getUsername();
String redisValue = valueOperations.get(redisKey);
return (StringUtils.isBlank(redisValue)) ? null : redisValue;
}
위의 사례는 캐시메모리(Redis)에 저장된 세션에 접속한 사용자의 명을 가져오는 메소드입니다.
하지만 위의 경우 user == null 의 조건에서 걸리는 경우가 있습니다. 바로 서버가 재배포되어 세션이 초기화되는 경우인데요, 이러한 경우 익셉션 핸들링을 하려고 하여도 클라이언트에서는 500에러가 나면서 문제가 발생했다고 밖에 출력이 되지 않습니다.
이를 해결하기 위해서 다른 에러 핸들링 방법을 찾아보다가 @ControllerAdvice 라는 어노테이션이 있음을 확인하였습니다.
사용 방법은 정말 간단하고, 모든 컨트롤러의 적용 범위 내에서 이 어노테이션이 동작한다는 것을 알았습니다.
아래는 위의 익셉션을 핸들링해주는 소스의 샘플입니다.
@ControllerAdvice
public class ExceptionsAdvice {
@ResponseBody
@ExceptionHandler(UnauthorizedUserException.class)
public ResponseEntity unauthorizedUserExceptionHandler(UnauthorizedUserException exception) {
Map body = Map.of("status", HttpStatus.UNAUTHORIZED.value(),
"error", HttpStatus.UNAUTHORIZED.getReasonPhrase(),
"message", "세션이 만료되었습니다.");
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(body);
}
}
이렇게 적용하면 모든 범위내에서 UnauthorizedUserException 이 발동하였을 경우 해당 메소드를 호출하게 됩니다.
반응형
'Server' 카테고리의 다른 글
[Java] UUID 활용하기 (0) | 2021.01.14 |
---|---|
Command Line에서 BootRun 실행하기 (0) | 2021.01.04 |
[Spring] RabbitMQ 메시징 사용하기 (0) | 2020.12.14 |
Linux 포트 확인 및 백그라운드 프로세스 실행 (0) | 2020.12.07 |
[Java] 앱 버전 분기하기 (0) | 2020.08.07 |
[Spring] MVC 자동구성 제어하기 (0) | 2020.07.21 |
댓글
공지사항