[Spring] 로그인 매핑 - 리다이렉트

merci·2023년 1월 12일
1

Spring

목록 보기
2/21

Redirect

  • 리다이렉트는 브라우저의 요청을 받고나서 서버가 다른 뷰( 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 ) 를 사용하려면 세션이나 모델객체에 속성:값을 저장해야한다.






profile
작은것부터

0개의 댓글