새로운 내용을 공부할 때
새로운 내용의 공부를 시작할 때 용어의 정의를 이해하지 못하거나 정확하게 알지 못한다면 그 용어가 포함된 문장을 이해하지 못합니다.
작은 단어 하나가 내용을 이해하지 못하게 하기 때문에 용어를 정확하게 이해하는 것이 중요합니다.

최대 1 분 소요

📌 2025-04-03 TIL

오늘의 학습 주제

  • 필터는 예외가 발생하면 새 요청과 새 응답을 만들까

학습 내용

예외가 발생하면 was는 DispatcherType을 REQUEST를 ERROR로 변경한다.

이때 was는 new Request() 와 new Response()를 만들까?

만들지 않습니다.

처음 사용자의 요청으로 만든 클래스는 RequestFacade@4f40aa66 입니다.

// org.apache.catalina.connector.RequestFacade@4f40aa66

WAS에서 예외가 발생하면 기존 RequestFacade를 매핑합니다.

class ApplicationHttpRequest extends HttpServletRequestWrapped

기존 정보를 감싸고 있는 구조 이므로 기존 정보를 조회하려면 꺼내야 합니다

if (httpRequest.getDispatcherType() == DispatcherType.ERROR){
  HttpServletRequestWrapper httpRequest1 = (HttpServletRequestWrapper)httpRequest;
  ServletRequest request1 = httpRequest1.getRequest();
  Object count1 = request1.getAttribute("count");

  log.info("내가 찾는 것 ={}", request1);
  log.info("count1={}", count1);

} 

그러면 조회가 가능합니다.

그런데 왜 getAttribue()를 호출하면 원본 객체의 attribute 에서 예외가 발생된 지금이나 기타 사항을 확인할 있습니다.

서로 원본 객체가 다르다.

DispatcherType == ‘REQUEST’ 일 때에 getAttribue()는 사용자 요청의 실제 객체입니다.

DispatcherType == ‘ERROR’ 일 때에 getAttribue()는 래퍼 객체를 감싸고 있습니다.

즉, ApplicationHttpRequest(RequestFacade(Request)) 구조라고 생각하시면 됩니다.

댓글남기기