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주소(페이지)가 변경되지 않는다.
2. forward() 구조
- 서버(= Tomcat)를 실행하면 내부 서블릿 컨테이너에 작성한 서블릿이 다 올라가고 doGet, doPost 등 매핑된 url로 연결된다.
- HTTP에 의한 요청을 전달하면 헤더의 문자열을 파싱해서 헤더, 데이터, 응답 대상 브라우저 등을 request와 response 객체로 쪼개어 doGet() 또는 doPost() 메소드로 보낸다.
- 이때 요청 받은 서블릿에서 다른 서블릿으로 request, response 객체를 담아 forward하면 동일한 속성을 가지고 처리 권한을 위임한다.
- 서버 내부에서 다른 서블릿에 위임했으나 요청받은 서블릿이 응답하는 것처럼 처리하므로 위임한 경로를 노출하지 않는다. 즉, 처리하는 서블릿이 변경되었어도 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() 구조
- 서버(= Tomcat)를 실행하면 내부 서블릿 컨테이너에 작성한 서블릿이 다 올라가고 doGet, doPost 등 매핑된 url로 연결된다.
- HTTP에 의한 요청을 전달하면 헤더의 문자열을 파싱해서 헤더, 데이터, 응답 대상 브라우저 등을 request와 response 객체로 쪼개어 doGet() 또는 doPost() 메소드로 보낸다.
- 이때 요청 받은 서블릿에서 재요청할 url을 담아 sendRedirect()로 응답하면 처리하는 서블릿으로 브라우저가 재요청을 보내도록 한다.
- 302 status code를 보냄으로써 요청 url을 바꿔 다시 요청하라는 의미를 전달한다.
- 사용자 url 재작성이라고 불리는 redirect 방식은 302번 응답 코드인 경우 요청에 대한 처리를 완료하였고, 사용자의 url을 강제로 redirect 경로로 이동시키라는 의미이다.
- 302 status code를 보냄으로써 요청 url을 바꿔 다시 요청하라는 의미를 전달한다.
3. redirect() 활용 예시
- 요청받은 서블릿에서 sendRedirect하는 코드 예시
- 타 사이트로 이동하는 경우
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. 구조 비교
- forward는 서버 내부에서 요청을 동일한 파라미터 객체로 위임하여 응답하고, 마치 요청받은 서블릿이 응답한 것처럼 보여준다.
- redirect는 요청한 서블릿이 302 status로 응답을 보내주고, 브라우저가 응답 받은 방향으로 다시 요청을 보내 결과 페이지를 반환 받는 구조이다.
2. CRUD 로직에서의 활용
- 새로고침을 반복할 때마다 동일한 요청이 반복되는 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
반응형
'이것 저것 개발 공부 > Servlet' 카테고리의 다른 글
[Servlet] Servlet에서 Request와 Response를 가공하는 가장 좋은 방법 | Wrapper 클래스 (0) | 2025.05.13 |
---|---|
[Servlet] Servlet에서 Session과 Cookie 완벽 이해하기 | 차이점, 사용법, 예제까지 정리 (0) | 2025.05.12 |
[Servlet] Servlet 메서드와 파라미터 제대로 알기 - 초보자를 위한 웹 개발 가이드 (0) | 2025.05.08 |
[Servlet] 초보자를 위한 Servlet Mapping과 생명주기, 초기 설정법 총정리 (0) | 2025.05.07 |
[Servlet] Servlet 기초 완벽 가이드 | 동작 방식과 DD(web.xml) 설정법 (0) | 2025.05.07 |