Spring frame work에선 http 세션 정보를 저장하고 관련 기능을 제공하는 Spring session이 있다. 세션 정보를 Redis 데이터베이스에 적재하고 활용하는 방법을 알아보자.
세션(Session)은 클라이언트와 서버 간의 상호작용을 위해 유지되는 상태 데이터를 의미한다. 세션을 통해 이전 요청에서 생성된 데이터를 이후 요청에서도 사용할 수 있게 된다. 일반적으로 세션은 HTTP 세션을 가리키지만, TCP 세션, HTTP 세션, WebSocket 세션 등 여러 방식으로 분류되고 식별될 수 있다.
Spring Session은 웹 애플리케이션에서 세션 관리를 위한 표준 인터페이스와 다양한 세션 저장소를 제공한다. Spring Session은 Redis 외에도 JDBC, Hazelcast, MongoDB 등 여러 저장소와 연동할 수 있다. Dependencies에서 Spring Data Redis를 추가할 경우, 기본적으로 포함된 spring-session-core가 제외되고 필요한 Redis 관련 종속성이 추가된다.
implementation 'org.springframework.session:spring-session-data-redis'
간단한 세션 관련 코드를 짜보면,
컨트롤러
@GetMapping("/")
public void home(HttpSession session){
Integer visitCounter = (Integer)session.getAttribute("visits");
if(visitCounter==null){
visitCounter=0;
}
session.setAttribute("visits",++visitCounter);
log.info("session={}",session);
}
해당 "/"로 접속을 하게 되면 session의 visits 속성을 가져오고 항상 visitcount를 증가한 상태로 session에 저장한다.
Spring 로깅 결과
Redis Monitor 결과
session.getAttribute -> Redis 명령어
session.setAttribute -> Redis 명령어
PEXPIREAT: 세션의 만료 시간을 밀리초 단위로 설정한다.
EXISTS: Redis에서 지정된 키가 존재하는지 확인하는 명령이다.
# 컴파일 빌드
./gradlew build
# CMD(1)
java -jar build/libs/session-0.0.1-SNAPSHOT.jar
# CMD(2)
java -Dserver.port=8090 -jar build/libs/session-0.0.1-SNAPSHOT.jar
포트를 8080,8090으로 2개의 웹 어플리케이션 서버를 구동하고 각각 접속해보았다.
다음과 같이 순차적으로 접속을 했을때 일관되게 VisitCount값이 증가하는 것을 확인할 수 있다. 따라서 분산된 환경에서도 세션 정보를 공유할 수 있는 안정적인 세션 저장소로 동작함을 확인하였다.