ServletContext와 RequestDispatcher

Language/JSP 2012. 11. 2. 10:13

어떠한 서블릿 또는 JSP를 만들었다고 합시다. 
그 서블릿은 어떠한 클래스 일까요? 아마도 HttpServlet을 상속받는 어떠한? 클래스 일테죠. 
그 클래스를 보면 아마도 실제 요청을 서비스하는 doGet과 doPost등이 정의되어 있을것이고, init와 destroy역시 준비되어 있겠죠. 
그래서 컨테이너는 HttpServlet의 인스턴스를 생성하고, init를 실행해주고, 그녀석으로 매핑된 URL에 doGet이냐 doPost냐에 따라서 죽어라고 그 메서드만 실행해 주다가 
컨테이너가 종료될때 destroy를 호출해주고 죽겠죠. 
결국 HttpServlet은 아마도(가 아니고 확실히) 하나의 인스턴스만 생성되어서 멀티 스레딩으로 돌아갈것이라고 판단할 수 있겠습니다. 

그러면 이제 ServletContext를 보시죠. HttpServlet의 상속된 클래스의 인스턴스, 즉 서블릿은 스레드 안전하게 설계가 되어야 하고, 따라서 스레드 안전하게 설계되지 않은 경우에 상위 클래스를 마구 접근하다보면 에러가 나겠죠. 그래서 환경설정이나 J2EE서비스에 관한 내용은 ServletContext에서 할수 있게 됩니다. 
이 ServletContext는 getServletContext로만 받을 수 있고, 이녀석은 아마도 동기화가 제대로 구현되어 있는 녀석일겁니다. 
그래서 우리사 ServletContext의 setAttribute와 getAttribute를 마음대로 읽고 써도, 스레드 걱정은 하지 않고 마음대로 읽고 쓸 수 있는겁니다. 
또한 ServletContext의 역할은 여기에서만 그치지 않고, 다른 서블릿 인스턴스를 가져올수 있다거나, 서블릿 환경설정값을 가져올수 있는 기능들을 가지고 있습니다. 
RequestDispatcher 역시 그 기능중의 하나이구요. 

자, 그럼 RequestDispatcher에 대해서 알아 봅시다. 
RequestDispatcher는 디스패치해주는 클래스입니다.(사실 인터페이스 입니다. 정정하자면 HttpServlet역시 ServletContext역시 모두 인터페이스이고 톰캣이나 JBoss같은 녀석이 그 인터페이스를 구현한 클래스를 제공해줍니다.;;;) 

Dispatcher를 사전에서 검색하면 발송자...라는 뜻이 있다고 하네요. 
즉 RequestDispatcher는 요청을 보내주는 클래스라고 이해할 수 있겠습니다. 
따라서 현재의 요청을 다른 서블릿(궁극적으로는 JSP도 서블릿의 하나입니다.)으로 보내야하는데... 
아까 전에 설명드렸죠? 서블릿의 인스턴스는 하나만 생성되고, 이것이 
멀티스레딩으로 돌아간다는 사실. 
그래서 새로운 서블릿을 생성해서 그 서블릿을 실행하는것만으로는 안되고, 
이미 돌아가는 서블릿 인스턴스의 스레드를 하나 더 추가해야 한다는 겁니다. 
그리고 이것은 서블릿 개발자가 해야할 일을 넘었기 때문에 Dispatcher가 대신해준다는거죠. 
하지만 Dispatcher는 HttpServletRequest, HttpServletResponse를 생성해주지는 않습니다. 
그렇기 때문에 Dispatcher가 만들어준 새로운 서블릿 스레드가 있는데 
이 녀석을 실행시키려면 doGet이나 doPost를 실행시켜야 겠죠? 
그래서! 결론으로 dispatch메서드에 
HttpServletRequest, HttpServletResponse를 넘여주는 겁니다.


'Language > JSP' 카테고리의 다른 글

Core of JSP  (0) 2012.11.02
Basic of JSP  (0) 2012.11.02
스프링 MVC - 뷰 영역 구현  (0) 2012.10.31
web.xml (servlet)  (0) 2012.10.31
Spring MVC  (0) 2012.10.31
: