์คํ๋ง MVC 2ํธ์ ๊ฐ์ ๋ด์ฉ์ ์ ๋ฆฌํ ํฌ์คํ ์ ๋๋ค.
์๋ธ๋ฆฟ ์์ธ ์ฒ๋ฆฌ - ์์ธ ์ฒ๋ฆฌ ๋ฐฉ์
์คํ๋ง์ด ์๋ ์์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ๋ค์ ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ์์ธ ์ฒ๋ฆฌ๋ฅผ ์ง์ํ๋ค.
1. Exception(์์ธ)
1-1. ์๋ฐ์ ๋ฉ์ธ ๋ฉ์๋๋ฅผ ์ง์ ์คํํ๋ ๊ฒฝ์ฐ
์คํ ๋์ค์ ์์ธ๋ฅผ ์ก์ง ๋ชปํ๊ณ ์ฒ์ ์คํํ ๋ฉ์ธ ๋ฉ์๋๋ฅผ ๋์ด์ ์์ธ๊ฐ ๋์ ธ์ง๋ฉด, ์์ธ ์ ๋ณด๋ฅผ ๋จ๊ธฐ๊ณ ํด๋น ์ฐ๋ ๋๋ ์ข ๋ฃ๋๋ค.
1-2. ์น ์ ํ๋ฆฌ์ผ์ด์
์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ์ ์์ฒญ ๋ณ๋ก ๋ณ๋์ ์ฐ๋ ๋๊ฐ ํ ๋น๋๊ณ , ์๋ธ๋ฆฟ ์ปจํ ์ด๋ ์์์ ์คํ๋๋ค.
๊ทธ๋ฐ๋ฐ ๋ง์ฝ ์ ํ๋ฆฌ์ผ์ด์ ๋ด์์ ์์ธ๋ฅผ ์ก์ง ๋ชปํ๊ณ ์๋ธ๋ฆฟ ๋ฐ์ผ๋ก๊น์ง ์์ธ๊ฐ ์ ๋ฌ๋๋ฉด WAS๊น์ง ์์ธ๊ฐ ์ ๋ฌ๋๊ณ , WAS๊ฐ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ ์ค๋ฅ ํ๋ฉด์ด ๋ํ๋๋ค. ์ด ๊ฒฝ์ฐ HTTP ์ํ ์ฝ๋๊ฐ 500์ ๋ํ๋ด๊ณ ์๋๋ฐ, Exception์ ๊ฒฝ์ฐ ์๋ฒ ๋ด๋ถ์์ ์ฒ๋ฆฌํ ์ ์๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒ์ผ๋ก ํ๋จํ๊ธฐ ๋๋ฌธ์ด๋ค.
2. sendError()
์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋ HttpServletResponse๊ฐ ์ ๊ณตํ๋ sendError()
๋ผ๋ ๋ฉ์๋๋ฅผ ์ด์ฉํ ์๋ ์๋๋ฐ, HTTP ์ํ ์ฝ๋์ ์ค๋ฅ๋ฉ์์ง๋ ํจ๊ป ์ ๋ฌํ ์๊ฐ ์๋ค. ํด๋น ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค๊ณ ๋น์ฅ ์์ธ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ์๋์ง๋ง ์๋ธ๋ฆฟ ์ปจํ
์ด๋์๊ฒ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค๋ ์ ์ ์ ๋ฌํ ์ ์๋ค. ์ดํ ์๋ธ๋ฆฟ ์ปจํ
์ด๋๋ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ต์ ๋ณด๋ด๊ธฐ ์ ์ sendError()
๋ฉ์๋๊ฐ ํธ์ถ๋์๋์ง๋ฅผ ํ์ธํ๊ณ , ํธ์ถ๋์๋ค๋ฉด ์ค์ ํ ์ํ ์ฝ๋์ ๋ง์ถ์ด ๊ธฐ๋ณธ ์ค๋ฅ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ค๋ค.
์๋ธ๋ฆฟ ์์ธ ์ฒ๋ฆฌ - ์ค๋ฅ ํ๋ฉด ์ ๊ณต
๋ณด๋ค ๊ณ ๊ฐ ์นํ์ ์ธ ์์ธ ์ฒ๋ฆฌ ํ๋ฉด์ ์ ๊ณตํ๊ธฐ ์ํด ์๋ธ๋ฆฟ์ด ์ง์ํ๋ ์ค๋ฅ ํ๋ฉด ๊ธฐ๋ฅ์ ์ด์ฉํ ์ ์๋๋ฐ, ์๋ธ๋ฆฟ์ ์์ธ๊ฐ ๋ฐ์ํด์ ์๋ธ๋ฆฟ ๋ฐ์ผ๋ก ์ ๋ฌ๋๊ฑฐ๋(์์ 1๋ฒ ๋ฐฉ์) sendError()
๋ฉ์๋๊ฐ ํธ์ถ๋์์ ๋(2๋ฒ ๋ฐฉ์) ๊ฐ๊ฐ์ ์ํฉ์ ๋ง์ถ ์ค๋ฅ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
๋ํ ์ค๋ฅ ํ์ด์ง๋ ์์ธ๋ฅผ ๋ค๋ฃฐ ๋ ํด๋น ์์ธ์ ๊ทธ ์์ ํ์ ์ ์ค๋ฅ๋ฅผ ํจ๊ป ์ฒ๋ฆฌํ๋ ํน์ง์ ๊ฐ์ง๊ณ ์๊ธฐ๋ ํ๋ค.
์๋ธ๋ฆฟ ์์ธ ์ฒ๋ฆฌ - ์ค๋ฅ ํ์ด์ง ์๋ ์๋ฆฌ
์๋ธ๋ฆฟ์ ์ค๋ฅ ์ฝ๋์ ๋ง๋ ์ค๋ฅ ํ์ด์ง๋ฅผ ์ด๋ป๊ฒ ์ฐพ์์ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ผ๊น?
์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์ง์ํ๋ ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ์์ธ๊ฐ ์ฒ๋ฆฌ๋ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ํ๋ฆ์ ๊ฐ์ง๋ค.(๊ณตํต์ ์ผ๋ก WAS๊น์ง ์ค๋ฅ ์ ๋ฌ)
1. Exception
WAS(์ฌ๊ธฐ๊น์ง ์ ๋ฌ) ← ํํฐ ← ์๋ธ๋ฆฟ ← ์ธํฐ์
ํฐ ← ์ปจํธ๋กค๋ฌ(์์ธ ๋ฐ์)
2. sendError()
WAS(sendError() ํธ์ถ ๊ธฐ๋ก ํ์ธ) ← ํํฐ ← ์๋ธ๋ฆฟ ← ์ธํฐ์
ํฐ ← ์ปจํธ๋กค๋ฌ(response.sendError())
WAS๋ ํด๋น ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ์ค๋ฅ ํ์ด์ง ์ ๋ณด๋ฅผ ํ์ธํ๊ณ , ํ์ด์ง๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํด ๋ด๋ถ์ ์ผ๋ก ํด๋น ๊ฒฝ๋ก๋ฅผ ํธ์ถํ๋ค. ๋ฟ๋ง ์๋๋ผ ์ค๋ฅ ์ ๋ณด๋ฅผ HttpServletRequest์ attribute
์ ์ถ๊ฐํด์ ๋๊ฒจ์ค๋ค.(์์ธ, ์์ธํ์
, ์ค๋ฅ ๋ฉ์์ง, ํด๋ผ์ด์ธํธ ์์ฒญ URI, ์ค๋ฅ๊ฐ ๋ฐ์ํ ์๋ธ๋ฆฟ ์ด๋ฆ, HTTP ์ํ ์ฝ๋)
์ด๋ ๊ฒ ํจ์ผ๋ก์จ ํ์ํ ๊ฒฝ์ฐ ์ ๋ฌ๋ ์ค๋ฅ ์ ๋ณด๋ฅผ ์ค๋ฅ ํ์ด์ง์์ ์ฌ์ฉํ ์ ์๋ค. ๊ทธ๋ ๊ฒ ์ค๋ฅ ํ์ด์ง ๊ฒฝ๋ก๋ฅผ ํธ์ถํ๋ฉด ํด๋น ๊ฒฝ๋ก๋ก ํํฐ, ์๋ธ๋ฆฟ, ์ธํฐ์ ํฐ, ์ปจํธ๋กค๋ฌ ๋ํ ๋ค์ ํธ์ถ๋๋ค. ์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์ ํด๋ผ์ด์ธํธ์์๋ ์๋ฒ์์ ํด๋น ๊ณผ์ ์ ํตํด ์ค๋ฅ ํ์ด์ง๋ฅผ ์ฐพ๋๋ค๋ ๊ฒ์ ๋ชจ๋ฅธ๋ค๋ ์ ์ธ๋ฐ, ์ค์ง ์๋ฒ ๋ด๋ถ์์ ์ค๋ฅ ํ์ด์ง๋ฅผ ์ฐพ๊ธฐ ์ํด ์ถ๊ฐ์ ์ธ ํธ์ถ์ ํ๋ค.
์๋ธ๋ฆฟ ์์ธ ์ฒ๋ฆฌ - ํํฐ
์์ ์ธ๊ธํ๋ฏ์ด ์ค๋ฅ ํ์ด์ง ๊ฒฝ๋ก๋ฅผ ํธ์ถํ๋ ๊ณผ์ ์์ ํํฐ, ์๋ธ๋ฆฟ, ์ธํฐ์ ํฐ๊ฐ ๋ชจ๋ ๋ค์ ํธ์ถ๋๋๋ฐ ์ด๋ฏธ ์ผ์ฐจ์ ์ผ๋ก ๊ฒ์ฆ์ด ์๋ฃ๋ ์ํ์ด๊ธฐ ๋๋ฌธ์ ์ค๋ฅ ํ์ด์ง๋ฅผ ํธ์ถํ ๋ ํ๋ฒ ๋ ๊ฒ์ฆ ๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ ๊ฒ์ ๋นํจ์จ์ ์ด๋ค.
๋ฐ๋ผ์ ํด๋น ์์ฒญ์ด ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฐ์ํ ์ ์ ์์ฒญ์ธ์ง, ์๋๋ฉด ์ค๋ฅ ํ์ด์ง๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํ ๋ด๋ถ ์์ฒญ์ธ์ง ๊ตฌ๋ถํ ํ์๊ฐ ์๋๋ฐ ์๋ธ๋ฆฟ์ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด DispatcherType
์ด๋ผ๋ ์ถ๊ฐ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ค.
/**
FORWARD - ๋ค๋ฅธ ์๋ธ๋ฆฟ์ด๋ JSP๋ฅผ ํธ์ถํ ๋
INCLUDE - ๋ค๋ฅธ ์๋ธ๋ฆฟ์ด๋ JSP์ ๊ฒฐ๊ณผ๋ฅผ ํฌํจํ ๋
REQUEST - ํด๋ผ์ด์ธํธ ์์ฒญ
ASYNC - ์๋ธ๋ฆฟ ๋น๋๊ธฐ ํธ์ถ
ERROR - ์ค๋ฅ ์์ฒญ
*/
public enum DispatcherType {
FORWARD,
INCLUDE,
REQUEST,
ASYNC,
ERROR
}
ํํฐ๋ฅผ ๋ฑ๋กํ๋ ๊ณผ์ ์์ FilterRegistrationBean<T>.setDispatcherTypes()
์ ํตํด ํ์
์ ์ง์ ํด ๋ฃ์ผ๋ฉด, ํด๋น ํ์
์ ํด๋น๋๋ ๊ฒฝ์ฐ์๋ง ํํฐ๊ฐ ํธ์ถ๋๋ค.(๊ธฐ๋ณธ ๊ฐ์ DispatcherType.REQUEST
)
๊ธฐ๋ณธ ๊ฐ์ผ๋ก ์ง์ ํด ๋๋ฉด ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฐ์ํ ์ ์ ์์ฒญ์ ๊ฒฝ์ฐ์๋ง ํํฐ๊ฐ ํธ์ถ๋์ด ์ถ๊ฐ์ ์ธ ํธ์ถ์ด ์์ด์ง๋ค.
์๋ธ๋ฆฟ ์์ธ ์ฒ๋ฆฌ - ์ธํฐ์ ํฐ
์์ ํํฐ์ ๊ฒฝ์ฐ ํํฐ๋ฅผ ๋ฑ๋กํ ๋ ์ด๋ค DispatcherType
์ธ์ง ํ์
์ ๋๋์ด ํํฐ ์ ์ฉ ์ฌ๋ถ๋ฅผ ์ ํํ ์ ์์์ง๋ง, ์ธํฐ์
ํฐ๋ ์๋ธ๋ฆฟ์ด ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด ์๋ ์คํ๋ง์ด ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด๊ธฐ ๋๋ฌธ์ DispatcherType
๊ณผ ๋ฌด๊ดํ๊ฒ ํญ์ ํธ์ถ๋๋ค.
๋์ ์ธํฐ์
ํฐ๋ ์์ฒญ ๊ฒฝ๋ก๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ ์ธํ๊ธฐ๊ฐ ์ฝ๊ธฐ ๋๋ฌธ์ InterceptorRegistry.excludePathPatterns()
๋ฉ์๋๋ฅผ ์ด์ฉํ ์ค์ ์ ํตํด ์ค๋ฅ ํ์ด์ง ๊ฒฝ๋ก๋ฅผ ์ ์ธํด ์ฃผ๋ฉด ์ธํฐ์
ํฐ๊ฐ ํธ์ถ๋์ง ์๋๋ค.
์คํ๋ง ๋ถํธ - BasicErrorController
๊ธฐ์กด์๋ ์์ธ ์ฒ๋ฆฌ ํ์ด์ง๋ฅผ ๋ง๋ค๊ธฐ ์ํด WebServerCustomizer๋ฅผ ๋ง๋ค๊ณ , ์์ธ ์ข ๋ฅ์ ๋ฐ๋ผ์ ์๋ฌ ํ์ด์ง๋ฅผ ์ถ๊ฐํ๊ณ , ์์ธ ์ฒ๋ฆฌ์ฉ ์ปจํธ๋กค๋ฌ๋ฅผ ๋ง๋๋ ๋ณต์กํ ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํ๋ค.
ํ์ง๋ง ์คํ๋ง ๋ถํธ๋ ์ด๋ฌํ ๊ณผ์ ์ ๋ชจ๋ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํด ์ฃผ๋๋ฐ,
1. ์ฐ์ ์๋ฌ ํ์ด์ง๋ฅผ /error
๋ผ๋ ๊ฒฝ๋ก๋ก ์๋ ๋ฑ๋กํด ์ค๋ค. ๋ง์ฝ ์๋ธ๋ฆฟ ๋ฐ์ผ๋ก ์์ธ๊ฐ ๋ฐ์ํ๊ฑฐ๋ sendError()
๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด ๋ชจ๋ ์ค๋ฅ๋ ๊ธฐ๋ณธ์ ์ผ๋ก /error
๋ฅผ ํธ์ถํ๋ค.
2. ์๋ฌ ํ์ด์ง์์ ๋ฑ๋กํ /error
๋ฅผ ๋งตํํด์ ์ฒ๋ฆฌํ๋ ์ปจํธ๋กค๋ฌ์ธ BasicErrorController๋ผ๋ ์คํ๋ง ์ปจํธ๋กค๋ฌ๋ฅผ ์๋์ผ๋ก ๋ฑ๋กํ๋ค. ํด๋น ์ปจํธ๋กค๋ฌ๋ ๊ธฐ๋ณธ์ ์ธ ๋ก์ง์ด ๋ชจ๋ ๊ฐ๋ฐ๋์ด ์๊ธฐ ๋๋ฌธ์, ๊ฐ๋ฐ์๋ ์ค๋ฅ ํ์ด์ง ํ๋ฉด๋ง BasicErrorController๊ฐ ์ ๊ณตํ๋ ๊ท์น๊ณผ ์ฐ์ ์์์ ๋ฐ๋ผ์ ๋ฑ๋กํ๋ฉด ๋๋ค. ์ฐ์ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
1. ๋ทฐ ํ
ํ๋ฆฟ
- resources/templates/error/500.html
2. ์ ์ ๋ฆฌ์์ค(static, public)
- resources/static/error/4xx.html
3. ์ ์ฉ ๋์์ด ์์ ๊ฒฝ์ฐ ๋ทฐ ์ด๋ฆ(error)
- resources/templates/error.html
์คํ๋ง ๋ถํธ - BasicErrorController ์ ๊ณต ์ ๋ณด
BasicErrorController๋ ๋ค์ ์ ๋ณด๋ฅผ ๋ชจ๋ธ์ ๋ด์์ ๋ทฐ์ ์ ๋ฌํ๊ธฐ ๋๋ฌธ์, ๋ทฐ ํ ํ๋ฆฟ์ ์ ๋ฌ๋๋ ์ ๋ณด๋ฅผ ํ์ฉํด ์ถ๋ ฅํ ์ ์๋ค.
* timestamp: Fri Feb 05 00:00:00 KST 2021
* status: 400
* error: Bad Request
* exception: org.springframework.validation.BindException
* trace: ์์ธ trace * message: Validation failed for object='data'. Error count: 1
* errors: Errors(BindingResult)
* path: ํด๋ผ์ด์ธํธ ์์ฒญ ๊ฒฝ๋ก (`/hello`)
ํ์ง๋ง ์ค๋ฅ ๊ด๋ จ ๋ด๋ถ ์ ๋ณด๋ค์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ ธ์ถํ ๊ฒฝ์ฐ ํผ๋๋ง ๋ํด์ง ๋ฟ ์๋๋ผ ์ด๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋์ง ํ์ ํด์ ์ฝ์ ์ ํ๊ณ ๋๋ ๋ฑ์ ๋ณด์ ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์, ์์ ์ค๋ฅ ์ ๋ณด๋ค์ ๋ชจ๋ธ์ ํฌํจํ ์ง ์ฌ๋ถ๋ฅผ ์ ํํ ์ ์๋ค.
(์ค๋ฌด์์ ๋ ธ์ถ X, ์๋ฒ ๋ก๊ทธ ๊ธฐ๋ก ์ฉ๋๋ก๋ง ์ฌ์ฉ)
#application.properties์ ์ถ๊ฐ
#์ธ ๊ฐ์ง ์ต์
์กด์ฌ; 'never(์ฌ์ฉ X)', 'always(ํญ์ ์ฌ์ฉ)', 'on_param(ํ๋ผ๋ฏธํฐ๊ฐ ์์ ๋ ์ฌ์ฉ)'
server.error.include-exception=true #exception ํฌํจ ์ฌ๋ถ
server.error.include-message=on_param #message ํฌํจ ์ฌ๋ถ
server.error.include-stacktrace=on_param #trace ํฌํจ ์ฌ๋ถ
server.error.include-binding-errors=on_param #errors ํฌํจ ์ฌ๋ถ
'Language & Framework > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์คํ๋ง MVC] ์คํ๋ง ํ์ ์ปจ๋ฒํฐ (0) | 2023.03.05 |
---|---|
[์คํ๋ง MVC] API ์์ธ ์ฒ๋ฆฌ (0) | 2023.03.04 |
[์คํ๋ง MVC] ๋ก๊ทธ์ธ ์ฒ๋ฆฌ(2) - ํํฐ, ์ธํฐ์ ํฐ (0) | 2023.03.03 |
[์คํ๋ง MVC] ๋ก๊ทธ์ธ ์ฒ๋ฆฌ(1) - ์ฟ ํค, ์ธ์ (0) | 2023.03.02 |
[์คํ๋ง MVC] ๊ฒ์ฆ(2) - Bean Validation (0) | 2023.02.21 |