티스토리 뷰

쿠키는 1개의 key 당 4kb의 데이터만 담을 수 있기 때문에 주의해서 사용해야 합니다. 이전 포스팅 하였던 세션관리와 비슷하기 때문에 해당 포스팅도 참고하세요.
[SpringBoot] Enum 으로 Session 관리하기

 

[SpringBoot] Enum 으로 Session 관리하기

SpringBoot에서 Enum을 활용하여 Session 관리하는 방법을 간단하게 알아보겠습니다.1. SessionKeys 생성@RequiredArgsConstructorpublic enum SessionKeys { // key 를 나열 USER_VO("사용자 정보", UserVO.class), ROOM_VO("채팅방

zerobin-dev.tistory.com

 

1. Key 정의

  • CookieKeys Enum 클래스 생성
@RequiredArgsConstructor
public enum CookieKeys {

  MY_COOKIE_VO("나의 쿠키 데이터", MyCookieVO.class);

  public final String desc;
  public final Class usageClass;
}

 

2. CookieManager 작성

import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletResponse;
import java.util.Base64;

public class CookieManager {

  public static HttpServletResponse getResponse() {
    return HttpRequestUtil.getCurrentResponse();
  }

  public static void put(final SessionKeys sessionKeys, final Object object) throws Exception {
    String jsonValue = ObjectUtil.objectToJsonString(object);
    Cookie cookie = new Cookie(sessionKeys.name(), Base64.getEncoder().encodeToString(jsonValue.getBytes()));
    cookie.setMaxAge(300); // 5분
    getResponse().addCookie(cookie);
  }

  public static <T> T getAs(SessionKeys sessionKeys, final Class<T> clazz) throws Exception {
    Cookie cookie = CookieUtil.getCookie(sessionKeys);

    if (cookie != null) {
      throw new MyBizException(ExceptType.COOKIE002); // 쿠키 값이 존재하지 않습니다.
    }

    String cookieValue = cookie.getValue();
    byte[] decodedBytes = Base64.getDecoder().decode(cookieValue);
    String decodedString = new String(decodedBytes);

    T readClass = ObjectUtil.jsonStringToObject(decodedString, clazz);

    if (!sessionKeys.usageClass.getClass().isInstance(readClass)) {
      throw new MyBizException(ExceptType.SESS001); // 쿠키 타입이 일치하지 않습니다.
    }
    return readClass;
  }
}

 

3. CookieUtil 작성

import jakarta.servlet.http.Cookie;

public class CookieUtil {

  public static Cookie[] getAllCookies() {
    return HttpRequestUtil.getCurrentRequest().getCookies();
  }

  public static Cookie getCookie(CookieKeys cookieKeys) {
    Cookie[] cookies = getAllCookies();
    if (cookies != null) {
      for (Cookie cookie : cookies) {
        if (cookie.getName().equals(cookieKeys.name())) {
          return cookie;
        }
      }
    }
    return null;
  }
}

 

4. HttpRequestUtil 작성

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

public class HttpRequestUtil {

  /**
   * 현재 request 가져오기
   */
  public static HttpServletRequest getCurrentRequest() {
    try {
      return ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
    } catch (Exception e) {
      return null;
    }
  }

  /**
   * 현재 response 가져오기
   */
  public static HttpServletResponse getCurrentResponse() {
    try {
      return ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getResponse();
    } catch (Exception e) {
      return null;
    }
  }

}

 

5. 사용

// set
CookieManager.put(CookieKeys.MY_COOKIE_VO, myCookieVO);

// get
MyCookieVO myCookieVO = CookieManager.getAs(CookieKeys.MY_COOKIE_VO, MyCookieVO.class);



감사합니다.

최근에 올라온 글
Total
Today
Yesterday