날아라쩡글이의 블로그입니다.

Session어노테이션 & SessionUtils로 객체 담기 본문

중앙 HTA (2106기) story/spring java framwork story

Session어노테이션 & SessionUtils로 객체 담기

날아라쩡글이 2022. 1. 5. 10:36
728x90
반응형

Mybatis가 제공하는 타입 명칭

int , string, long, double, date
map : map은 인터페이스여서 객체생성이 불가능하다, parameterType에서 사용가능하다. 그릇으로 사용가능하지만 resultType에서는 사용불가능하다.
hashMap : resultType에서 사용가능하다. 주로 ResultType에서만 사용한다.
bigdecimal    java.math.BigDecimal

객체의 프라퍼티는 map의 key와 동일하게 사용한다. 
사용자 번호로 검색
 * Map<String, Object> map = new HashMap<>();
 * map.put("no",100);
 * User user = userDao.getUser(map);
 * 
 * 사용자 아이디로 검색 
 * Map<String, Object> map = new HashMap<>();
 * map.put("id","hong");
 *  User user = userDao.getUser(map);
 * 
 * Map<String, Object> map = new HashMap<>();
 * map.put("email","hong@gmail.com");
 *  User user = userDao.getUser(map);
 *  
 *  이렇게 map을 이용해서 사용할 수 는 있지만, 애매모호하게 key가 무엇인지 생각하게 만들기 때문에 유지보수하기 어렵다. 자유도가 높은만큼 주석으로 알 수 있게 적어야한다. 명확하지 않으면 사용하기 어렵다. 

@Controller

  • 클라이언트의 HTTP 요청을 처리하는 요청핸들러 메소드를 포함하고 있는 컨트롤러의 클래스임을 나타낸다. 
  • 스프링은 컨트롤러에서 정의된 @RequestMapping, @GetMapping, @PostMapping 어노테이션 정보를 분석해서  요청 URL과 요청핸들러 메소드를 매핑시킨다. 
  • 클라이언트의 요청이 접수되면 요청 URL을 분석해서 매핑된 요펑핸들러 메소드를 실행시킨다. 

