일단 redirect와 forward은 JSP 기능이 아니다.
이 말을 왜 하냐면 JSP 기능이 아닌데 검색하면 JSP 기능인 것처럼 수식어가 달린 글이 너무 많기 때문이다.
HttpServletRequest 방식이 JSP에서 가장 많이 쓰는 객체지만 Servlet 객체일 뿐 JSP 기능이 아니다.
방식은 Spring 방식, Servlet 방식 2가지로 나뉜다.
사용 방법
2가지 방식 모두 기능은 동일하게 작용한다.
Spring MVC
return "redirect:/";
return "forward:/";
Servlet
response.sendRedirect("/"); //redirect
request.getRequestDispatcher("/").forward(request, response); //forward
redirect 특징
View → Interceptor → Controller(내부에 redirect 실행) → View → Interceptor → Controller(redirect 링크 호출)
Interceptor 2번 호출
redirect를 시키면 View로 다시 돌아갔다가 다시 호출을 하는 방식처럼 작동하기 때문에 Interceptor를 2번 호출하게 된다. '처럼'이라는 것은 실제로는 View로 가지않기 때문이다. redirect 링크는 존재하고 두번째 view를 가리키는 링크는 존재하지 않는다.
마지막 호출된 링크로 URL 링크 표시
클라이언트 영역인 View 영역에서 페이지 이동이 2번 일어난다는 것을 인지하고 있으며 결과적으로 마지막 View에서 호출된 redirect 링크로 경로가 바뀐다.
request, response 객체 값 유실
첫번째 호출한 Controller에서 request.setAttribute로 값을 넘기게 된다면 두번째 View에서 Controller로 값을 넘기지 않아 값이 중간에서 유실된다.
redirect를 쓰더라도 값을 넘기는 방법이 있는데 RedirectAttributes 객체를 가져와서 넘기는 방법이다.
public String test(HttpServletRequest request, RedirectAttributes ra){
ra.addAttribute("param", param);
ra.addFlashAttribute("param", param);
}
addAttribute는 링크에 담겨져서 보내진다.
addFlashAttribute는 링크에 담지 않고 1회만 사용하고 소멸한다는 특징이 있어 보안에 더 강하다.
forward 특징
View → Interceptor → Controller(내부에 forward 실행) → Controller(forward 링크 호출)
interceptor 1번 호출
forward는 redirect와는 달리 바로 다른 Controller를 호출하기 때문에 결과적으로 Interceptor를 한번만 거친다.
최초 호출된 링크로 URL 링크 표시
forward를 쓴다면 클라이언트 영역인 View 영역에서는 서버에서 Controller를 2번이나 탔다는 것을 알 길이 없다. 그렇기 때문에 최초 호출된 링크로 URL이 표시된다.
request, response 객체 값 보존
redirect와는 다르게 forward 시킨 경로의 controller 메소드를 바로 들어가기 때문에 attribute 값은 보존된다.
넘기는 방식은 아래 두가지 방법 다 사용가능하다.
model.addAttribute("key", value);
request.setAttribute("key", value);
이런 기능들을 대표적으로 언제 쓰는지 대표적 케이스 1개씩만 소개해보려고 한다.
redirect의 실무 활용
redirect는 과거에 사용했었던 더 이상 쓰지 않는 홈페이지 링크로 진입 시 리뉴얼된 사이트로 redirect를 해줄 때 가장 대표적으로 많이 사용한다. redirect를 하면 마지막 호출된 링크인 리뉴얼된 사이트의 링크로 바뀌기 때문에 사용자가 클릭한 이전 홈페이지 링크가 표시되지 않기 때문에 이런 경우가 redirect의 가장 적절한 예시다.
forward의 실무 활용
forward는 로그인이 필요한 화면을 들어갔을 때 사용하기 적절하다.
특정 페이지 진입 시 로그인이 필요하다면 로그인 페이지로 forward를 시키는 방식으로 이용한다.
로그인 페이지로 이동 시킬 시 굳이 Interceptor를 2번 탈 이유도 없을 뿐더러 더불어 View 화면에서는 최초 호출 링크를 보여주기 때문에 사용자가 어떤 페이지를 진입하려했는지 그대로 남아있다. 그로인해 별다른 개발없이 사용자에게 로그인 후 보여줄 페이지에 대한 적절한 정보 제공이 가능하다.
'🍃 Spring' 카테고리의 다른 글
gradle build bootJar 차이 (0) | 2022.09.23 |
---|---|
@PostConstruct와 bean 생명주기 (0) | 2022.09.19 |
Spring과 Spring Boot의 예외 처리와 에러 페이지 처리 방식 (1) | 2022.07.30 |
Spring Boot에서 파일 저장을 위한 상대경로 getRealPath() 사용 금지 (0) | 2022.06.14 |
Spring Boot application Property와 yml 작성 방법 (0) | 2021.04.30 |