728x90
반응형

[Servlet] Servlet 메서드와 파라미터 제대로 알기 - 초보자를 위한 웹 개발 가이드

 

[Servlet] Servlet 메서드와 파라미터 제대로 알기 - 초보자를 위한 웹 개발 가이드

[Servlet] 초보자를 위한 Servlet Mapping과 생명주기, 초기 설정법 총정리 [Servlet] 초보자를 위한 Servlet Mapping과 생명주기, 초기 설정법 총정리[Servlet] Servlet 기초 완벽 가이드 | 동작 방식과 DD(web.xml) 설

crushed-taro.tistory.com

1. Forward & Redirect

1. forward()

1. forward() 역할

  • 컨테이너 내에서 처음 요청 받은 페이지가 요청 데이터 (HttpServletRequest, HttpServletResponse)를 다른 페이지에 전송하여 처리를 요청하고, 자신이 처리한 것처럼 응답한다.
  • 클라이언트가 요청한 url주소(페이지)가 변경되지 않는다.

Servlet 사진

 

2. forward() 구조

Servlet 사진 2

  1. 서버(= Tomcat)를 실행하면 내부 서블릿 컨테이너에 작성한 서블릿이 다 올라가고 doGet, doPost 등 매핑된 url로 연결된다.
  2. HTTP에 의한 요청을 전달하면 헤더의 문자열을 파싱해서 헤더, 데이터, 응답 대상 브라우저 등을 request와 response 객체로 쪼개어 doGet() 또는 doPost() 메소드로 보낸다.
  3. 이때 요청 받은 서블릿에서 다른 서블릿으로 request, response 객체를 담아 forward하면 동일한 속성을 가지고 처리 권한을 위임한다.
  4. 서버 내부에서 다른 서블릿에 위임했으나 요청받은 서블릿이 응답하는 것처럼 처리하므로 위임한 경로를 노출하지 않는다. 즉, 처리하는 서블릿이 변경되었어도 url이 변경되지 않는다.

 

3. forward() 활용 예시

  • 요청받은 서블릿에서 forward하는 코드 예시
request.setAttribute("userId", userId);

RequestDispatcher rd = request.getRequestDispatcher("print");
rd.forward(request, response);
  • 다른 서블릿으로 요청하기 위한 데이터는 request에 setAttribute()로 담아 전달한다.
  • attribute도 일종의 Map 형식으로, key-value 방식으로 값을 저장할 수 있다.
  • RequestDispatcher는 ‘배차관리자’라는 뜻으로, 서블릿 위임 시 어디로 보낼지 결정하는 역할을 한다.

 

  • 위임(forward)받은 서블릿에서 속성 값을 꺼내는 코드 예시
String userId = (String) request.getAttribute("userId");
  • forward 받은 서블릿에서도 요청 방식이 get이면 doGet메소드를, 요청 방식이 post이면 doPost메소드를 호출한다.
  • request에 전달 정보를 담았으므로, 위임받은 서블릿에서 사용하기 위해 request에서 getAttribute()로 담아 전달한다.
  • forward할 때 전달한 request와 response의 모든 정보를 이용해 새로운 request, response를 만들고 그 정보를 이용해 다시 http 메소드에 맞는 서블릿의 doGet 혹은 doPost를 요청하는 방식이다.
  • → 깊은 복사를 이용해 값을 그대로 복사했기 때문에 내부에 존재하는 헤더 정보나 인스턴스는 그대로 유지한다.

 

2. redirect()

1. redirect() 역할

  • 클라이언트 브라우저에게 **“(매개변수로 등록한) 페이지를 재요청하라”**고 응답한다.
  • (응답 상태 코드 : 301, 302)
  • encodeRedirectURL은 매개변수(URL)에 Session ID 정보를 추가하여 재요청 처리한다.
  • 클라이언트가 별도로 다른 페이지 요청을 하지 않아도 url주소(페이지)가 변경된다.
    • (브라우저 요청에 따라 서버가 알아서 해당 페이지를 요청하며, 쿼리스트링으로 별도의 데이터를 전송하지 않으면 요청 데이터가 없다.)
     

 

2. redirect() 구조

