[Spring] 컨트롤러 코드에서 @GetMapping, @PostMapping으로 리다이렉션 수행하기

민지·2024년 1월 22일
0
post-custom-banner

POST request method로 만든 login 양식

<html>
	<head>
		<title>login page</title>
	</head>
	<body>
		Welcome to the login page!
		<form method = "post">
			Name : <input type = "text" name = "name"> <br>
			Password : <input type = "password" name = "password"> <br> 
			<input type = "submit">
		</form>
	</body>
</html>

GET request method를 사용하면, 내가 입력한 값이 쿼리파라미터의 일부로써 URL에 전부 보이기에, 웹사이트에 전송하는 모든 보안저보들은 안전하게 POST 메서드를 사용했다.

앞서 만든 로그인 양식에서는 name과 password를 입력 후 submit을 누르면, 다시 로그인 양식으로 돌아온다.. 하지만, 사용자가 submit 버튼을 누르면, 사용자를 welcome.jsp 페이지로 리다이렉션시키고자 한다.

/login 페이지 -> /welcome 페이지

문제 발견 : /login에서 @RequestMapping으로 GET메서드와 POST메서드 모두를 처리하고 있다.

관찰결과 1 : /login에서 "submit을 누르기 전후," 네트워크 헤더의 메서드가 다르다.

localhost:8080/login URL에서 name과 password를 입력하지 않고 첫 페이지에서 새로고침만 하면, 개발자도구 관찰결과 GET메서드가 뜬다.

하지만, name과 password를 입력하고 submit을 누르고 나면, 개발자도구 - 네트워크 - Doc 창에서 네트워크 헤더를 보면 POST 메서드가 뜬 것을 확인할 수 있다.

관찰결과 2 : LoginController에서 @RequestMapping을 통해 GET메서드와 POST메서드 모두를 처리하고 있다.

@Controller
public class LoginController {

	@RequestMapping("/login")
	public String gotoLoginPage() {
		return "login";
	}
}

LoginController에서 @RequestMapping으로 /login URL관련 request가 들어오면, 어떤 메서드든지 전부 "login" 뷰 이름을 리턴해, login.jsp로 리다이렉션하는 것을 확인할 수 있었다.

하고 싶은 것

사용자가 submit 버튼을 누르기 "전"에는 gotoLoginPage()메서드를 통해 뷰 이름인 "login"을 리턴해 login.jsp를 렌더링하게끔 하고, (login.jsp에는 name과 password를 입력하는 form태그로 이루어져 있다.)

사용자가 name, password 입력하고 submit 버튼을 누르고 난 "후"에는, 새로 만든 gotoWelcomePage()메서드가 "welcome" 뷰 이름을 리턴해, welcome.jsp를 렌더링하면 좋겠다.

방법 1 : @RequestMapping의 메서드를 사용하자

RequestMethod의 경우, GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE 등 8가지가 있다. 보통의 경우에는 @RequestMapping 어노테이션에 아래와 같이 method를 사용할 수 있다.

@RequestMapping(method = RequestMethod.GET, value = "/hello")

위 코드는 /hello URL 중 + GET 메서드에 해당되는 경우에만, 해당 메서드를 실행하겠다는 의미이다.

이를 LoginController에 적용시키면 다음과 같다.

@Controller
public class LoginController {

	@RequestMapping(method = "RequestMethod.GET, value = "/login")
	public String gotoLoginPage() {
		return "login";
	}
    
    @RequestMapping(method = "RequestMethod.POST, value = "/login")
	public String gotoWelcomePage() {
		return "welcome";
	}
}

근데 너무 길고 복잡하니, 똑같은 기능을 하되 어노테이션의 이름은 다른 @GetMapping@PostMapping을 썼다.

방법 2 : @RequestMapping 대신, @GetMapping, @PostMapping로 차이를 두어 처리하자

@Controller
public class LoginController {

	@GetMapping("/login")
	public String gotoLoginPage() {
		return "login";
	}
    
    @PostMapping("/login")
	public String gotoWelcomePage() {
		return "welcome";
	}
}

실행결과

1. submit을 누르기 전

  • localhost:8080/login 에서의 초기상황 : GET 메서드 사용
  • /login URL에서 GET 메서드를 사용하는 경우 -> @GetMapping 어노테이션이 설정된 gotoLoginPage()메서드 실행
    - gotoLoginPage() -> login view -> login.jsp -> 해당 뷰가 화면에 렌더링된다.

2. submit을 누른 후!

  • localhost:8080/login 에서의 상황 : POST 메서드 사용
  • /login URL에서 POST 메서드를 사용하는 경우 -> @PostMapping 어노테이션이 설정된 gotoWelcomePage()메서드 실행
    - gotoWelcomePage() -> welcome view -> welcome.jsp -> 해당 뷰가 화면에 렌더링된다.

마치며.. - 컨트롤러 코드에서의 리다이렉션

Http redirection이란 무엇일까.
redirect == re(다시) + direct(지시히다)를 뜻한다. 쉽게 말해, 서버가 브라우저에게 다른 url로 request를 보내라고 지시하는 것이다.
예를 들어, 웹 브라우저가 웹 서버에 /login URL request를 보냈다고 하자. 그러면 서버는 Http response 메세지를 통해, 웹 브라우저에게 /welcome같은 다른 URL(길, 방향)을 request하라고 지시하는 것이다.
다시 말해, 리다이렉션이란, 클라이언트가 서버에게 보낸 HTTP request에서 URL을 변경하는 프로세스를 말한다. 즉, 요청한 페이지를 다른 URL로 바꾸는 행동이다.

해당 포스팅에서는 리다이렉션을 어떻게 하는지에 대해 정리해보았다.
/login에서 사용자가 name과 password를 입력 후 submit을 눌렀을 때 welcome.jsp로, submit 전에는 login.jsp로 페이지가 이동하게끔 했다.

특히 LoginController에서 다음과 같은 2가지 방법을 통해,
1. return하는 뷰 이름 달리 하기
2. GET, POST 메서드에 따라 다른 메서드를 만들어 처리하기
viewResolver에서 렌더링할 뷰를 달리할 수 있었다!

// 리다이렉션 기능을 수행하는 부분만 보기 쉽게 정리했다.
@Controller
LoginController(){
	@RequestMapping(method = RequestMethod.GET, value = "/login")
	public String gotoLoginPage() {
		return "login";
	}

	@RequestMapping(method = RequestMethod.POST, value = "/login")
	public String gotoWelcomePage() {
			return "welcome";

	}
}

이 시리즈는 Udemy 강의의 내용을 정리한 것입니다.
https://www.udemy.com/course/spring-boot-and-spring-framework-korean/

profile
배운 내용을 바로바로 기록하자!
post-custom-banner

0개의 댓글