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));
}
}