본문 바로가기
교재 실습/자바 웹 개발 워크북

49. 데이터 보관소 (5)

by Jint 2022. 6. 20.

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).

그림 1 (협업을 하는 서블릿들끼리의 ServletRequest의 공유)

MVC 아키텍처에 따라 작성한 예제들(회원 목록 출력, 로그인)을 보면, ServletRequest 보관소를 통해 컨트롤러와 뷰 사이에서 데이터를 공유하는 모습을 볼 수 있다.

 

6. JspContext의 활용

JspContext 보관소는 JSP 페이지를 실행할 때 생성되고, 실행이 완료되면 이 객체는 제거된다. 따라서 JSP 페이지 내부에서만 사용될 데이터를 공유할 때 사용한다. 그런데 여기서 의문점이 하나 생기는데 "JspContext 보관소와 JSP 페이지의 로컬변수와의 차이점이 무엇인가?"이다.

이것은 JspContext 보관소를 통해 데이터를 공유하기 원하는 자가 누구인지를 알아내면 된다(그림 2).

그림 2 (JspContext의 활용 사례)

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

댓글