티스토리 뷰

DEV/Java

Spring MVC의 Redirect와 Forward

berom 2023. 5. 19. 21:28

Spring MVC의 Redirect와 Forward

웹 애플리케이션 개발에서는 한 웹 페이지에서 다른 웹 페이지로 네비게이션해야 하는 상황이 발생합니다.
Spring MVC에서는 이를 리다이렉트와 포워딩을 통해 구현할 수 있습니다.

Redirect


리다이렉트는 두 번의 요청과 두 번의 응답을 포함합니다. 리다이렉트가 발생하면 다음과 같은 과정을 거칩니다

  1. 클라이언트가 서버에 요청을 보냅니다.
  2. 서버는 클라이언트에게 응답을 보내 다른 URL로 새로운 요청을 보내도록 알립니다.
  3. 클라이언트는 지정된 URL로 새로운 요청을 보냅니다.
  4. 서버는 새 URL로부터 클라이언트에게 응답을 보냅니다.

리다이렉트는 클라이언트에서 서버로의 두 번의 왕복을 포함하기 때문에 포워드보다 느립니다.

Forward


리다이렉트와 달리 포워드는 서버 측에서 수행되며 클라이언트는 이를 인지하지 못합니다. 다음과 같은 과정을 거칩니다

  1. 클라이언트가 서버에 요청을 보냅니다.
  2. 서버는 요청을 내부적으로 다른 리소스로 전달합니다.
  3. 다른 리소스는 클라이언트에게 응답을 보냅니다.

포워딩은 서버 내부에서 발생하기 때문에 리다이렉트보다 빠릅니다.
또한, 클라이언트는 다른 리소스와 상호 작용하고 있다는 사실을 알지 못합니다.

Spring에서의 처리

Spring MVC에서 InternalResourceViewResolver는 뷰 이름을 뷰 인스턴스로 해석합니다.
컨트롤러가 뷰 이름을 반환하면 DispatcherServlet은 이 이름을 실제 뷰로 해석하기 위해 InternalResourceViewResolver를 참조합니다.

@Bean
public ViewResolver viewResolver() {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/views/");
    resolver.setSuffix(".jsp");
    return resolver;
}

ViewResolver에서 정의된 접두사와 접미사는 컨트롤러가 반환하는 뷰 이름에 추가됩니다.

Forward 예시

@GetMapping("/example")
public String handleExample() {
    // 처리...
    return "forward:/anotherExample";
}

"/example"에 접근하면 Spring MVC는 서버 내부에서 요청을 "/anotherExample"로 포워드합니다.
이는 서버 측에서 이루어지며 클라이언트에게는 투명합니다.

Redirect 예

@GetMapping("/example")
public String handleExample() {
    // 처리...
    return "redirect:/anotherExample";
}

"/example"에 접근하면, Spring MVC는 클라이언트를 "/anotherExample"로 리다이렉트합니다.
클라이언트는 이를 알고 "/anotherExample"로 새로운 요청을 보냅니다.

부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>

728x90