본문 바로가기

TIL

<자바 Java> 포워딩(forwarding)과 바인딩(binding)

- 포워딩이란?

서블릿 프로그래밍 시 서블릿끼리, 혹은 서블릿과 JSP 사이에 정보를 공유하거나 정보를 전달하는 등의 연동 작업이 필요할 때 사용하는 기능이다. 한마디로 포워딩이 없다면, 서로 다른 서블릿이나 JSP는 정보 교환이나 요청 전달 등의 연동 작업이 불가하다. 따라서 프로그래밍 시 포워딩은 필수적이며 핵심적인 기능이라 할 수 있다.

 

 

- 포워딩 방법

1. 웹 브라우저를 거쳐 전송되는 방법

1) redirect

// response 객체의 sendRedirect 메서드 이용
response.sendRedirect("요청할 서블릿 매핑주소 혹은 JSP?전송할 데이터의 이름=값"); // GET방식으로 데이터 전달 가능

2) Refresh

// response 객체의 addHeaher 메서드 이용
response.addHeader("Refresh", "경과시간(초);url=요청할 서블릿 매핑 주소 혹은 JSP?전송할 데이터의 이름=값")

3) location

// 자바스크립트 location 객체의 href 속성 이용
PrintWriter out = response.getWriter();
out.print("<script type='text/javascript'>");
out.print("location.href='요청할 서블릿 매핑 주소 혹은 JSP?전송할 데이터의 이름=값';");
out.print("</script>");

 

2. 웹 브라우저를 거치지 않고 바로 전송되는 방법

1) dispatch

웹 브라우저를 거치는 위의 방법들과 달리 클라이언트에서 포워딩이 되었는지 알 수 없다.

// RequestDispatcher 클래스의 forward() 메서드 이용
RequestDispatcher dispatch = request.getRequestDispatcher("요청할 서블릿 매핑 주소 혹은 JSP?전송할 데이터의 이름=값");
dispatch.forward(request, response);

 

 

- 바인딩이란?

포워딩을 통해서도 서블릿 간, JSP까지 정보 전달이 가능하지만 이는 전달하는 데이터 양이 많아질 경우 편리한 방법이 아니다. 따라서 대량의 데이터를 공유하거나 전달할 때에는 포워딩이 아닌 바인딩 기능을 사용한다. 바인딩의 뜻은 "두 개를 하나로 묶는다"는 것이다. 바인딩은 웹 프로그램이 실행되었을 때 데이터를 서블릿 관련 객체에 저장한 후 이를 다른 서블릿이나 JSP에서 공유하는 방식으로 이루어진다. 바인딩 기능을 수행할 때 주로 쓰이는 서블릿 관련 객체로는 HttpServletRequest, HttpSession, ServletContext가 있다.

 

특히 주의할 점은 바인딩 기능은 객체에 데이터를 저장한 후 다른 서블릿이나 JSP로 전송할 때에 포워딩 기능이 필요하게 되는데, 이 때 포워딩 방법 중에서도 dispatch만 바인딩 기능을 사용할 수 있다는 것이다. 이유인 즉슨, 웹 브라우저를 거쳐서 전달되는 다른 포워딩 방법들은 처음 요청 시에 받은 객체와, 다시 웹 브라우저를 거쳐 요청하는 객체가 서로 다른 객체이기 때문이다. 쉽게 말하면 웹 브라우저를 거치기 때문에 객체가 다른 객체가 되어 돌아온다고 할 수 있다. 

 

dispatch를 이용한 포워딩 + 바인딩의 예시는 다음과 같다.

// 보내는 쪽
request.setAttribute("바인딩할 데이터 이름", "바인딩할 데이터 값");
RequestDispatcher dispatch = request.getRequestDispatcher("요청할 서블릿 매핑 주소 혹은 JSP");
dispatch.forward(request, response);
// 받는 쪽
데이터타입 변수명 = request.getAttribute("바인딩한 데이터 이름");

 

 

- 바인딩의 범위

1) ServletContext

ServletContext 클래스는 톰캣 컨테이너가 실행되면 각 컨텍스트(웹 애플리케이션)마다 한 개씩 ServletContext 객체를 생성한다. 그리고 톰캣 컨테이너가 종료되면 이들도 소멸된다. 따라서 웹 애플리케이션 전체에서 공유하려는 데이터는 ServletContext 객체에 저장하여 이용한다.

 

2) ServletConfig

ServletConfig 클래스는 ServletContext와 달리 각 서블릿에 대해서 ServletConfig 객체를 생성한다. 따라서 웹 애플리케이션 전체에서 공유가 불가하며, 각 서블릿 내에서만 데이터를 저장하고 이용할 수 있다(ServletContext에 비해 그 범위가 좁다).

 

 

 

 

참고 : 도서 <자바 웹을 다루는 기술>