위 코드를 실행해보면 HttpSession의 타입은 org.apache.catalina.session.StandardSessionFacade 입을 알 수 있다. 즉 HttpSession을 누가 구현해주는냐에 따라서 동작이 달라질 수 있는 것이다.(interface - class 관계이므로)
springboot에서 redis를 이용한 session 관리를 위해서는 다음의 의존성이 필요하다.
<!-- spring에서 redis를 이용해서 session을 관리하기 위한 의존성 --><dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId></dependency>
의존성에 spring-session-data-redis를 추가하면 boot는 내부적으로 @EnableRedisHttpSession을 동작시킨다. 결과로 Filter를 구현한 SpringSessionRepositoryFilter라는 빈을 만들고 이 녀석이 HttpSession 구현을 대체해준다.
추가로 객체의 직렬화/역직렬화를 담당할 RedisSerialize를 사용하기 위해 다음의 의존성도 추가한다.
redis를 통해서 세션을 관리하기 위해서는 사실 많은 설정이 필요하지만 boot의 자랑 auto configuration이 있기 때문에 몇가지 설정만 application.properties에 추가하면 간단히 사용할 수 있다.
먼저 사용자 관리를 위해서는 spring.data.redis.xxx 를 설정한다. host와 port는 거의 필수이고 username, password 등은 db 설정에 따라 다르다.
# redis 사용자 관리
spring.data.redis.host=localhost
spring.data.redis.port=6379
spring.data.redis.username=
spring.data.redis.password=
다음으로 필요에 따라서 redis에서 session을 관리하기 위한 설정을 작성할 수 있다.
# redis - session 설정
server.servlet.session.timeout= # Session timeout. If a duration suffix is not specified, seconds is used.spring.session.redis.flush-mode=on_save # Sessions flush mode.spring.session.redis.namespace=spring:session # Namespace for keys used to store sessions.
원래는 세션에서 cart 객체를 가져온 후 추가할 product만 추가하면 되는 코드였는데 Redis를 이용하니 마지막 녀석만 바뀌는 현상이 발생했다. cart의 hashcode로 찍어보니 변경이 일어날 때마다 다른 값이 출력되는 것이 새로운 객체를 만들고 반영을 안하는 모양이다.
명시적으로 session에 다시 설정해주면 되긴 하는데 내가 뭘 덜 알고 있는건가ㅜㅜ 아시는 분들 조언 부탁합니다.~