[Spring] Rq클래스를 사용하여 쿠키 간단하게 사용하기

세상을 바꾸는 개발자·2023년 3월 16일
0

Rq 적용 전

@GetMapping("/member/logout")
@ResponseBody
public RsData logout(HttpServletRequest req, HttpServletResponse resp) {
    if (req.getCookies() != null) {
        Arrays.stream(req.getCookies())
                .filter(cookie -> cookie.getName().equals("loginedMemberId"))
                .forEach(cookie -> {
                    cookie.setMaxAge(0);
                    resp.addCookie(cookie);
                });
    }

    return RsData.of("S-1", "로그아웃 되었습니다.");
}



Rq 적용 후

@GetMapping("/member/logout")
@ResponseBody
public RsData logout(HttpServletRequest req, HttpServletResponse resp) {
    Rq rq = new Rq(req, resp);
    rq.removeCookie("loginedMemberId");

    return RsData.of("S-1", "로그아웃 되었습니다.");
}
  • 위 소스 코드를 Rq를 밖으로 빼서 더 간단하게 만들 수 있다.
@Controller
public class MemberController{
  private final Rq rq;

  @Autowired
  public MemberController(Rq rq){
  this.rq = rq;
  }
  • 먼저 밖으로 빼서 생성자 주입을 한다.
  • 위 코드는 @AllArgsConstructor로 생략가능하다.
@Controller
@AllArgsConstructor
public class MemberController{
  private final Rq rq;



Rq 클래스

  • Rq 객체를 매번 만드는 수고를 스프링에게 맡기기 위해서 @Component를 붙인다.
  • Rq의 생명주기는 요청 시작시 생성되고 요청 종료시 종료되므로 매 번 신청해줘야하기 때문에 @RequestScope를 사용해야한다.
  • 사용하지 않아도 스프링이 인지하고 실행은 될 수 있으나, 일반적으로는 붙여주는 게 좋다.
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.AllArgsConstructor;

import java.util.Arrays;

@Component //컴포넌트 붙여주기
@RequestScope //매 요청마다 생성된다.ㅏ
@AllArgsConstructor
public class Rq {
    private final HttpServletRequest req;
    private final HttpServletResponse resp;

    public boolean removeCookie(String name) {
        if (req.getCookies() != null) {
            Arrays.stream(req.getCookies())
                    .filter(cookie -> cookie.getName().equals(name))
                    .forEach(cookie -> {
                        cookie.setMaxAge(0);
                        resp.addCookie(cookie);
                    });

            return Arrays.stream(req.getCookies())
                    .filter(cookie -> cookie.getName().equals(name))
                    .count() > 0;
        }

        return false;
    }

    public String getCookie(String name, String defaultValue) {
        if ( req.getCookies() == null ) return defaultValue;

        return Arrays.stream(req.getCookies())
                .filter(cookie -> cookie.getName().equals(name))
                .map(Cookie::getValue)
                .findFirst()
                .orElse(defaultValue);
    }

    public long getCookieAsLong(String name, long defaultValue) {
        String value = getCookie(name, null);

        if ( value == null ) {
            return defaultValue;
        }

        try {
            return Long.parseLong(value);
        }
        catch ( NumberFormatException e ) {
            return defaultValue;
        }
    }

    public void setCookie(String name, long value) {
        setCookie(name, value + "");
    }

    public void setCookie(String name, String value) {
        resp.addCookie(new Cookie(name, value));
    }
}
profile
초심 잃지 않기

0개의 댓글