정상화·2023년 3월 16일
0

TIL

목록 보기
14/46
post-thumbnail

Rq와 MemberService의 차이

둘은 생명주기가 다르다

  • memberService: 앱 시작 시 탄생, 앱 종료시 사라짐
  • Rq: 요청시작 시 탄생, 요청 종료 시 사라짐

@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 혹은 관련 메서드들은 폼데이터와 쿼리 스트링을 모두 지원한다.

profile
백엔드 희망

0개의 댓글