5. ServletRequest의 활용
ServletRequest 객체에 데이터를 보관하면 포워딩이나 인클루딩을 통해 협업하는 서블릿(JSP 포함)끼리 데이터를 공유할 수 있다. 그 이유는 request와 response를 같이 사용하기 때문이다.
//LogInServlet 클래스의 doGet() 메서드
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//로그인 페이지로 포워딩
RequestDispatcher rd = request.getRequestDispatcher("/auth/LogInForm.jsp");
rd.forward(request, response);
}
forward() 메서드를 호출할 때 doGet() 메서드의 매개변수 값을 그대로 넘겨주고 있다. 다음 그림은 LogInServlet 클래스와 LogInForm.jsp 사이에서 ServletRequest를 공유하는 것을 보여준다(그림 1).
MVC 아키텍처에 따라 작성한 예제들(회원 목록 출력, 로그인)을 보면, ServletRequest 보관소를 통해 컨트롤러와 뷰 사이에서 데이터를 공유하는 모습을 볼 수 있다.
6. JspContext의 활용
JspContext 보관소는 JSP 페이지를 실행할 때 생성되고, 실행이 완료되면 이 객체는 제거된다. 따라서 JSP 페이지 내부에서만 사용될 데이터를 공유할 때 사용한다. 그런데 여기서 의문점이 하나 생기는데 "JspContext 보관소와 JSP 페이지의 로컬변수와의 차이점이 무엇인가?"이다.
이것은 JspContext 보관소를 통해 데이터를 공유하기 원하는 자가 누구인지를 알아내면 된다(그림 2).
JSP 페이지를 작성하다 보면 <jsp:include>와 같은 특별한 태그를 사용하게 된다.
<!-- MemberList.jsp의 일부분 -->
<body>
<jsp:include page="/Header.jsp"/>
<h1>회원목록</h1>
<p><a href='add'>신규 회원</a></p>
이런 태그들은 JSP 엔진이 서블릿 클래스를 생성할 때 특정 자바 코드로 변환된다.
//MemberList_jsp 클래스의 _jspService() 메서드에 특정 자바 코드로 변환된 <jsp:include> 태그
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "/Header.jsp", out, false);
이 때 이 태그의 값을 다루는 객체를 '태그 핸들러'라고 부른다. 바로 이 태그 핸들러에게 데이터를 전달하고자 할 때 JspContext 보관소를 사용한다. JSP 페이지에 선언된 로컬 변수는 태그 핸들러에서 접근할 수 없다. 따라서 태그 핸들러에게 전달할 데이터가 아니라면 JspContext에 값을 보관할 필요가 없다.
커스텀 태크는 JSP 개발자가 사용하기 쉽도록 복잡한 자바 코드를 태그로 정의하는 기술이다. JSP 페이지만 사용하여 웹 애플리케이션을 만들 때는 유용한 기술이지만, 지금과 같이 MVC 아키텍처로 웹 애플리케이션을 개발할 때는 별 필요가 없는 기술이다.
실무에서 사용되는 핵심 기술들이 어떻게 연결되어 돌아가는지 전체 구조를 이해하는 것이 중요하기 때문에 각 기술의 세부 사항에 얽매이지 말고 전체 구조를 이해하는데 집중하는 것이 중요하다. 세부 사항은 그 이후에 봐도 늦지 않는다.
참고도서 : https://freelec.co.kr/book/1674/
[열혈강의] 자바 웹 개발 워크북
[열혈강의] 자바 웹 개발 워크북
freelec.co.kr
'교재 실습 > 자바 웹 개발 워크북' 카테고리의 다른 글
51. JSP 액션 태그의 사용 (2) (0) | 2022.06.22 |
---|---|
50. JSP 액션 태그의 사용 (1) (0) | 2022.06.21 |
48. 데이터 보관소 (4) (0) | 2022.06.19 |
47. 데이터 보관소 (3) (0) | 2022.06.18 |
46. 데이터 보관소 (2) (0) | 2022.06.16 |
댓글