@SessionAttributes 

  • @SessionAttributes(names ={"LOGIN_USER"})   인증된 사용자의 정보를 세션에 담는다.
  • public String login(String id, String password, Model model) {
    //아이디와 비밀번호가 비어있거나 공백만 있으면 loginform.jsp로 내부이동
    if(!StringUtils.hasText(id) || !StringUtils.hasText(password)) {
    model.addAttribute("error", "아이디와 비밀번호는 필수입력값입니다.");
    return "loginform.jsp";//재요청을 하게 만든다. 
    }
    try {
    //UserService의 사용자 인증 서비스를 호출
    User user = userService.login(id, password);
    //인증된 사용자 정보를 Model에 저장
    @SessionAttributes(name ={"LOGIN_USER"}) 설정은 모델에 "LOGIN_USER" 라는 이름으로 저장되는 객체를 
    //HttpSession객체에 저장시킨다. 즉, 인증된 사용자 정보가 HttpSession객체에 저장된 것이다. 
    //model.addAttribute("LOGIN_USER", user);
     //request객체에 전달하면 응답에 가면 사라진다. session에 담아야하는데?! 
    //@SessionAttributes()어노테이션을 이용한다.
    } catch (RuntimeException e ) {
    //사용자 인증과정에서 예외가 발생하면 loginform.jsp로 내부이동
    //model에 error로 runtimeException에 해당하는 메세지를 보낸다. 
    model.addAttribute("error", e.getMessage());
    return "loginform.jsp";
    }
    return "redirect:home.do";
    }
  • Service에서 Exception throw하는 방법
    • @Autowired
      private UserDao userDao;

      public User login(String id, String password) {
      User user = userDao.getUserById(id);
      if(user == null) {
      throw new RuntimeException("회원정보가 존재하지 않습니다. ");
      } if("Y".equals(user.getDisabled())) {
      throw new RuntimeException("탈퇴처리가 완료된 회원입니다. ");
      } if(!user.getPassword().equals(password)) {
      throw new RuntimeException("회원정보의 비밀번호가 틀렸습니다. ");
      }
      //인증된 사용자정보를 반환
      return user;
      }
  • 어노테이션 @SessionAttributes를 진행하게 되면 로그아웃하는 방법
    • SessionStatus
    • @SessionAttributes로 HttpSession객체에 저장된 객체를 삭제한다. 
    • 동일한 컨트롤러 안에서  @SessionAttributes로 저장한 것만 삭제된다.
    •  SessionStatus의 setComplete()메소드는 동일한 컨트롤러 안에서 @SessionAttributes 어노테이션 설정으로 
        HttpSession에 저장된 속성을 삭제한다. 
    • @GetMapping("/logout.do")
      public String logout(SessionStatus sessionStatus) {
      sessionStatus.setComplete();
      //Http를 직접조작하지 않고, setComplete를 사용하면 로그아웃이 된다. 
      return "redirect:home.do";
      }
  • Controller에 HttpServlet을 매개변수로 쓸수 있지만, Servlet외에도 파라미터와 속성을 꺼내고싶을 때 사용하는 객체가 존재한다. RequestContextHolder로 요청객체를 담고, getRequestAttribute로 조회할 권한을 받고, 다양한 속성정보를 setAttribute을 사용해서 담을 수 있다.
  • 그런 Utils클래스를 사용하면 인증된 사용자정보를 HttpSession에 담고, 메소드를 삭제하고 등록할 수 있다. 
  • 실제로 프로젝트에서 더 사용하는 방법이다. 
    • HttpSession객체에 속성을 저장, 삭제, 조회하는 기능을 제공하는 유틸클래스를 정의한다.
    • SessionUtils로 class name을 정의 하고, 
    • public static void addAttribute(String name, Object value) {
      RequestContextHolder.getRequestAttributes().setAttribute(name, value, RequestAttributes.SCOPE_SESSION);
      }
      속성명, 속성(객체)를 전달받아서 HttpSession객체에 저장한다. 
    • public static void removeAttribute(String name) {
      RequestContextHolder.getRequestAttributes().removeAttribute(name,RequestAttributes.SCOPE_SESSION);
      }
      속성명을 전달받아서 HttpSession객체에 해당 속성명으로 저장된 속성(객체)을 삭제한다.
    • public static Object getAttribute(String name) {
      return RequestContextHolder.getRequestAttributes().getAttribute(name, RequestAttributes.SCOPE_SESSION);
      }
       속성명을 전달받아서 HttpSession객체에 해당 속성명으로 저장된 속성(객체)을 반환한다. 
  • RequestContextHolder
    • 스프링에서 제공하는 유틸클래스다. 
    • 요청객체와 세션객체의 속성에 접근할 수 있는 기능을 제공한다. 
    • RequestContextHolder.getRequestAttributes()는 RequestAttributes 객체를 반환한다. 
    • RequestAttributes가 제공하는 
      • setAttribute(name, value, scope))
      • removeAttribute(name, scope)
      • getAttribute(name, scope)
      • 메소드를 활용하면 요청객체 혹은 세션객체에 속성을 추가, 삭제, 조회할 수 있다. 
    • 메소드의 scope자리에 RequestAttributes.SCOPE_REQUEST, RequestAttributes.SCOPE_SESSION를 지정해서 요청객체/ 세션객체를 구분해서 속성을 관리할 수 있다. 
    • RequestContextHolder 스프링에서 제공해주는 유틸리티로 클라이언트가 보낸 메세지를 꺼내려면 httpServlet을 사용해야하지만, jsp와 Controller에서만 꺼낼 수 있기 때문에 사용할 수 있는 유틸리티 객체를 사용하는 것이다. 
  • 로그인 방법
    • @PostMapping("/login.do")
      public String login(String id, String password, Model model) {
      //아이디와 비밀번호가 비어있거나 공백만 있으면 loginform.jsp로 내부이동
      if(!StringUtils.hasText(id) || !StringUtils.hasText(password)) {
      model.addAttribute("error", "아이디와 비밀번호는 필수입력값입니다.");
      return "loginform.jsp";//재요청을 하게 만든다. 
      }
      try {
      //UserService의 사용자 인증 서비스를 호출
      User user = userService.login(id, password);
      SessionUtils.addAttribute("LOGIN_USER", user);
      } catch (RuntimeException e ) {
      //사용자 인증과정에서 예외가 발생하면 loginform.jsp로 내부이동
      model.addAttribute("error", e.getMessage());
      return "loginform.jsp";
      }
      return "redirect:home.do";
    • 로그아웃방법
      • @GetMapping("/logout.do")
        public String logout() {
        //인증된 사용자 정보를 세션에 삭제한다. 
        SessionUtils.removeAttribute("LOGIN_USER");
        return "redirect:home.do";
        }
    • 해당하는 메소드를 사용해서 로그인과 로그아웃을 사용할 수 있다. 
반응형
Comments