day57 πŸŒ•

μž₯λ―ΈΒ·2022λ…„ 8μ›” 9일
0

였늘의 μ„±κ³Ό

λͺ©λ‘ 보기
57/129

μŠ€ν”„λ§ MVC 2편 - λ°±μ—”λ“œ μ›Ή 개발 ν™œμš© 기술 μ„Ήμ…˜ 8 μˆ˜κ°•

+) 22. 08. 13. 정리 μΆ”κ°€!

μ„Ήμ…˜ 8. μ˜ˆμ™Έ μ²˜λ¦¬μ™€ 였λ₯˜ νŽ˜μ΄μ§€ μˆ˜κ°• μ™„λ£Œ!!

μ„œλΈ”λ¦Ώμ€ λ‹€μŒ 두 가지 λ°©μ‹μœΌλ‘œ μ˜ˆμ™Έ 처리λ₯Ό μ§€μ›ν•œλ‹€.

  • Exception(μ˜ˆμ™Έ)
  • response.sendError(HTTP μƒνƒœ μ½”λ“œ, 였λ₯˜ λ©”μ‹œμ§€)

Exception

μžλ°” 직접 μ‹€ν–‰
μžλ°”μ˜ 메인 λ©”μ„œλ“œλ₯Ό 직접 μ‹€ν–‰ν•˜λŠ” 경우 mainμ΄λΌλŠ” μ΄λ¦„μ˜ μŠ€λ ˆλ“œκ°€ μ‹€ν–‰λœλ‹€.
μ‹€ν–‰ 도쀑에 μ˜ˆμ™Έλ₯Ό μž‘μ§€ λͺ»ν•˜κ³  처음 μ‹€ν–‰ν•œ main() λ©”μ„œλ“œλ₯Ό λ„˜μ–΄μ„œ μ˜ˆμ™Έκ°€ λ˜μ Έμ§€λ©΄ μ˜ˆμ™Έ 정보λ₯Ό 남기고 ν•΄λ‹Ή μŠ€λ ˆλ“œλŠ” μ’…λ£Œλœλ‹€.

μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜
μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ μ‚¬μš©μž μš”μ²­λ³„λ‘œ λ³„λ„μ˜ μŠ€λ ˆλ“œκ°€ ν• λ‹Ήλ˜κ³ , μ„œλΈ”λ¦Ώ μ»¨ν…Œμ΄λ„ˆ μ•ˆμ—μ„œ μ‹€ν–‰λœλ‹€.
μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμ„ λ•Œ, try-catch둜 μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜λ©΄ μ•„λ¬΄λŸ° λ¬Έμ œκ°€ μ—†λ‹€. ν•˜μ§€λ§Œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ˜ˆμ™Έλ₯Ό μž‘μ§€ λͺ»ν•˜κ³ , μ„œλΈ”λ¦Ώ λ°–κΉŒμ§€ μ˜ˆμ™Έκ°€ μ „λ‹¬λ˜λ©΄ μ–΄λ–»κ²Œ λ™μž‘ν• κΉŒ?

WAS(μ—¬κΈ°κΉŒμ§€ μ „νŒŒ) ⬅️ ν•„ν„° ⬅️ μ„œλΈ”λ¦Ώ ⬅️ 인터셉터 ⬅️ 컨트둀러(μ˜ˆμ™Έ λ°œμƒ)

κ²°κ΅­ ν†°μΊ£ 같은 WASκΉŒμ§€ μ˜ˆμ™Έκ°€ μ „λ‹¬λœλ‹€.

response.sendError

였λ₯˜κ°€ λ°œμƒν–ˆμ„ λ•Œ HttpServletResponseκ°€ μ œκ³΅ν•˜λŠ” sendErrorλΌλŠ” λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄λ„ λœλ‹€. μ„œλΈ”λ¦Ώ μ»¨ν…Œμ΄λ„ˆμ—κ²Œ 였λ₯˜κ°€ λ°œμƒν–ˆλ‹€λŠ” 것을 전달할 수 μžˆλ‹€.
이 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ HTTP μƒνƒœ μ½”λ“œμ™€ 였λ₯˜ λ©”μ‹œμ§€λ„ μΆ”κ°€ν•  수 μžˆλ‹€.

@GetMapping("/error-404")
public void error404(HttpServletResponse response) throws IOException {
	response.sendError(404, "404 였λ₯˜");
}

sendError 흐름

WAS(sendError 호좜 기둝 확인) ⬅️ ν•„ν„° ⬅️ μ„œλΈ”λ¦Ώ ⬅️ 인터셉터 ⬅️ 컨트둀러
(response.sendError())

