먼저 Servlet 프로젝트에서 사용했던 가장 익숙한 방법.
예제는 전부 login.me라는 맵핑 주소를 통해 연결되고 POST 방식으로 전달 되었다.
1. HttpServletRequest, HttpServletResponse를 이용
// 1. 서블릿에서 했던 방식대로 HttpServletRequest, HttpServletResponse를
// 매개변수로 선언하면 스프링 컨테이너가 이 메소드를 실행할 때 자동으로 두 객체를 인자로 주입해준다.
@RequestMapping("/login.me")
public String loginCheck(HttpServletRequest request, HttpServletResponse response) {
String userId = request.getParameter("userId");
String userPwd = request.getParameter("userPwd");
System.out.println(userId + " " + userPwd);
return "main/main";
}
2. 어노테이션 RequestParam을 이용하여 값을 받아오기
// 2. RequestParam 어노테이션을 이용해서 파라미터 값 받아오기
// => 스프링에서는 조금 더 간단하게 파라미터를 받아올 수 있는 방법을 제공한다(RequestParam)
@RequestMapping(value="/login.me", method=RequestMethod.POST)
public String loginCheck(@RequestParam("userId")String userId, @RequestParam String userPwd) {
System.out.println(userId + " " + userPwd);
return "main/main";
}
@RequestParam("전달받은 name") 처럼 name을 명시해도 되고
아니면 ("")을 생략해도 자동으로 잡히기 때문에 편한 방식으로 사용하면 된다.
3. 어노테이션 RequestParam은 생략이 가능하다.
// 3. RequestParam 어노테이션은 생략해도 파라미터값을 가져와서 매개변수에 저장할 수 있다.
@RequestMapping(value="login.me", method=RequestMethod.POST)
public String loginCheck(String userId, String userPwd) {
System.out.println(userId + " " + userPwd);
return "main/main";
}
생략을 통해서 구현하면 본인은 괜찮지만 나중에 봤을 때나 다른사람이 봤을 때
못알아 볼 수 있기 때문에 그냥 명시하는것을 추천
4. @ModelAttribute를 이용, 객체에 자동으로 Setter을 이용하여 값을 가져온다.
// 4. @ModelAttribute를 이용한 값 전달받는 방법(커맨드 객체)
@RequestMapping(value="login.me", method=RequestMethod.POST)
public String loginCheck(@ModelAttribute Member m) {
System.out.println(m);
return "main/main";
}
해당 객체에 Setter 메소드가 있어야 되고
전달받은 name과 해당 객체의 필드명이 같아야함.
오타에 주의하자.
5. @ModelAttribute를 생략하는 방법 + 값 리턴방법(예전에 쓰던 request, response)
// 5. 위의 어노테이션을 생략하고 객체로 받는 방법
@RequestMapping(value="login.me", method=RequestMethod.POST)
public String loginCheck(Member m, HttpServletRequest request, HttpServletResponse response) {
System.out.println(m);
MemberService ms = new MemberServiceImpl(); // 결합을 느슨하게 만듦
try {
Member loginUser = ms.loginMember(m);
request.getSession().setAttribute("loginUser", loginUser);
return "redirect:goMain.me";
} catch (LoginException e) {
request.setAttribute("msg", e.getMessage());
return "common/errorPage";
}
return "main/main";
}
Member m만 입력해도 Spring이 자동으로 맞춰준다.
6. ModelAndView라는 객체를 사용하여 값을 리턴
// 6. ModelAndView로 리턴 처리
// => model은 뷰로 전달할 데이터를 앱 형식으로 담을 때 사용하는 객체로 scope는 request이다.
// => view는 requestDispatcher처럼 forward할 뷰 페이지 정보를 담은 객체이다.
// => ModelAndView는 이 두가지를 합쳐 놓은 객체이며
// => Model 객체를 따로 사용하는 것도 가능하다.
// => 하지만 view 객체는 따로 사용하지 못한다.
@RequestMapping("login.me")
public ModelAndView loginCheck(Member m, ModelAndView mv, HttpSession session) {
try {
Member loginUser = ms.loginMember(m);
session.setAttribute("loginUser", loginUser);
mv.setViewName("redirect:goMain.me");
} catch (LoginException e) {
mv.addObject("msg", e.getMessage());
mv.setViewName("common/errorPage");
}
return mv;
}
ModelAndView는 리턴 받는 페이지의 정보도 담아가고 리턴 받을 값도 전부 담아서
메소드 리턴타입으로 돌려주는걸 확인 할 수 있다.
7. model 객체로 값을 리턴하고 String 리턴으로 뷰 이동
// 7. Model 객체를 따로 사용하고 String으로 뷰 이름을 리턴하는 방법
@RequestMapping("login.me")
public String loginCheck(Member m, Model model, HttpSession session) {
Member loginUser;
try {
loginUser = ms.loginMember(m);
session.setAttribute("loginUser", loginUser);
return "redirect:goMain.me";
} catch (LoginException e) {
model.addAttribute("msg", e.getMessage());
return "common/errorPage";
}
return null;
}
8. @SessionAttributes, model 객체를 사용하여 Session 리턴
@SessionAttributes("loginUser")
@Controller
public class MemberController {
// 8. session에 저장을 할 때 @SessionAttributes 사용하기
// => 모델에 Attribute가 추가될 때 자동으로 키 값을 찾아 세션에 등록하는 기능을 제공하는
// 어노테이션이다.
@RequestMapping("login.me")
public String loginCheck(Member m, Model model) {
try {
Member loginUser = ms.loginMember(m);
model.addAttribute("loginUser", loginUser);
return "redirect:goMain.me";
} catch (LoginException e) {
model.addAttribute("msg", e.getMessage());
return "common/errorPage";
}
}
}
@SessionAttributes("loginUser") 라고 명시를 해 두면
model.addAttribute("loginUser", loginUser);라고 추가했을 때 자동으로
Session으로 추가된다.
보너스로 세션 파기하는 방법
@RequestMapping("logout.me")
public String LogOutputStream(HttpServletRequest request) {
request.getSession().invalidate();
return "redirect:goMain.me";
}
@RequestMapping("goMain.me")
public String goMain() {
// 포워드만 해주는 메소드
return "main/main";
}
리턴을 통해서 바로 페이지로 돌아가게 되면
새로고침 시 get, post 값을 한 번 더 전송할 수 있다.
이를 방지하기 위해 포워드만 해주는 메소드로 redirect 우회하면 된다.
※ 위의 메소드들에서 사용하는 ms.***** ms 객체는
@Autowired로 생성한 bean 객체
db에서 로그인 정보를 확인해오는 객체이다.