세션 : 사용자와 연결 지속
인터셉터 : 가로채기
쿠키 : http프로토콜 요청에 대해 응답이 일회성이 므로 이를 연결 시켜줌
사용자 인증을 위해 로그인을 합니다. 이 로그인을 지속시키기 위해 세션과 쿠키를 이용하고 인터셉터를 통해 로그인이 되어있지 않으면 연결 시켜주지 않고 로그인 되어져있으면 해당 요청을 수행합니다. 이때 로그인 유지는 세션을 통해 구현하고 쿠키를 이용해 확인할 수 있습니다.
로그인 수행
먼저 로그인 요청을 수행할 컨트롤러를 작성합니다. 이때 Get일 경우 로그인 폼페이지를 보여주고 Post일 경우 로그인 성공 페이지를 보여줍니다. Post방식의 처리 메소드에는 커맨드 객체와 Error객체를 사용하여 Validator 검증을 수행하여 발생한 에러에 대해서 Error객체에 넣습니다. 에러가 발생함에 따른 처리를 수행하고 서비스 객체를 호출하여 DB관련 서비스를 수행하는데 해당 서비스 객체는 DI를 통해 주입받습니다. 그 다음 로그인 폼페이지와 로그인성공시 보여주는 뷰페이지를 작성합니다. 커맨드 객체는 프로퍼티를 담는 객체이며 검증 객체는 사용자가 직접 정의하는 방식과 공장 객체를 이용하는 방식이 있습니다. supports() 메소드를 이용해 해당 커맨드 객체를 검증할 수 있는지 확인하고 validator()메소드를 이용해 검증을 수행합니다. 이때 매개변수로 커맨드객체와 Error객체를 사용하여 발생한 에러에 대해 Error객체에 넣습니다.
서비스 객체는 올바른 login인지 확인하는 객체이므로 MemberDao를 사용하여 올바른 객체이면 로그인과 관련된 객체를 리턴하고 실패할 경우 exception이 발생하게 됩니다. 사소한 exception의 경우 객체 내부에서 try-catch로 처리하지만 많을 경우 상위 컨트롤러로 throw하여 알립니다. 모든 DB접근 메소드는 트랜잭션 처리 대상입니다. 또한 MemberDao는 DI를 통해 주입받습니다. 각 컨트롤러들은 Bean컨테이너에 등록이 되어져있어야합니다.
로그인유지를 위한 세션 사용
로그인 유지를 위해 세션을 사용하며 두가지 방식이 있습니다. 요청 매핑 어노테이션 적용 메소드에 HttpSession파라미터를 추가하는 방식인데 이방식은 항상 Session이 존재하게 됩니다. 두번째 방법은 요청 매핑 어노테이션 적용 메소드에 HttpServletRequest파라미터를 추가하고 메소드 내부에 Session을 구하는 방식이고 이방식은 필요한 시점에 세션을 생성할 수 있습니다. 세션을 생성한 후 로그인 관련 객체를 세션에 등록해 줍니다.
비밀번호 변경 수행
비밀번호 변경의 경우에는 비밀번호 변경 컨트롤러를 작성합니다. Get일 경우 비밀번호 변경 폼페이지를 보여주고 Post일 경우 변경 성공 페이지를 보여줍니다. Post 방식의 처리 메소드에서는 커맨드객체와 Error, HttpSession을 매개변수로 주며 검증을 수행 후 에러가 발생할 경우 에러객체에 담고 해당 에러에 대해 처리를 합니다. 해당 컨트롤러에서는 세션에 등록되어진 내용에서 email을 가져오고 해당 email에 대해서 비밀번호를 변경합니다. 이때 서버가 재시작하고 로그인을 다시 하지 않으면 세션이 없는 상태이기 때문에 NullPointerException이 발생하게 됩니다. 그런다음 비밀번호 변경 뷰페이지와 비밀번호 변경 성공 페이지를 작성합니다. 로그인때와 마찬가지로 프로퍼티를 담는 커맨드객체와 이를 검증하는 validator객체를 생성합니다. 마찬가지로 컨트롤러 객체는 Bean 컨테이너에 등록이 되어있어야합니다.
로그인 확인을 위한 인터셉터 사용
filter-servlet 과 같이 intercepter-controller 를 사용하여 컨트롤러 실행 이전 혹은 실행 이후 반복 작업을 처리할 수 있습니다.
HandlerIntercepter 인터페이스를 구현하여 인터셉터를 구현합니다.
HandlerIntercepter 인터페이스에는 3가지 디폴트 메소드가 정의되어져 있습니다.
디폴트 메소드 이므로 모두 구현할 필요가 없습니다.
preHandle()메소드는 컨트롤러 객체를 실행하기 전 필요한 기능을 구현합니다.
preHandle()메소드가 false를 리턴한 경우 컨트롤러를 실행하지 않습니다.
postHandle()메소드는 컨트롤러가 정상적으로 실행된 이후에 추가 기능을 구현합니다.
컨트롤러 실행 도중 익셉션이 발생한 경우 실행되지 않습니다.
afterCompletion()메소드는 뷰가 클라이언트에 응답을 전송한 뒤에 실행 됩니다.
컨트롤러 실행도중 익셉션이 발생하면 이 메소드의 4번째 파라미터로 전송되며 익섹셥이 발생하지 않을 경우 null이 전송됩니다.
보통 익셉션을 로그로 남기거나 실행 시간을 기록할 때 사용합니다.
인터셉터를 구현한 클래스를 WebMvcConfigurer의 addInterceptors 메소드를 이용해 설정합니다.
매개변수인 InterceptorResgistry의 addInterceptor()메소드를 이용하여 인텁세터를 구현한 클래스를 지정하고 addPathPatterns()메소드를 이용해 인터셉터를 적용할 경로 패턴을 Ant 경로 패턴을 사용하여 지정합니다.
아이디 기억을 위한 쿠키 사용
쿠키는 Http의 요청과 응답은 일회성이므로 쿠키를 이용해 서버에서 클라이언트로 전송하여 클라이언트에서 기억하고 있다가 다음 요청시 해당 쿠키 내용을 전송하여 연결할 때 사용합니다.
로그인 폼 페이지에 이메일 기억하기 check박스를 생성하고 체크가 되어져 있으면 로그인 컨트롤러에서 로그인 폼페이지를 보여주는 요청 매핑 메소드에서 매개변수로 커맨드객체와 쿠키를 줍니다. @CookieValue어노테이션을 쿠키 매개변수에 주고 어노테이션 설정으로 value와 required를 주는데 value로 설정한 쿠키를 전달 받고 required로 필수 여부를 지정합니다. 필수가 true인 상태에서 해당하는 쿠키가 존재하지 않을 경우 익셉션이 발생됩니다. 쿠키가 존재할 경우 폼에 전달할 커맨드 객체에 쿠키 값을 전달하여 email 프로퍼티를 설정합니다. 로그인 성공 페이지를 보여주는 요청 매핑 메소드에서는 로그인 성공 후 체크박스의 값에 따라 쿠키를 생성하여 전송합니다.
'학습(구) > Spring 요약' 카테고리의 다른 글
간단한 웹 어플리케이션 구조 (0) | 2020.11.29 |
---|---|
날짜 값 변환, @PathVariable, 익셉션 처리 (0) | 2020.11.29 |
Spring - 검증 객체와 에러코드 (0) | 2020.10.20 |
Spring - 메시지 처리 (0) | 2020.10.20 |
Spring - 커맨드 객체 (0) | 2020.10.19 |