둘은 생명주기가 다르다
@RequestScope
객체를 요청마다 생성하게 하는 애노테이션
@RestController
@RequiredArgsConstructor
@RequestMapping("/member")
public class MemberController {
private final MemberService memberService;
private final Rq rq; // 프록시객체
@GetMapping("/login")
public RsData login(String username, String password) {
if (username == null || password == null) {
return RsData.result("F-3", "Username 과 password를 입력해주세요.");
}
RsData rsData = memberService.tryLogin(username, password);
if (rsData.isSuccess()) {
rq.setCookie("user", rsData.getData().toString());
}
return rsData;
}
@GetMapping("/logout")
public RsData logout() {
boolean removed = rq.removeCookie("user");
if (removed) {
return RsData.result("S-1", "로그아웃 되었습니다.");
}
return RsData.result("F-1", "이미 로그아웃 상태입니다.");
}
@GetMapping("/me")
public RsData me() {
String username = rq.getCookie("user", "anonymous");
if (username.equals("anonymous")) {
return RsData.result("F-1", "로그인 후 이용해주세요");
}
return RsData.result("S-1", String.format("당신의 username은 %s입니다.", username));
}
}
MemberController의 멤버변수 rq는 요청을 받기 전까진 프록시객체이다.
컨트롤러가 요청을 처리하기 위해 rq를 이용하는 시점부터 rq는 진짜 Rq클래스의 객체를 호출한다.
서버의 저장공간에 요청자들의 정보가 담겨있다. 서버는 요청을 여전히 구분하지 못하나 쿠키의 세션키로 각 요청에 대한 처리를 다르게 한다.
HTML의 폼데이터는 쿼리스트링과 같이 취급된다.
HttpServletRequest 객체이 메서드 getParameter 혹은 관련 메서드들은 폼데이터와 쿼리 스트링을 모두 지원한다.