코드프레소 백엔드 개발자 양성 과정

서블릿의 포워드 방법

서블릿을 연동하여 작업하는 방법을 알아본다.

H Lee

--

Image by Free-Photos from Pixabay

프로그램을 실행하다 보면 서블릿과 서블릿을, 혹은 서블릿과 JSP를 연동하여 기능을 수행해야 할 때가 있다. 쇼핑몰에서 상품 조회를 요청하면 그 요청이 상품 관리 서블릿으로 전달되어 데이터베이스에서 정보를 조회하고, 결과가 다시 JSP로 전달되어 클라이언트에게 표시된다.

이렇게 서블릿 간의, 또는 서블릿과 JSP 간의 정보의 주고 받음을 포워딩이라고 하며, 포워드 기능의 용도는 다음과 같다.

  • 요청에 대한 추가 작업을 다른 서블릿에게 수행하게 한다.
  • 요청에 포함된 정보를 다른 서블릿이나 JSP와 공유한다.
  • 요청에 정보를 덧붙여 다른 서블릿으로 전달한다.
  • 모델 2 개발 시 서블릿에서 JSP로 정보를 전달한다.

포워드 방식은 크게 네 가지가 있다. 하나씩 살펴보도록 하겠다.

Redirect

redirect 방식은 서블릿의 요청이 클라이언트의 브라우저를 거듭 거쳐 요청되는 방식이다. 수행 과정을 도식화하면 아래와 같다.

redirect 방식에서는

  1. 첫 번째 서블릿이 요청을 받고,
  2. sendRedirect() 메서드를 이용해 브라우저에게 두 번째 서블릿으로 재요청하도록 하면,
  3. 브라우저는 sendRedirect() 메서드에서 지정된 두 번째 서블릿으로 독립적인 요청을 보낸다.

첫 번째 서블릿에서 두 번째 서블릿으로 redirect 방식을 이용하여 포워드하는 실습을 해보겠다. 이 방법에서는 첫 번째 서블릿에서 응답 객체에 sendRedirect("포워드 받을 서블릿이나 JSP") 메서드를 적용해 클라이언트에게 반환한다.

그러면 클라이언트는 지정된 둘째 서블릿에게 새로운 요청을 보내게 되며, 우리는 이를 눈으로 확인하기 위해 문장을 출력해보도록 하겠다.

그 결과 브라우저에서 첫 번째 서블릿에 요청 시, 주소창의 URL이 둘째 서블릿의 것으로 변하며 거기서 설정해 둔 문구가 출력된 것을 확인할 수 있다.

/first로 첫 번째 서블릿 요청
/second로 전달되어 두 번째 서블릿에서 정한 문장 출력

Refresh

refresh를 이용한 포워딩 방식은 redirect 방식과 동일하게 작동한다. 요청을 받은 첫 번째 서블릿이 두 번째 서블릿으로 전달을 하기 위해서는 브라우저 측에서 두 번째 서블릿으로 새로운 요청을 보내야 한다.

차이점이라면 refresh 방식에서는 sendRedirect() 메서드 대신 addHeader()라는 메서드를 이용하며, 이 메서드는 매개 변수로 두 번째 서블릿 외에도 재요청이 이뤄지는 데 걸리는 지연 시간을 설정할 수 있다. 형식은 다음과 같다 : response.addHeader("Refresh", "경과시간 (초); url = 요청할 서블릿이나 JSP");.

요청을 받고 10초 후에 자동으로 second라는 서블릿으로 재요청을 보내는 포워딩 실습을 구현해보겠다. addHeader() 메서드에 매개 변수로 10과 second를 제공해준다.

마찬가지로 포워딩이 제대로 이뤄졌는지 확인하기 위해 브라우저에 특정 문구가 출력되도록 지정한다.

아래와 같이 브라우저에서 첫 번째 서블릿을 요청해본다.

/first로 첫 번째 서블릿 호출

redirect 와 달리 곧바로 지정된 둘째 서블릿으로 넘어가지 않고 매개 변수로 입력한 10초 만큼의 지연이 발생한다. 이때, 이 지연 기간 동안은 정해둔 메시지가 표시되지 않고 URL에도 변화가 없는 상태가 연출된다.

10초 동안의 지연 기간 동안에는 두 번째 서블릿으로 넘어가지 않음

10초가 지나서야 ‘refresh를 이용한 포워딩 실습’이라는 문구가 출력되며 두 번째 서블릿으로 넘어온 것을 확인할 수 있다.

10초 경과 후 두 번째 서블릿으로 넘어온 모습

Location

이 밖에도 자바스크립트에서 제공되는 location 객체를 이용하여 포워드하는 방법도 있다. location 방식 또한 위 둘 방식과 마찬가지로 클라이언트를 거쳐 다음 서블릿으로 독립적인 요청을 보내어 동작하는 방식이다.

첫 번째 서블릿에서 second라는 이름의 두 번째 서블릿으로 재요청하도록 하고 싶다면 다음과 같이 location 객체의 href 속성에 second 서블릿을 설정해준다.

두 번째 서블릿이 클라이언트로부터 독립적인 재요청을 받으면 이를 확인하기 위해 브라우저에 문구를 출력하도록 설정해보겠다.

그리하여 브라우저에서 첫 번째 서블릿을 요청하면 두 번째 서블릿으로 URL이 변경되며, 포워드가 성공적으로 이루어짐을 확인할 수 있다.

첫 번째 서블릿 요청
두 번째 서블릿이 요청을 받으면 출력하기로 한 받은 문구를 표시

Dispatch

dispatch를 이용한 포워드 방식은 나머지 세 가지 방식과는 다르다. 이 방식에서는 클라이언트를 거치지 않고 첫 번째 서블릿과 두 번째 서블릿 사이에서 직접적인 포워딩이 일어난다. 그렇기 때문에 브라우저의 주소창에서 URL이 변경되지 않으며, 클라이언트는 포워딩이 발생했는지 알 수 없다. 이 과정을 도식화하면 아래와 같다.

dispatch 방법에서는 forward() 메서드를 이용하여 다음과 같이 포워드를 구현한다. 여기서도 second라는 서블릿으로 포워드를 해보도록 한다.

포워드가 성공적으로 이뤄졌는지 확인하기 위해 문장을 출력하도록 설정해준다.

그 결과 요청 URL은 /first로 첫 번째 서블릿에서 변화가 없으나, 응답으로는 두 번째 서블릿의 내용이 표시됨을 볼 수 있다.

URL이 /first로 유지되어 사용자는 포워딩이 일어났는지 알 수 없음

이렇게 서블릿 간의, 서블릿과 JSP 간의 연동을 윤택하게 하는 다양한 포워딩 방법을 알아보았다.

참고 : 자바 웹을 다루는 기술 (이병승)

--

--