일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 기술면접
- 코딩테스트
- Spring
- JSP
- Spring MVC
- 웹
- 면접
- 백준
- 네이버
- DI
- Spring Framework
- servlet
- IOC
- Service
- 다이나믹프로그래밍
- 비동기
- 부스트코스
- was
- Callback
- request
- 부스터2기
- DP
- 다이나믹 프로그래밍
- response
- controller
- 파이썬
- 자바스크립트
- 서블릿
- 알고리즘
- Promise
- Today
- Total
Sh개발일기
리다이렉트와 포워드 (Redirect & forward) 본문
학습 목표
- 리다이렉트를 이해한다.
- 리다이렉트를 사용 할 수 있다.
- forward를 이해한다.
- forward를 사용 할 수 있다.
핵심 개념
- HttpServletResponse
- sendRedirect()
- RequestDispatcher
- forward()
리다이렉트(Redirect)
리다이렉트란, http프로토콜로 정해진 규칙으로 서버가 클라이언트에게 특정 url로 이동하라는 요청을 보내는 것을 의미한다.
서버에서는 클라이언트에게 응답으로 상태코드(302)와 함께 이동할 url정보를 Location헤더에 담아 전송한다. 클라이언트는 서버로부터 받은 상태값이 302이면 Location헤더값으로 재요청을 보내게 된다.
이 때, 브라우저의 주소창은 전송받은 url로 바뀌게 된다.
서블릿이나 JSP는 redirect하기 위해 HttpServletResponse가 가지고 있는 sendRedirect()메소드를 사용한다. 브라우저는 상태코드 302를 받게 되면 알아서 서버에 페이지를 요청하게 된다.
redirect01.jsp, redirect02.jsp를 만들어 진행하는 실습을 살펴보겠다.
위와 같이 코드를 작성한 후, redirect01.jsp를 실행하면 다음과 같은 결과를 얻을 수 있다.
"ㅠ"는 무시하도록하자. 위에서 본 것 처럼 redirect01을 실행하게 되면 response객체의 sendRedirect()메소드를 이용하여 리다이렉트를 보내게 되고, 이에 따라 redirect02가 요청되어 브라우저에 출력되는 것을 볼 수 있다. url이 redirect02.jsp로 바뀐것을 알 수 있다.
리다이렉트의 경우 각각의 요청이 실행될 때 마다 Client와 Server(WAS)간 새로운 요청이 생성되는 것이므로 항상 새로운 request, response객체가 생성된다는 특징이 있다. 이는 다음에 배울 forward와 구별되는 특징으로 기억해 둘 필요가 있다.
forward
WAS의 서블릿이나 JSP가 요청을 받아 처리하다가, 추가적인 처리를 같은 웹 어플리케이션에 포함된 다른 서블릿이나 JSP에 위임하는 것을 forward라고 한다.
forward의 일반적인 절차는 다음과 같다.
- 웹 브라우저에서 Servlet1에게 요청(request)을 보냄
- Servlet1에서 요청을 처리한 후, 그 결과를 HttpServletRequest에 저장
- Servlet1은 결과가 저장된 HttpServletRequest와 응답을 위한 HttpServletResponse를 같은 웹 어플리케이션 안에 있는 Servlet2에게 전송(forward)
- Servlet2는 Servlet1으로 부터 받은 HttpServletRequest와 HttpServletResponse를 이용하여 요청을 처리한 후 웹 브라우저에게 결과를 전송
forward는 redirect와 달리 하나의 요청을 여러개의 Servlet이 처리한다는 특징이 있다. forward와 redirect의 개념이 많이 헷갈린다고 하는데 forward는 redirect와 달리 url이 바뀌지 않는다.
즉, redirect는 request, response가 여러 번 만들어지지만, forward는 같은 객체 하나만 존재한다. 요청이 하나인지(forward), 여러개인지(redirect) 생각하면 쉽게 구별할 수 있다.
forward 실습 코드
frontServlet, nextServlet을 만들어 진행한 실습을 살펴보자. frontServlet에서 랜덤넘버를 생성한 후, nextServlet에 넘겨주면 nextServlet에서 해당하는 수 만큼의 구문을 브라우저에 프린트하는 코드이다.
frontServlet의 핵심 코드는 위와 같다. diceValue에 랜덤넘버를 생성한 뒤 setAttribute메소드를 이용하여 값을 이름과 함께 저장하고, RequestDispatcher객체와 "/next"를 이용하여 forward를 진행하고 있다. forward에 인자로 request, response를 보내주어 하나의 객체를 사용하고 있다는 점이 중요하다.
다음은 nextServlet의 핵심코드이다.
getAttribute메소드를 통해 이름을 통해 들어온 값을 받아 사용하는 것을 볼 수 있다.
지금까지 사용된 주요 메소드는 다음과 같다.
- request.setAttribute("이름", object) - 키값을 "이름"으로 갖는 Object 저장
- request.getRequestDispatcher("nextServlet") - requestDispatcher객체 반환
- requestdispatcher.forward(request, response) - forward수행
- request.getAttribute("이름") - "이름"에 해당하는 값(오브젝트) 얻어오기
실습 코드의 결과는 다음과 같다.
위와같이 잘 동작하는 것을 볼 수 있다. url이 front로 변하지 않는 것을 눈여겨 보아야 한다.
위와 같이 url이 그대로 유지되는것이 redirect와 forward의 차이점이다.
'BoostCourse' 카테고리의 다른 글
EL(Expression Language) (0) | 2020.02.21 |
---|---|
스코프(Scope) (0) | 2020.02.19 |
JSP 내장객체 (0) | 2020.02.17 |
JSP 문법 (0) | 2020.02.17 |
JSP의 정의와 라이프싸이클 (0) | 2020.02.17 |