본문 바로가기
스프링 부트/자바 웹을 다루는 기술

8.4 바인딩

by 989898 2024. 1. 21.

앞 절에서는 서블릿에서 다른 서블릿으로 포워딩할 때 GET 방식으로 데이터를 전달하는 방법을 알아봤습니다. 전달하는 데이터 양이 적을 때는 이 방법이 편리합니다.

 

그러나 서블릿에서 조회한 대량의 상품 정보를 JSP로 전달할 때는 GET 방식이 불편합니다.

 

따라서 서블릿에서 다른 서블릿 또는 JSP로 대량의 데이터를 공유하거나 전달하고 싶을 때는 바인딩(binding) 기능을 사용한다.

 

바인딩의 사전적 의미는 “두 개를 하나로 묶는다”는 것이다. 이는 웹 프로그램 실행 시 자원(데이터)을 서블릿 관련 객체에 저장하는 방법으로, 주로 HttpServletRequest, HttpSession, ServletContext 객체에서 사용되며 저장된 자원(데이터)은 프로그램 실행 시 서블릿이나 JSP에서 공유하여 사용한다.

 

실제 모델2, 스트럿츠, 스프링 프레임워크로 구현하는 웹 프로그램은 이 바인딩 기능을 이용해 서블릿이나 JSP 간 데이터를 전달하고 공유한다.

 

표 8-1은 서블릿 관련 객체에서 바인딩 관련 기능을 제공하는 여러 가지 메서드이다.

8.4.1 HttpServletRequest를 이용한 redirect 포워딩 시 바인딩

 

먼저 HttpServletRequest 객체를 이용한 바인딩 기능을 알아보겠다. 브라우저에서 전달 받은 request를 서블릿에서 redirect 방식으로 다른 서블릿에 전달하는 예제다.

 

1. 다음과 같이 실습 파일을 준비합니다.

 

2. FirstServlet 클래스를 다음과 같이 작성한다. HttpServletRequest setAttribute() 메서드를 이용해 (address, "서울시 성북구")를 바인딩한다.

 

➊ 웹 브라우저에서 요청한 request 객체에 address의 값으로 "서울시 성북구"를 바인딩합니다.

➋ 두 번째 서블릿으로 전달하기 위해 sendRedirect()를 호출합니다.

 

3. 두 번째 서블릿에서는 HttpServletRequest getAttribute() 메서드를 이용해 전달된 주소를 받는다.

 

전달된 request에서 getAttribute()를 이용해 address의 값을 가져옵니다.

 

4. 실행 결과를 보면 정상적으로는 '서울시 성북구'가 출력되어야 하는데 null이 출력됩니다. 왜 그럴까?

 

그 이유는 8.1절 그림 8-1의 redirect 방식 포워드 과정 때문이다. 포워딩 과정 1단계인 웹 브라우저에서 요청할 때 서블릿에 전달되는 첫 번째 request는 웹 브라우저를 통해 재요청되는 3단계의 두 번째 request와 다른 요청이다. 즉, redirect 방식으로는 서블릿에서 바인딩한 데이터를 다른 서블릿으로 전송할 수 없다는 것.

 

그럼 이런 의문이 들 수 있을 것임. 앞서 redirect 방식을 실습했을 때처럼 GET 방식으로 전송하면 되지 않느냐고 말이죠. 물론 전달하고자 하는 데이터가 보안과 상관이 없으며, 데이터 양이 적다면 그렇게 해도 괜찮다. 하지만 데이터베이스에서 조회된 수십 개의 회원 정보나 상품 정보를 전달해야 한다면 확실히 redirect 방식에는 문제가 있다.

8.4.2 HttpServletRequest를 이용한 dispatch 포워딩 시 바인딩

 

이번에는 dispatch 방법으로 바인딩 기능을 사용해 보겠다.

 

1. 다음과 같이 실습 파일을 준비.

 

2. FirstServlet 클래스를 다음과 같이 작성한다. 브라우저에서 전달된 request에 주소를 바인딩한 후 dispatch 방법을 이용해 다른 서블릿으로 포워딩한다.

➊ 웹 브라우저의 최초 요청 request에 바인딩한다.

➋ 바인딩된 request를 다시 두 번째 서블릿으로 포워드한다.

 

3. SecondServlet 클래스를 다음과 같이 작성한다. 전달된 request에서 주소를 받은 후 브라우저로 출력한다.

 

전달된 request에서 getAttribute( )를 이용해 주소를 받아 온다.

 

4.  이번에는 화면에 정상적으로 주소가 출력된다. 그 이유는 8.3절의 그림 8-11을 보면 알 수 있다.

 

 

이 포워딩 과정을 보면 첫 번째 서블릿에서 두 번째 서블릿으로 전달되는 request가 브라우저를 거치지 않고 바로 전달되었습니다. 따라서 첫 번째 서블릿의 request에 바인딩된 데이터가 그대로 전달된 것이다.

 

모델2, 스트럿츠, 스프링 프레임워크로 개발할 때는 dispatch 방식으로 바인딩된 데이터를 서블릿이나 JSP로 전달한다. 자세한 것은 17장에서 알아보겠다.

8.4.3 두 서블릿 간 회원 정보 조회 바인딩 실습

 

이번에는 데이터베이스에서 조회된 회원 정보를 화면 기능을 담당하는 서블릿에 전달해서 웹 브라우저에 출력해 보겠다.

 

1. MemberServlet 클래스를 다음과 같이 작성한다. 첫 번째 서블릿에서 조회한 회원 정보를 List에 저장한 후 다시 바인딩하여 두 번째 서블릿으로 전달한다.

 

➊ 조회된 회원 정보를 ArrayList 객체에 저장한 후 request에 바인딩한다.

➋ 바인딩한 request를 viewMembers 서블릿으로 포워딩한다.

 

2. ViewServlet 클래스를 다음과 같이 작성한다. getAttribute() 메서드를 이용해 첫 번째 서블릿에서 바인딩한 회원 정보를 List로 가져온다.

 

바인딩해서 넘어온 request에서 회원 정보를 가져옵니다.

 

4. 브라우저에서 요청하여 실행 결과를 확인한다.

ViewServlet 클래스는 웹 브라우저에서 화면 기능을 담당하는데 이러한 기능을 하는 서블릿이 분화되어 발전된 것이 바로 JSP이다.