티스토리 뷰

Spring Boot에서 세션 관리를 효율적으로 구현하기 위해 Enum을 활용하는 방법을 살펴보겠습니다. 특히, Enum을 사용하여 세션의 key를 체계적으로 나열하고 관리하는 것이 핵심입니다. 이 접근 방식은 세션 관리의 일관성을 유지하고, 코드의 가독성과 유지보수성을 크게 향상시킵니다. 각 세션 키를 Enum에 정의함으로써, 세션 데이터를 저장하고 조회할 때 발생할 수 있는 실수를 줄일 수 있습니다. 이번 포스팅에서는 이 방법에 대해 간단하게 알아보겠습니다.


1. SessionKeys 생성

@RequiredArgsConstructor
public enum SessionKeys {

  // key 를 나열
  USER_VO("사용자 정보", UserVO.class),
  ROOM_VO("채팅방 정보", RoomVO.class);

  // 파라미터 정보 나열
  public final String content;
  public final Class className;

}
  • Session 으로 사용할 Key들을 Enum으로 나열합니다.

 

2. Util 구현

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

public class RequestUtils {

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

  /**
   * 현재 세션 가져오기
   */
  public static HttpSession getSession() {
    return getCurrentRequest().getSession();
  }

}
  • Request에 쉽게 접근하기 위해 RequestUtil 클래스 생성

 

3. SessionManager 구현

import com.myapi.mymsgapi.comm.exception.MyBizException;
import com.myapi.mymsgapi.comm.types.ExceptType;
import com.myapi.mymsgapi.comm.utils.RequestUtils;
import jakarta.servlet.http.HttpSession;

public class SessionManager {

  private static boolean exists(final SessionKeys sessionKeys) {
    return RequestUtils.getSession().getAttribute(sessionKeys.name()) != null;
  }

  public static void put(final SessionKeys sessionKeys, final Object object) {
    if (!sessionKeys.usageClass.isInstance(object)) {
      throw new MyBizException(ExceptType.SESS001); // 세션타입이 일치하지 않습니다.
    }
    RequestUtils.getSession().setAttribute(sessionKeys.name(), object);
  }

  public static void remove(final SessionKeys sessionKeys) {
    RequestUtils.getSession().removeAttribute(sessionKeys.name());
  }

  public static Object get(final SessionKeys sessionKeys) {
    return exists(sessionKeys) ? RequestUtils.getSession().getAttribute(sessionKeys.name()) : null;
  }

  public static <T> T getVO(SessionKeys sessionKeys, final Class<T> className) {
    if (!sessionKeys.className.getClass().isInstance(className)) {
      throw new MyBizException(ExceptType.SESS001); // 세션타입이 일치하지 않습니다.
    }
    return (T) get(sessionKeys);
  }

}
  • Session을 쉽게 사용하기 위해 SessionManager를 구현합니다.

 

4. 사용

UserVO userVO = SessionManager.getVO(SessionKeys.USER_VO, UserVO.class);



감사합니다.

최근에 올라온 글
Total
Today
Yesterday