1. 핸들러(handler)란?
핸들러(handler)는 자바에서 이벤트나 예외 처리를 담당하는 객체나 메서드를 의미한다. 프로그램에서 오류가 발생한다면, 오류가 발생한 곳에서 처리하는 곳까지 여러번의 전달이 일어나게 된다. 만약 레이어의 깊이가 깊어진다면 오류를 찾는 것이 어려워진다. 핸들러를 만들면 예외 처리를 한 곳에서 할 수 있게 된다.
2. 자바스크립트 코드 넣기
_core/util/Script
package com.example.springblog._core.util; public class Script { public static String back(String msg) { StringBuilder sb = new StringBuilder(); sb.append("<script>"); sb.append("alert('"+msg+"');"); sb.append("history.back();"); sb.append("</script>"); return sb.toString(); } public static String href(String path) { StringBuilder sb = new StringBuilder(); sb.append("<script>"); sb.append("location.href='"+path+"';"); sb.append("</script>"); return sb.toString(); } public static String href(String path, String msg) { StringBuilder sb = new StringBuilder(); sb.append("<script>"); sb.append("alert('"+msg+"');"); sb.append("location.href='"+path+"';"); sb.append("</script>"); return sb.toString(); } }
자바에 자바스크립트 코드를 포함시켰다. 예외가 발생하면 해당 메서드가 호출되면서 alert창이 출력된다.
history.back()
: 웹페이지 이전 상태로 돌아간다. 이 코드를 사용하면 리다이렉션을 사용할 필요가 없다.3. 핸들러 만들기
_core/handler/CustomExceptionHandler
package com.example.springblog._core.handler; import com.example.springblog._core.util.Script; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; @ControllerAdvice // 응답 에러 컨트롤러.(view==파일 리턴, 모든 쓰로우를 처리) public class CustomExceptionHandler { @ExceptionHandler(Exception.class) // 모든 에러를 다 받음. public @ResponseBody String error1(Exception e){ return Script.back(e.getMessage()); } }
@ControllerAdvice
: 전역에서 발생하는 예외를 잡아 처리하는데 사용
@ExceptionHandler
: 컨트롤러 내에서 발생하는 특정 예외를 처리하는 메서드를 지정
@ResponseBody
: 반환된 문자열이 뷰가 아니라 HTTP응답으로 처리됨
error1 메서드는
Exception
타입이기 때문에 모든 예외를 처리할 수 있다. error1 가 호출된다면 Script.back 메서드가 호출되면서 alert창이 뜨게 된다.
throw new RuntimeException("메세지");
4. 결과 확인하기
UserController
User user = userRepository.findByUsername(requestDTO.getUsername()); if(user==null){ userRepository.save(requestDTO); }else{ request.setAttribute("msg","아이디가 중복됩니다." + ""); request.setAttribute("status",400); return "error/40x"; }
핸들러 사용 이전 중복 검사
try{ userRepository.save(requestDTO); }catch (Exception e){ throw new RuntimeException("아이디가 중복되었어요"); }
핸들러 사용
이전에는 user의 join 컨트롤러에서 DB와의 통신을 통해 아이디 중복 여부를 확인했다면, 지금은 아이디가 중복된다면 예처리를 한다.
더미데이터에 있는 유저네임과 동일한 값으로 회원가입을 시도한다.
alert창이 뜬다.
확인창을 누르면 다시 회원가입 페이지로 되돌아간다.
history.back()
을 사용하면 이전 페이지에서 입력했던 데이터가 그대로 남아 있어 UX(User Experience) 가 좋아진다.Share article