교재 실습/자바 웹 개발 워크북

49. 데이터 보관소 (5)

Jint 2022. 6. 20. 22:44

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