[Spring Basic] 리다이렉트와 포워드
Redirect
클라이언트가 요청을 했지만, 요청을 처리하는 jsp파일에서 요청을 처리할 수 없을 때 다른 URL으로 다시 요청한다.
브라우저는 자동으로 Redirection의 헤더에 담긴 정보를 읽고 요청을 보낸다.
처음 요청은 수동, 두 번째 요청은 자동으로 수행되고 리다이렉트로 요청될 때는 처음 요청이 어떤 방식임에 상관없이 GET방식으로 요청한다.
즉, 클라이언트가 요청을 보내고 서버는 클라이언트에게 새로운 위치로 이동하라고 응답하는 경우가 리다이렉트이다.
(HTTP 300번)
원래의 요청과 새로운 요청은 독립적으로 구분된다.
사용자가 로그인 후 메인 페이지로 이동하는 경우 사용된다.
Forward
클라이언트가 요청을 했지만 해당 jsp에서 전부 처리하지 못하고 다른 jsp를 호출하는 경우를 말한다.
다음 jsp에서 작업을 수행한 후 클라이언트에게 응답한다.
포워드는 서버 내부에서 이루어지는 리소스 간의 이동이다.
클라이언트가 서버에게 요청을 보내면, 서버는 그 요청을 다른 리소스에게 전달하고, 다른 리소스가 처리한 결과를 클라이언트에게 반환한다.
원래의 요청과 포워드된 요청은 동일한 요청으로 취급된다.
스프링 MVC에서 컨트롤러가 클라이언트의 요청을 받고 비즈니스 로직을 수행하기 위해 서비스를 호출하는건 포워드라기보다는 애플리케이션의 정상적인 요청 흐름이다.
서블릿이나 JSP에서 다른 서블릿이나 JSP로 요청을 내부적으로 전달하는 매커니즘을 포워드라고 부른다.
리다이렉트와 포워드의 차이는 클라이언트가 이동을 인식하는가에 있다.
리다이렉트가 발생하면 브라우저의 URL이 바뀌기 때문에 클라이언트가 다시 요청을 보내게 된다.
반면 포워드는 서버 내부에서 이동이 이루어지기에 클라이언트는 이동을 인지하지 못한다.
스프링에서는 요청이 어떻게 처리될까?
스프링 MVC 에서는 클라이언트의 요청을 먼저 DispathcerServlet이 받는다.
그 후 이 요청을 처리할 수 있는 컨트롤러의 메서드를 호출하는데, 여기서 redirect가 리턴되는 경우는 DispatcherServlet이 RedirectView에게 전달한다.
RedirectView는 응답 헤더를 만들고, 클라이언트에게 전달한다.
그리고 브라우저가 응답 헤더에 대한 정보를 읽고 다시 요청한다.
리다이렉션을 수행할 필요가 없는 경우에 대해 알아보자.
컨트롤러가 디스패처 서블릿에게 뷰 이름을 반환하고, 디스패처 서블릿은 InternalResourceViewResolver를 통해 전달받은 뷰를 해석한 후 JstlView를 통해 해당 jsp에게 Model을 넘겨주고 작업을 처리한다.
forward를 수행하는 경우를 살펴보자.
컨트롤러가 포워드를 반환하면 디스패처 서블릿이 InternalResourceView에게 반환 결과를 전달한다.
InternalResourceView는 DispatcherServlet에게 어떤 메서드를 호출해야 하는지 알려준다.
작업은 내부적으로 처리된다.
사용자가 로그인을 요청하면 로그인 정보를 올바르게 입력했는지 검사한다.
이후 정보가 맞게 입력됐다면 로그인 완료 페이지로 포워드하고, 유효하지 않은 정보라면 오류 페이지로 포워드한다.
사용자가 로그아웃을 요청하면 서버는 사용자의 세션을 종료하고 로그인 페이지로 리다이렉트한다.
이 경우는 URL이 변하기에 포워드 대신 리다이렉트를 사용한다.
서버가 URL을 어떻게 처리하는지에 따라 포워드와 리다이렉트가 결정된다.
'Spring > Spring' 카테고리의 다른 글
[Spring Basic] 파라미터의 변환과 검증 (0) | 2022.06.24 |
---|---|
[Spring Basic] DispatcherServlet (0) | 2022.06.23 |
[Spring Basic] 서블릿과 JSP (0) | 2022.05.05 |
[Spring Basic] 서블릿과 출력 (0) | 2022.04.13 |
[Spring Basic] Java Reflection API (0) | 2022.04.13 |
댓글
이 글 공유하기
다른 글
-
[Spring Basic] 파라미터의 변환과 검증
[Spring Basic] 파라미터의 변환과 검증
2022.06.24 -
[Spring Basic] DispatcherServlet
[Spring Basic] DispatcherServlet
2022.06.23 -
[Spring Basic] 서블릿과 JSP
[Spring Basic] 서블릿과 JSP
2022.05.05 -
[Spring Basic] 서블릿과 출력
[Spring Basic] 서블릿과 출력
2022.04.13