톰캣의 세션을 memcached로 관리 할 때 주의할 점 한 가지

다수의 톰캣 인스턴스를 사용할 때 세션 공유 하는 방법은 여러가지가 있다.
톰캣에서 기본으로 제공하는 p2p 세션 클러스터가 있으며 memcached나 gemfire 같은 캐쉬 시스템에 세션을 저장해 공유하는 방법도 있다.

사실 이런 아이디어는 레일즈 같은 개발 스텍에서는 당연하게 쓰는 접근법인데 자바 세상에는 구현하기 시작한지 얼마 안 된것 같다.

현재 사용하고 있는 방법은 멤캐쉬드를 이용해 세션을 공유하는 것인데 자세한 내용은 memcached-session-manager 프로젝트에서 알 수 있다.

도메인 객체를 세션에 저장하려고 하니 세션 매니저쪽에서 시리얼라이즈 할 수 없다면서 에러를 내뱉고 있어서 에러 로그를 살펴보니 객체 안에 lazy 로 로딩되는 연관 객체들을 시리얼라이즈 하려다가 에러를 낸다.
하이버네이트 세션이 클로즈 된 상태에서 lazy로 로딩하는 연관 객체들은 실제 객체가 아닌 proxy 객체라서 map 형태로 시리얼라이즈 할 수 없는듯 하다.

이 문제를 해결 할 수 없을까 하고 잠들기 전 잠깐 검색을 해보니 프로젝트에서 이미 컨버터를 구현해놓았다.
SetupAndConfiguration 페이지 하단의 설정 옵션을 살펴보니 customConverter 라는 항목이 있다.
msm-kryo-serializer를 지원하는 컨버터가 몇 개 있다. 그중에 CGLIB 프록시 컨버터와 하이버네이트 콜렉션 컨버터가 현재 문제를 해결 할 수 있는 방법이 될 것 같다.

  • de.javakaffee.web.msm.serializer.kryo.CGLibProxySerializerFactory: serializes/deserializes CGLIB proxies.
  • de.javakaffee.web.msm.serializer.kryo.HibernateCollectionsSerializerFactory: serializes/deserializes hibernate persistent collections (required if you store collections loaded by hibernate in your session)

어째 요즘은 코드로 하는 삽질보다는 시스템으로 하는 삽질이 많아지고 있다.