response.sendError()λ₯Ό ν˜ΈμΆœν•˜λ©΄ response 내뢀에 였λ₯˜κ°€ λ°œμƒν–ˆλ‹€λŠ” μƒνƒœλ₯Ό μ €μž₯ν•΄λ‘”λ‹€. 그리고 μ„œλΈ”λ¦Ώ μ»¨ν…Œμ΄λ„ˆλŠ” κ³ κ°μ—κ²Œ 응닡 μ „ response에 sendError()κ°€ ν˜ΈμΆœλ˜μ—ˆλŠ”μ§€ ν™•μΈν•œλ‹€. ν˜ΈμΆœλ˜μ—ˆλ‹€λ©΄ μ„€μ •ν•œ 였λ₯˜ μ½”λ“œμ— 맞좰 κΈ°λ³Έ 였λ₯˜ νŽ˜μ΄μ§€λ₯Ό 보여쀀닀.

μ„œλΈ”λ¦Ώ μ˜ˆμ™Έ 처리

μ„œλΈ”λ¦Ώμ€ μ˜ˆμ™Έκ°€ λ°œμƒν•΄μ„œ μ„œλΈ”λ¦Ώ λ°–μœΌλ‘œ μ „λ‹¬λ˜κ±°λ‚˜ ν˜Ήμ€ response.sendError()κ°€ ν˜ΈμΆœλ˜μ—ˆμ„ λ•Œ 각각의 상황에 맞좘 였λ₯˜ 처리 κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.
κ³Όκ±°μ—λŠ” web.xmlμ΄λΌλŠ” νŒŒμΌμ— 였λ₯˜ 화면을 λ“±λ‘ν–ˆλ‹€. μ§€κΈˆμ€ μŠ€ν”„λ§ λΆ€νŠΈλ₯Ό 톡해 μ„œλΈ”λ¦Ώ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•˜κΈ° λ•Œλ¬Έμ—, μŠ€ν”„λ§ λΆ€νŠΈκ°€ μ œκ³΅ν•˜λŠ” κΈ°λŠ₯을 μ‚¬μš©ν•΄μ„œ μ„œλΈ”λ¦Ώ 였λ₯˜ νŽ˜μ΄μ§€λ₯Ό λ“±λ‘ν•˜λ©΄ λœλ‹€.

μ˜ˆμ™Έ λ°œμƒκ³Ό 였λ₯˜ νŽ˜μ΄μ§€ μš”μ²­ 흐름

  1. WAS(μ—¬κΈ°κΉŒμ§€ μ „νŒŒ) ⬅️ ν•„ν„° ⬅️ μ„œλΈ”λ¦Ώ ⬅️ 인터셉터 ⬅️ 컨트둀러(μ˜ˆμ™Έ λ°œμƒ)
  2. WAS '/error-page/500' λ‹€μ‹œ μš”μ²­ ➑️ ν•„ν„° ➑️ μ„œλΈ”λ¦Ώ ➑️ 인터셉터 ➑️ 컨트둀러(/error-page/500) ➑️ View
  1. μ˜ˆμ™Έκ°€ λ°œμƒν•΄μ„œ WASκΉŒμ§€ μ „νŒŒλœλ‹€.
  2. WASλŠ” 였λ₯˜ νŽ˜μ΄μ§€ 경둜λ₯Ό μ°Ύμ•„ λ‚΄λΆ€μ—μ„œ 였λ₯˜ νŽ˜μ΄μ§€λ₯Ό ν˜ΈμΆœν•œλ‹€. 이 λ•Œ 였λ₯˜ νŽ˜μ΄μ§€ 경둜둜 ν•„ν„°, μ„œλΈ”λ¦Ώ, 인터셉터, μ»¨νŠΈλ‘€λŸ¬κ°€ λͺ¨λ‘ λ‹€μ‹œ ν˜ΈμΆœλœλ‹€.

WASλŠ” 였λ₯˜ νŽ˜μ΄μ§€λ₯Ό λ‹¨μˆœνžˆ μž¬μš”μ²­ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, 였λ₯˜ 정보λ₯Ό request의 attribute에 μΆ”κ°€ν•΄μ„œ λ„˜κ²¨μ€€λ‹€.

DispatcherType

