리다이렉트는 브라우저의 요청을 받고나서 서버가 다른 뷰( URI )를 리다이렉트하라고 브라우저에게 응답해 브라우저가 다른뷰를 요청하는것을 말한다.
리다이렉트는 페이지 전환의 주체가 브라우저가 된다.
리다이렉트가 되면 브라우저는 새로운 요청을 하게 되므로 요청 URI 도 변경된다
예를들어 리다이렉트는 로그인을 했을때 다시 메인을 요청하라고 브라우저에게 명령하는 경우에 사용된다.
이와 비슷하지만 페이지 전환의 주체가 서버인것을 포워드라고 한다.
포워드는 서버 내부적으로 포워딩이 되므로 요청 URI 는 변경되지 않는다.
JSP 에서는 reponse.sendRedirect("이동할페이지")
를 이용하지만
스프링에서는 return "redirect:/이동할페이지"
를 이용한다
( 이동할페이지 요청 -> 만들어 높은 @GetMapping 주소 )
리다이렉트는 이미 만들어 놓은 매핑 모듈( 페이지 )을 재사용하게 된다
로그인 매핑을 해보자
// 유저 ( 모델 )
@Getter
@Setter
public class User {
private Integer id;
private String username;
private String password;
private String email;
private LocalDateTime createdAt; // 시간타입
}
@Controller
public class BoardController {
@GetMapping("/main")
public String getmain(){
return "main";
}
@PostMapping("/main")
public String postmain(){
return "main";
}
}
@Controller
public class UserController {
@GetMapping("/loginForm")
public String loginForm(){
return "user/loginForm";
}
@GetMapping("/joinForm")
public String joinForm(){
return "user/joinForm";
}
@PostMapping("/login")
public String login(String username, String password,
HttpServletRequest request){
// DB 연결은 생략
// String sql = "select * from user where username=? and password=?";
// stub ( 예상 ) 임의로 데이터 넣어줌
User user = new User();
user.setId(1);
user.setUsername(username);
user.setPassword(password);
user.setCreatedAt(LocalDateTime.now());
// 조회후에 검증을 한번 해야한다
if(user == null){
return "redirect:/loginForm";
}else{
return "redirect:/main";
}
HttpSession session = request.getSession();
session.setAttribute("user", user); // 여기서 두번째 user 는 유저 객체 (위의 변수)
System.out.println("로그인실행됨" );
System.out.println("username : "+ username);
System.out.println("password : "+ password);
// return "redirect:/main";
}
@PostMapping("/join")
public String join(String username, String password, String email){
// ( 생략된 내용 ) db연결 - insert문 실행 - main/로그인페이지로 복귀 ( 생략 )
// String sql = "insert into user(username, password, email) valuse(?,?,?)"
System.out.println("회원가입됨");
System.out.println(username);
System.out.println(password);
System.out.println(email);
return "redirect:/loginForm"; // 이미 만들어진 loginForm 재사용
}
}
아래는 jsp - 내용 생략하고 구조만 확인
<form action="loginForm" method="get">
@GetMapping("/loginForm") 과 연결
<form action="joinForm" method="get">
@GetMapping("/joinForm") 과 연결
<form action="main" method="get">
@GetMapping("/main") 과 연결
<form action="login" method="post">
@PostMapping("/login") 과 연결 -> main.jsp 로 리다이렉트 !
<a href="joinForm">
@GetMapping("/joinForm") 과 연결
회원가입 페이지도 마찬가지로 매핑하면됨
각 버튼을 누르면 페이지로 이동함
jsp 페이지의 html 내용에 EL을 사용해서 ${user.username}
를 넣어주면 user
가
session.setAttribute("user", user)
의 "user"
와 연결되어 html안에 username이 출력됨
세션에 저장된 데이터는 서버의 메모리에 저장되어 서버의 부하를 줄 수 있다.
모델과 세션의 차이는 라이프사이클로 모델은 '요청-응답 사이클' 종료 시 제거되고
세션은 세션이 만료되거나 종료될 때까지 유지된다.
세션이나 모델로 반환된 오브젝트의 속성에 접근하기 위해서 스프링부트에서는 .
을 이용한다.
( 다른 언어에서 프로퍼티에 접근하는것과 유사함 )
표현언어( EL ) 를 사용하려면 세션이나 모델객체에 속성:값을 저장해야한다.