<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 페이지로 리다이렉션시키고자 한다.
localhost:8080/login URL에서 name과 password를 입력하지 않고 첫 페이지에서 새로고침만 하면, 개발자도구 관찰결과 GET메서드가 뜬다.
하지만, name과 password를 입력하고 submit을 누르고 나면, 개발자도구 - 네트워크 - Doc 창에서 네트워크 헤더를 보면 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를 렌더링하면 좋겠다.
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을 썼다.
@Controller
public class LoginController {
@GetMapping("/login")
public String gotoLoginPage() {
return "login";
}
@PostMapping("/login")
public String gotoWelcomePage() {
return "welcome";
}
}
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/