<๊ฐ์>
์ปจํธ๋กค๋ฌ์ ๋งค์๋์์ ์์ธ๊ฐ ๋ฐ์ ํ์ ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์ง์ ๊ดํ ๋ด์ฉ์ด๋ค.
์์ธ์ฒ๋ฆฌ ์ ํ ๊ฒฝ์ฐ, ์๋ฒ๊ฐ ์ด๋ป๊ฒ ์๋ตํ๋์ง์ ๋ํด์ ์์๋ณด๊ณ
์์ธ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ๋ํด์ ์์๋ณธ๋ค.
์์ธ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์๋ try-catch ๋ฌธ์ผ๋ก ์ฒ๋ฆฌ, @ExceptionHandler ์ฌ์ฉ, @ControllerAdvice ์ฌ์ฉ์ด ์๋ค.
1. ์์ธ์ฒ๋ฆฌ ์ ํ ๊ฒฝ์ฐ, ์๋ฒ๊ฐ ์ด๋ป๊ฒ ์๋ตํ๋?
@Controller
public class ExceptionController2 {
// ๊ฐ ๋งค์๋์์ ์์ธ ๋ฐ์ ์ํด.
@RequestMapping("/ex3")
public void main() throws Exception {
throw new Exception("์์ธ๊ฐ ๋ฐ์ํ์ต๋๋ค.");
}
}
์ผ๋ถ๋ฌ ์์ธ๋ฅผ ๋ง๋ค์ด ๋์ ธ๋ณด์๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์ ๋ํ ์๋ฌด๋ฐ ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ๋์ฌ๊น
์๋ฌ์ฝ๋ 500์ด ๋ฌ๋ค. ์ด๊ฑด ์์ธ๋ฅผ ์ฒ๋ฆฌํ์ง ์์ ํ๋ก๊ทธ๋๋จธ์ ์๋ชป์ด๊ธฐ ๋๋ฌธ์ด๋ค.
2. ์์ธ์ฒ๋ฆฌ๋ฅผ try catch ๋ฌธ์ผ๋ก ์ฒ๋ฆฌ
java์์ ๋ฐฐ์ด try catch ๋ฌธ์ผ๋ก ์ฒ๋ฆฌํด๋ณด์ .
@RequestMapping("/ex3")
public void main() throws Exception {
try {
throw new Exception("์์ธ๊ฐ ๋ฐ์ํ์ต๋๋ค.");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
ํด๋น ๋งค์๋๋ฅผ try catch ๊ตฌ๋ฌธ์ผ๋ก ๋ฌถ์๋ค. ๊ทธ๋ฆฌ๊ณ localhost/ch2/ex3๋ฅผ ์คํ์์ผ๋ณด๋ฉด,
์๋ฌ์ฝ๋ 400์ด ๋๋ค. ex3.jsp๋ฅผ ์ฐพ์ ์ ์๋ค๋ ๋ฉ์ธ์ง๊ฐ ๋์จ๋ค. ๊ทธ ์ด์ ๋ ํด๋น ๋งค์๋์ ๋ฐํ ํ์ ์ด void์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐํ์ ํ์ง ์๋ ๋งค์๋๋ฅผ ์ฌ์ฉ ์, ์ปจํธ๋กค๋ฌ๋ ๋งคํ๋ URL ์ฃผ์ ๋งจ ๋๋จ๊ณผ ๊ฐ์ ์ด๋ฆ์ view jsp๋ฅผ ์ฐพ๋๋ค.
์ฌ๊ธฐ์ ex3.jsp๋ฅผ ๋ง๋ค์ด๋์ง ์์๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
๊ทธ๋ ๋ค๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ๋ณด์ฌ์ค view๋ฅผ ๋ง๋ค๊ณ , ๋ฐํํ์ String์ผ๋ก ๋ฐ๊ฟ์ ๋งค์๋ ์ฒ๋ฆฌ ํ ํด๋น view๊ฐ ๋ณด์ฌ์ง๋๋ก ํด๋ณด์.
<!--error.jsp-->
<%@ page contentType="text/html;charset=utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>error.jsp</title>
</head>
<body>
<h1>์์ธ๊ฐ ๋ฐ์ํ์ต๋๋ค.</h1>
<!-- ์๋ฌ์ ํด๋น ์๋ฌ์ ๋ฉ์ธ์ง๋ฅผ ์์ธ์ฒ๋ฆฌ ์ปจํธ๋กค๋ฌ์ ๋ชจ๋ธ์์ ๋ฐ์์ ์ถ๋ ฅ -->
๋ฐ์ํ ์์ธ : ${ex}<br>
์์ธ ๋ฉ์์ง : ${ex.message}<br>
<ol>
<!-- ์์ธ์ ๋ด์ฉ๋ค์ ๋ชจ๋ธ์์ ๋ฐ์์ ์ฐจ๋ก๋ก ๋ฝ๋๋ค. -->
<c:forEach items="${ex.stackTrace}" var="i">
<li>${i.toString()}</li>
</c:forEach>
</ol>
</body>
</html>
// ๋งค์๋ String์ผ๋ก ํ๋ณํ, error.jsp ๊ฐ๋๋ก return ๊ฐ ์ค์
@RequestMapping("/ex3")
public String main() throws Exception {
try {
throw new Exception("์์ธ๊ฐ ๋ฐ์ํ์ต๋๋ค.");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "error";
}
}
๊ทผ๋ฐ error.jsp์ ์ ํ ์๋ฌ ๋ด์ฉ๊ณผ ๋ฉ์ธ์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ณ์๋ค์ด ์๋์ ์ํ๋ค.
๊ทธ ์ด์ ๋ ์ปจํธ๋กค๋ฌ์ view ์ฌ์ด์ ๋ชจ๋ธ๋ก ๊ฐ๋ค์ ๋ฐ์ ์ ๋ฌํด์ฃผ๋ ์ ์ฐจ๋ฅผ ์งํํ์ง ์์๊ธฐ ๋๋ฌธ์ด๋ค.
@RequestMapping("/ex3")
public String main(Model m) throws Exception {
try {
throw new Exception("์์ธ๊ฐ ๋ฐ์ํ์ต๋๋ค.");
} catch (Exception e) {
// ๋ชจ๋ธ์ ์๋ฌ ๊ฐ์ฒด๋ฅผ ๋ฃ์ด์ค.
// error.jsp์์ ex.message ๋ฑ์ผ๋ก ๊ฐ์ฒด์ ๋ณ์๋ค์ ๊บผ๋ด ์.
m.addAttribute("ex", e);
e.printStackTrace();
return "error";
}
}
ํ์ง๋ง ์ด๋ฐ ์์ผ๋ก ์ผ ์ฒ๋ฆฌ๋ฅผ ํ๋ฉด, ๋ชจ๋ ๋งค์๋ ๋ด์ ์์ธ๊ฐ ์๊ธธ ์ ์๋ ๋ถ๋ถ์ ๋ํด์ try catch๋ฌธ์ ์จ์ฃผ๊ณ catch๋ฌธ ๋ง๋ค ๋ชจ๋ธ์ ์๋ฌ๋ฅผ ๋ฃ์ด์ view๋ก ๋ณด๋ด์ค์ผ ํ๋ค. ์ค๋ณต์ฝ๋๊ฐ ๋๋ฌด ๋ง๊ณ ๋นํจ์จ์ ์ด๋ค.
ํด๋น ์ ๋ก์ฌํญ์ ํด๊ฒฐ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
@ExceptionHandelr ์ด๋ ธํ ์ด์ ์ ํตํด ์์ธ์ฒ๋ฆฌ๋ง ์ ๋ฌธ์ ์ผ๋ก ๋ด๋นํ๋ ๋งค์๋๋ฅผ ๋ง๋ค์ด์ ํ๋ฒ์ ์ฒ๋ฆฌํด์ค ์ ์๋ค.
3. @ExceptionHandler ์ฌ์ฉ
@Controller
public class ExceptionController2 {
//1. ExceptionHandler ์์ฑ (๋ฌด์จ ์์ธ์ ๋ํด ์ฒ๋ฆฌํ ๊ฒ์ธ์ง ๊ดํธ ์์ ์ ์ด์ค์ผํจ.)
@ExceptionHandler(Exception.class)
//2. Handler์ ๋งคํ๋ ๋งค์๋ (์์ธ ๊ฐ์ฒด์ ์ด๋ฐ์ ์ธ ๋ชจ๋ธ์ ๋งค๊ฐ์ฒด๋ก ๋ฐ๋๋ค.)
public String catcher(Exception ex, Model m) {
// ์ด๊ฑธ ์ง์ง ์ฌ์ฉํ๋์ง ๋ณด๊ธฐ ์ํ ํ๋ฆฐํธ๋ฌธ
System.out.println("ExceptionHandler ๋ด๋ถ์์ ์ผ์ฒ๋ฆฌ ํ์ต๋๋ค.");
//2-1 ๋ชจ๋ธ์ ๋ฃ๊ณ , view ๋ฐํ
m.addAttribute("ex", ex);
return "error";
}
@RequestMapping("/ex3")
public String main(Model m) throws Exception {
throw new Exception("์์ธ๊ฐ ๋ฐ์ํ์ต๋๋ค.");
}
@RequestMapping("/ex4")
public String main2() throws Exception {
throw new FileNotFoundException("์์ธ๊ฐ ๋ฐ์ํ์ต๋๋ค.");
}
}
@ExceptionHandler(Exception.class) ์ด๋ ธํ ์ด์ ์ Catcher ๊ตฌ๋ฌธ๊ณผ ๊ฐ์ ๊ฒ์ด๋ค.
"/ex3", "/ex4"๋ก ๊ฐ๋ ์ผ๋ฐ ๋งค์๋๋ค์ ๋ฐํ๊ฐ์ด ์์ด๋ ์๋ฌ๊ฐ ๋จ์ง ์๋ ๊ฑธ ๋ณผ ์ ์๋๋ฐ ์ด๋ ์์ธ์ฒ๋ฆฌ๋ฅผ ๋ด๋นํ๋ Catcher ๊ตฌ๋ฌธ์์ ์์ธ๋ฅผ ์ก์ ๋ฐํ ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ผ๋ฐ ๋งค์๋์์ ์์ธ๋ฅผ ๋์ง๋ฉด @ExceptionHandler ๋ฌ๋ฆฐ ๋ฉ์๋์์ ์์ธ๋ฅผ ์ก์ ์ฒ๋ฆฌํ๋ค.
์ด๋ ์ผ๋ฐ ๋งค์๋์์ ๋์ง ์์ธ์ ์์ธ์ฒ๋ฆฌ ๋งค์๋์์ ์ฒ๋ฆฌํ๊ฒ ๋ค๋ ์์ธ๊ฐ ์ผ์นํ ์ ๋งคํ๋์ด ์ฐ๊ฒฐ๋๊ธฐ ๋๋ฌธ์ด๋ค.
ํด๋น catcher ๊ตฌ๋ฌธ์ผ๋ก ์ผ์ด ์ฒ๋ฆฌ ๋์์์ ์ ์ ์๋ค.
@ExceptionHandler(Exception.class) ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉ๋ฒ์ catch์ ๋งค์ฐ ์ ์ฌํ๋ค.
๋ง์ฝ ์ด๋ค ์์ธ์ฒ๋ฆฌ ๋งค์๋๋ NullPointerException๋ง, ๋๋จธ์ง ์์ธ๋ ๋ค๋ฅธ ๋งค์๋์์ ์ฒ๋ฆฌ ํ๊ณ ์ถ๋ค๋ฉด ์ด๋ ๊ฒ ์ ์ผ๋ฉด ๋๋ค.
@ExceptionHandler(NullPointerException.class)
public String catcher1 (Exception ex, Model m) {
m.addAttribute("ex", ex);
return "error";
}
@ExceptionHandler(Exception.class)
public String catcher2 (Exception ex, Model m) {
m.addAttribute("ex", ex);
return "error";
}
๋ง์ฝ ํ๋์ ์์ธ์ฒ๋ฆฌ ๋งค์๋์์ NullPointer ์์ธ์ ํ์ผ์ ๋ชป ์ฐพ์ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ด๋ ธํ ์ด์ ()์์ ๋ฐฐ์ด๋ก ๋์ดํ๋ฉด ๋๋ค.
@ExceptionHandler({NullPointerException.class, FileNotFoundException.class})
ํด๋น @ExceptionHandler๊ฐ ๋ถ์ ์์ธ์ฒ๋ฆฌ ๋งค์๋๋ ํด๋น ์ปจํธ๋กค๋ฌ ๋ด์์๋ง ํจ๋ ฅ์ด ์๋ค.
๋ค๋ฅธ ์ปจํธ๋กค๋ฌ๋ ํด๋น ๋งค์๋๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๋ค.
์ด๋ ๊ฒ ๋๋ฉด ์๊น๋ณด๋จ ๋ซ์ง๋ง, ๋ชจ๋ ํด๋์ค์์ ์์ธ์ฒ๋ฆฌ ๋งค์๋๋ฅผ ์ ์ด์ค์ผ ํ๋ค๋ ๋ฌธ์ ๊ฐ ์๊ธด๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์ปจํธ๋กค๋ฌ ์ด๋ ธํ ์ด์ ์ด @ControllerAdivce ์ด๋ค.
์ด ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ์ปจํธ๋กค๋ฌ๋ ๋ชจ๋ ์ปจํธ๋กค๋ฌ์ ๋ํด์ ์์ธ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
4. @ControllerAdvice ์ฌ์ฉ
// 1. ๋ฒ ์ปจํธ๋กค๋ฌ์ ์ด๋
ธํ
์ด์
@ControllerAdvice
public class GlobalCatcher {
//2. ๋ฐ์ ๋ด์ฉ์ ๊ทธ๋๋ก, ์ ๋ฌธ๋ถ์ผ ์ ํด์ ์ฒ๋ฆฌ
@ExceptionHandler({NullPointerException.class, FileNotFoundException.class})
public String catcher1(Exception ex, Model m) {
m.addAttribute("ex", ex);
return "error";
}
@ExceptionHandler(Exception.class)
public String catcher2(Exception ex, Model m) {
m.addAttribute("ex", ex);
return "error";
}
}
@ControllerAdvice ์์ ์๋ฌด๊ฒ๋ ์ ์ ๋๋ค๋ฉด, ๋ชจ๋ ํจํค์ง์ ๊ดํด ํด๋น @ControllerAdivce ๋ถ์ ํด๋์ค๊ฐ ์์ธ์ฒ๋ฆฌ ๋๋งก์ ํ๊ฒ ๋ค๋ ์๋ฆฌ์ด๋ค.
์ฐ๋ฆฌ๋ ์ด ๋ ์์ด ์์ธ์ฒ๋ฆฌํ ํจํค์ง๋ฅผ ์ ํด์ค ์ ์๋ค.
//com.fastcampus.ch2 ํจํค์ง ๋ด์ ์์ธ๋ง ์ฒ๋ฆฌ
@ControllerAdvice("com.fastcampus.ch2")
public class GlobalCatcher {
/...
}
** ์ฐ์ ์์
๋ง์ฝ ๋์ผ ์ปจํธ๋กค๋ฌ ๋ด์ ์์ธ์ฒ๋ฆฌ ํธ๋ค๋ฌ๊ฐ ์กด์ฌํ๊ณ , @ControllerAdvice ํด๋์ค๊ฐ ๋ฐ๋ก ์กด์ฌํ ๊ฒฝ์ฐ ๋ญ๊ฐ ๋จผ์ ์ผ์ ์ฒ๋ฆฌํ ๊น?
๋์ผ ์ปจํธ๋กค๋ฌ ๋ด์ ์์ธ์ฒ๋ฆฌ ํธ๋ค๋ฌ๊ฐ ์ฐ์ ์์๊ฐ ๋๊ธฐ์ ์ผ์ ์ฒ๋ฆฌํ๋ค.
๋ฐ๋ผ์ @ControllerAdvice์ ๊ณต์ฉ์ ์ผ๋ก ์ธ ์์ธ์ฒ๋ฆฌ๋ฅผ ์จ๋๊ณ , ๋ง์ฝ ๋ฐ๋ก ํน๋ณํ ์์ธ์ฒ๋ฆฌ๋ฅผ ํด์ค์ผํ ์ปจํธ๋กค๋ฌ๊ฐ ์๋ค๋ฉด ๊ทธ ์์ ์์ธ์ฒ๋ฆฌ ํธ๋ค๋ฌ๋ฅผ ์จ์ฃผ๋ฉด ๋๋ ๊ฒ์ด๋ค.
<์ฃผ์ ์ฌํญ>
์์ธ์ฒ๋ฆฌ ๋งค์๋์์ ์ฐ๋ Model๊ณผ ์ผ๋ฐ ๋งค์๋์์ ์ฐ์ด๋ Model์ ์๋ก ๋ค๋ฅธ ์กด์ฌ์ด๋ค.
@Controller
public class ExceptionController {
@ExceptionHandler(Exception.class)
public String catcher(Exception ex, Model m) {
//2. ๋ชจ๋ธ ์์ ๋ด์ฉ๋ฌผ์ด ์๋์ง ํ์ธ
System.out.println("m="+m);
m.addAttribute("ex", ex);
return "error";
}
// 1. ์คํ ์์ธ ๋ฐ์ ์ ์ ๋ชจ๋ธ ์์ ๊ฐ์ ๋ฃ์.
// ๋ง์ฝ ์์ธ์ฒ๋ฆฌ ๋งค์๋์ ์ผ๋ฐ ๋งค์๋๊ฐ ๊ฐ์ ๋ชจ๋ธ์ ์ด๋ค๋ฉด,
// ํด๋น ๋ด์ฉ์ด ์์ธ์ฒ๋ฆฌ ๋งค์๋์ ๋ชจ๋ธ์๋ ๋ค์ด๊ฐ์ ๊ฒ์
@RequestMapping("/ex")
public String main(Model m) throws Exception {
m.addAttribute("msg", "message from ExceptionController.main()");
throw new Exception("์์ธ๊ฐ ๋ฐ์ํ์ต๋๋ค.");
}
}
๋ชจ๋ธ ์์ ๋ด์ฉ๋ฌผ์ ์์๋ค.
๋ฐ๋ผ์ ์ ๋งค์๋ ๋์ ์์ธ๋ฅผ ๋์ง๊ณ ์ก์ ๊ฒ์ ์ํด ์ฐ๊ฒฐ๋ ๊ฒ ๋ฟ์ด์ง ๊ฐ์ ๋ชจ๋ธ์ ์ฐ์ง ์์์ ์ ์ ์๋ค.
์์ธ์ฒ๋ฆฌ ๋งค์๋์ ๋ชจ๋ธ์ ์๋ฌ ์ ์ฌ์ฉํ๋ view์ ์๋ฌ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ๋ค์ฃผ๋ ์ญํ ๋ง ํ๋ค.