날아라쩡글이의 블로그입니다.
Session어노테이션 & SessionUtils로 객체 담기 본문
Session어노테이션 & SessionUtils로 객체 담기
날아라쩡글이 2022. 1. 5. 10:36Mybatis가 제공하는 타입 명칭
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;
}
- @Autowired
- 어노테이션 @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";
}
- @GetMapping("/logout.do")
- 해당하는 메소드를 사용해서 로그인과 로그아웃을 사용할 수 있다.
- @PostMapping("/login.do")
'중앙 HTA (2106기) story > spring java framwork story' 카테고리의 다른 글
RestController (0) | 2022.01.06 |
---|---|
spring MVC가 jsp에서 실행되는 순서와 객체들 (0) | 2022.01.05 |
다이나믹쿼리 (resultMap) (0) | 2022.01.04 |
다이나믹 쿼리(select문 하나로 여러 쿼리를 조회하다.) (0) | 2022.01.04 |
RedirectAttributes,Model 의 차이점 (0) | 2022.01.02 |