์Šคํ”„๋ง ๋ถ€ํŠธ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ธฐ๋ณธ์ ์ธ ์˜ค๋ฅ˜ ์‘๋‹ต์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ์™€ ํ™”์ดํŠธ๋ผ๋ฒจ ์˜ค๋ฅ˜ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์ž๋™ ๊ตฌ์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค. ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ์ž๋™ ๊ตฌ์„ฑ์€ ErrorMvcAutoConfiguration๋ฅผ ํ†ตํ•ด ์ œ๊ณตํ•˜๋ฉฐ BasicErrorController ์™€ DefaultErrorViewResolver๊ฐ€ ๋“ฑ๋ก๋œ๋‹ค.

Whitelabel Error Page

์Šคํ”„๋ง ๋ถ€ํŠธ์˜ ๊ธฐ๋ณธ ํ™”์ดํŠธ๋ผ๋ฒจ ์˜ค๋ฅ˜ ํŽ˜์ด์ง€๋Š” ErrorMvcAutoConfiguration์˜ StaticView๋กœ HTML ํŒŒ์ผ์ด ์•„๋‹Œ ์ž๋ฐ” ์ฝ”๋“œ๋กœ ๊ตฌํ˜„๋˜์–ด์žˆ๋‹ค. ์ด๊ฒƒ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœํผํ‹ฐ๋กœ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋‚ด์žฅ ์›น ์ปจํ…Œ์ด๋„ˆ์ธ ํ†ฐ์บฃ์˜ ๊ฒฝ์šฐ ํ™”์ดํŠธ๋ผ๋ฒจ ์˜ค๋ฅ˜ ํŽ˜์ด์ง€๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ํ†ฐ์บฃ์˜ ์˜ค๋ฅ˜ ํŽ˜์ด์ง€๊ฐ€ ์‘๋‹ต๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ†ฐ์บฃ์ด ์•„๋‹Œ ์–ธ๋”ํ† ์šฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์–ธ๋”ํ† ์šฐ๊ฐ€ ์ž์ฒด์ ์ธ ์˜ค๋ฅ˜ ์‘๋‹ต ํŽ˜์ด์ง€๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.

Error Templates

ํ™”์ดํŠธ๋ผ๋ฒจ ์˜ค๋ฅ˜ ํŽ˜์ด์ง€์˜ ๋น„ํ™œ์„ฑํ™” ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด error๋ผ๋Š” ๋ทฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ์„ ํด๋ž˜์ŠคํŒจ์Šค์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” FreeMarkerViewResolver ๋˜๋Š” ThymeleafViewResolver ์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋œ๋‹ค. ErrorTemplate๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ํ™”์ดํŠธ๋ผ๋ฒจ ์˜ค๋ฅ˜ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ๋นˆ ๋“ฑ๋ก์€ ์ž๋™์œผ๋กœ ๋น„ํ™œ์„ฑํ™”๋œ๋‹ค.

FreeMarkerViewResolver์™€ ThymeleafViewResolver๊ฐ€ ๋™์‹œ์— ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ํ”„๋ฆฌ๋งˆ์ปค์™€ ํƒ€์ž„๋ฆฌํ”„์— ๋Œ€ํ•œ ์ž๋™ ๊ตฌ์„ฑ ํด๋ž˜์Šค์˜ ๊ตฌํ˜„ ์ƒ Order๊ฐ’์— ์˜ํ•ด FreeMarkerViewResolver์˜ ์ฒ˜๋ฆฌ ์ˆœ์„œ๊ฐ€ ๋” ๋†’๋‹ค.

error.ftlh
<!DOCTYPE html> <html lang="${.lang}"> <head> <title>Error</title> <meta charset="UTF-8"> </head> <body> <h1>Oops!</h1> <div>Error: ${error}</div> <div>Path: ${path}</div> <div>Status: ${status}</div> <div>Timestamp: ${timestamp?datetime?iso_utc}</div> <p><a href="/">Go to main</a></p> </body> </html>

Error Templates based HTTP Status Code

์—๋Ÿฌ ํŽ˜์ด์ง€๋ฅผ ๊ณตํ†ต์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜๋„ ์žˆ๊ณ  DefaultErrorViewResolver๋Š” error ๋””๋ ‰ํ† ๋ฆฌ ํ•˜์œ„์— HTTP Status Code ๊ฐ’์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ์— ๋” ์ƒ์„ธํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ณตํ†ต ์˜ค๋ฅ˜ ํŽ˜์ด์ง€ ๋‚ด์—์„œ ํ…œํ”Œ๋ฆฟ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•ด๋„ ๋ฌด๋ฐฉํ•˜์ง€๋งŒ ๋ช…์‹œ์ ์œผ๋กœ ๋‚˜๋ˆ„์–ด์„œ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ๋„ ๋‚˜์˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.

error/404.ftlh
<!DOCTYPE html> <html lang="${.lang}"> <head> <title>404 - Not Found</title> <meta charset="UTF-8"> </head> <body> <h1>Oops! Not Found</h1> <div>Error: ${error}</div> <div>Path: ${path}</div> <div>Status: ${status}</div> <div>Timestamp: ${timestamp?datetime?iso_utc}</div> <p><a href="/">Go to main</a></p> </body> </html>