μ„œλΈ”λ¦Ώ μŠ€νŽ™μ€ μ‹€μ œ 고객이 μš”μ²­ν•œ 것인지, μ„œλ²„κ°€ λ‚΄λΆ€μ—μ„œ 였λ₯˜ νŽ˜μ΄μ§€λ₯Ό μš”μ²­ν•˜λŠ” 것인지 DispatcherType으둜 ꡬ뢄할 수 μžˆλŠ” 방법을 μ œκ³΅ν•œλ‹€.
고객이 처음 μš”μ²­ν•˜λ©΄ dispatcherType=REQUEST이닀.

  • REQUEST: ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­
  • ERROR: 였λ₯˜ μš”μ²­
  • FORWARD: μ„œλΈ”λ¦Ώμ—μ„œ λ‹€λ₯Έ μ„œλΈ”λ¦Ώμ΄λ‚˜ JSPλ₯Ό ν˜ΈμΆœν•  λ•Œ
  • INCLUDE: μ„œλΈ”λ¦Ώμ—μ„œ λ‹€λ₯Έ μ„œλΈ”λ¦Ώμ΄λ‚˜ JSP의 κ²°κ³Όλ₯Ό 포함할 λ•Œ
  • ASYNC: 비동기 μ„œλΈ”λ¦Ώ 호좜

ν•„ν„°λŠ” ν•„ν„°λ₯Ό 등둝할 λ•Œ DispatcherType인 경우, ν•„ν„°λ₯Ό μ μš©ν• μ§€ 선택할 수 μžˆμ—ˆλ‹€.
반면 μΈν„°μ…‰ν„°λŠ” μ„œλΈ”λ¦Ώμ΄ μ œκ³΅ν•˜λŠ” κΈ°λŠ₯이 μ•„λ‹ˆκ³ , μŠ€ν”„λ§μ΄ μ œκ³΅ν•˜λŠ” κΈ°λŠ₯이기 λ•Œλ¬Έμ— DispatcherTypeκ³Ό λ¬΄κ΄€ν•˜κ²Œ 항상 ν˜ΈμΆœλœλ‹€.
λŒ€μ‹  μΈν„°μ…‰ν„°λŠ” excludePathPatternsλ₯Ό μ‚¬μš©ν•΄ 였λ₯˜ νŽ˜μ΄μ§€ 경둜λ₯Ό μ œμ™Έν•΄μ£Όλ©΄ λœλ‹€. (쀑볡 호좜 제거)

/error-ex 였λ₯˜ μš”μ²­ 흐름 정리

  • ν•„ν„°λŠ” DispatchType으둜 쀑볡 호좜 제거dispatchType=REQUEST)
  • μΈν„°μ…‰ν„°λŠ” 경둜 μ •λ³΄λ‘œ 쀑볡 호좜 제거(excludePathPatterns("/error-page/**")
  1. WAS(/error-ex, dispatchType=REQUEST) ➑️ ν•„ν„° ➑️ μ„œλΈ”λ¦Ώ ➑️ 인터셉터 ➑️ 컨트둀러
  2. WAS(μ—¬κΈ°κΉŒμ§€ μ „νŒŒ) ⬅️ ν•„ν„° ⬅️ μ„œλΈ”λ¦Ώ ⬅️ 인터셉터 ⬅️ 컨트둀러(μ˜ˆμ™Έ λ°œμƒ)
  3. WAS 였λ₯˜ νŽ˜μ΄μ§€ 확인
  4. WAS(/error-page/500, dispatchType=ERROR) ➑️ ν•„ν„°(X) ➑️ μ„œλΈ”λ¦Ώ ➑️ 인터셉터(X) ➑️ 컨트둀러(/error-page/500) ➑️ View

μŠ€ν”„λ§ λΆ€νŠΈ 였λ₯˜ νŽ˜μ΄μ§€

BasicErrorControllerλŠ” 기본적인 둜직이 λͺ¨λ‘ κ°œλ°œλ˜μ–΄ μžˆλ‹€.
κ°œλ°œμžλŠ” 였λ₯˜ νŽ˜μ΄μ§€ ν™”λ©΄λ§Œ BasicErrorControllerκ°€ μ œκ³΅ν•˜λŠ” λ£°κ³Ό μš°μ„ μˆœμœ„μ— λ”°λΌμ„œ λ“±λ‘ν•˜λ©΄ λœλ‹€.

λ·° ν…œν”Œλ¦Ώμ΄ 정적 λ¦¬μ†ŒμŠ€λ³΄λ‹€ μš°μ„ μˆœμœ„κ°€ λ†’κ³ , 404, 500처럼 ꡬ체적인 것이 5xx처럼 덜 ꡬ체적인 것보닀 μš°μ„ μˆœμœ„κ°€ λ†’λ‹€.


ν† ν”½ 1개


운영체제 8챕터


ν•˜λ˜ κ±° μ΄μ–΄μ„œ

profile
김뉴비

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보