Web

Ch11. MVC 1 : 리다이렉트

tose33 2022. 7. 14. 21:21

리다이렉트 (redirect:) 

RegisterController.java 

	@PostMapping("/register/step2")
	public String handleStep2(HttpServletRequest request)
	{
		// agree 파라미터의 value 
		String agreeParam = request.getParameter("agree");
		if(agreeParam == null || !agreeParam.equals("true"))
		{
			return "register/step1"; // 약s관 동의 다시 보여줌 
		}
		// 약관 동의했다면 입력 폼 보여주도록 register/step2를 뷰 이름으로 리턴 
		return "register/step2";
	}

 

위의 RegisterController.java의 handlerStep2() 메소드는 @PostMapping에 의해 POST 방식만을 처리한다.

웹 브라우저에 직접 주소를 입력하는 것은 GET 방식이므로, "http://localhost:8080/sp5-chap11/register/step2"를 직접 입력한다면 404 에러 화면이 나온다. 

 

이럴때는 에러화면 대신 다른 페이지로 이동하도록 하는 리다이렉트를 사용하면 좋다. 

예를들어 위에서 step2 주소를 받았을때 step1으로 이동하도록 하는 것이다.

 

 

@RequestMapping, @GetMapping, @PostMapping 등 요청 매핑 관련 애노테이션을 적용한 메서드가 "redirect:" 로 시작하는 경로를 리턴하면, 나머지 경로를 이용해서 리다이렉트할 경로를 구한다. 

 

이때 나머지 경로의 시작이 "/" 이면 웹 어플리케이션을 기준으로 이동 경로를 생성한다. 

예를들어 아래 메소드는 "/register/step2" 경로를 GET 방식으로 접근할때 (주소창에 직접입력할때) 약관 동의 화면인 step1 으로 리다이렉트시키는 메소드다. 

	@GetMapping("/register/step2")
	public String handleStep2Get() 
	{
		return "redirect:/register/step1";
	}

 

위 메소드에서 리턴하는 문자열은 "redirect:/register/step1" 인데 "redirect:" 다음에 오는 문자가 '/' 이므로, 실제 리다이렉트하는 경로는 웹 어플리케이션 경로인 "/sp5-chap11" 과 "/register/step1"을 연결한 "/sp5-chap11/register/step1" 이다. 

 

만약 나머지 경로가 "/"로 시작하지 않으면 현재 경로 기준 상대경로를 사용한다.

예를들어 "redirect:step1" 문자열을 리턴했다면, 현재 경로가 "~/register/step2" 이므로 "~/register/step1" 이 실제 리다이렉트 경로다. 

 

그냥 완전한 경로를 리턴할수도 있다. 

그렇게 되면 그냥 그 경로로 리다이렉트 된다. 

 

 

 

출처 : 스프링5 프로그래밍 입문 (최범균 저)