Servlet 사진 4

  1. 서버(= Tomcat)를 실행하면 내부 서블릿 컨테이너에 작성한 서블릿이 다 올라가고 doGet, doPost 등 매핑된 url로 연결된다.
  2. HTTP에 의한 요청을 전달하면 헤더의 문자열을 파싱해서 헤더, 데이터, 응답 대상 브라우저 등을 request와 response 객체로 쪼개어 doGet() 또는 doPost() 메소드로 보낸다.
  3. 이때 요청 받은 서블릿에서 재요청할 url을 담아 sendRedirect()로 응답하면 처리하는 서블릿으로 브라우저가 재요청을 보내도록 한다.
    • 302 status code를 보냄으로써 요청 url을 바꿔 다시 요청하라는 의미를 전달한다.
      • 사용자 url 재작성이라고 불리는 redirect 방식은 302번 응답 코드인 경우 요청에 대한 처리를 완료하였고, 사용자의 url을 강제로 redirect 경로로 이동시키라는 의미이다.

 

3. redirect() 활용 예시

  • 요청받은 서블릿에서 sendRedirect하는 코드 예시
    1. 타 사이트로 이동하는 경우
response.sendRedirect("http://www.naver.com");
  • 브라우저의 개발자도구 network 탭을 보면 302번 코드와 함께 naver 사이트로 이동하는 것을 확인할 수 있다.
  • 응답 헤더 작성은 General Header의 302번 코드와 Response header의 Location 헤더값에 redirect할 경로를 포함하여 응답한다.

 

  • 타 서블릿으로 이동하는 경우 (타 서블릿의 url pattern 작성)
response.sendRedirect("redirect");
  • redirect하면 url이 재작성되어 새로고침할 때 redirect된 페이지에 대한 요청을 반복한다.
  • 즉, 이전 요청에 포함된 정보는 남아있지 않고 url이 변경되는 것이 redirect의 특징이다.
  • HTTP 요청은 요청 시 connection을 맺었다 끊고, 응답 시에도 connection을 맺었다 끊으므로 요청 단위당 request객체는 한 개만 생성된다.
  • 따라서 첫 요청 시의 request와 redirect된 페이지의 request는 서로 다른 객체이므로, redirect를 쓰면 이전 서블릿의 request 객체 속성 값을 공유해서 사용할 수 없다. (이를 해결하기 위해 쿠키 및 세션 객체를 활용한다.)

 

3. forward()와 redirect() 비교

1. 구조 비교

Servlet 사진 5

  • forward는 서버 내부에서 요청을 동일한 파라미터 객체로 위임하여 응답하고, 마치 요청받은 서블릿이 응답한 것처럼 보여준다.
  • redirect는 요청한 서블릿이 302 status로 응답을 보내주고, 브라우저가 응답 받은 방향으로 다시 요청을 보내 결과 페이지를 반환 받는 구조이다.

 

2. CRUD 로직에서의 활용

Servlet 사진 6

  • 새로고침을 반복할 때마다 동일한 요청이 반복되는 forward는 대게 조회 기능에 사용한다.
    • select 처리한 조회 값 데이터가 많으면 한번에 많은 값을 전달할 수 있다.
    • 새로고침하면 재조회해서 추가 또는 삭제된 데이터를 반영해서 조회할 수 있다.
  • 새로고침을 하면 재요청된 페이지에 대한 요청이 반복되는 redirect는 주로 삽입, 수정, 삭제 기능에 사용한다.
    • 데이터 insert, update, delete 로직을 수행할 때 해당 기능이 중복 수행되지 않도록 하는 것이 바람직하다.
  • 이처럼 forward와 redirect는 특징을 알고 특징에 맞게 사용해야 하고, 정해진 방식이 있는 것은 아니다.
    • 예를 들어 로그인 기능은 select 기능이지만, redirect 방식을 활용해 로그인 횟수 제한 등을 설정하기도 한다.

 

4. 객체별 공유 데이터 설정

  • 공유 데이터는 Map 형식의 key-value 방식으로 저장된다.
  • 이러한 공유 데이터를 포함한 ServletContext, ServletRequest, HttpSession 객체에서 사용하는 method는 다음 표와 같다.
method 내용
setAttribute(String,Object) 공유 데이터 저장
getAttribute(String) 공유 데이터 가져옴
getAttributeName() 공유 데이터 전체의 명칭 가져옴
removeAttribute(String) 공유 데이터 자체를 삭제

 

728x90
반응형

+ Recent posts