Program Tip

HttpServlet이 Serializable을 구현하는 이유는 무엇입니까?

programtip 2020. 10. 17. 12:02
반응형

HttpServlet이 Serializable을 구현하는 이유는 무엇입니까?


Servlet에 대해 이해하면 Servlet은 Container에 의해 인스턴스화되고 해당 init()메소드는 한 번 호출되며 JVM이 종료 될 때까지 서블릿은 싱글 톤처럼 유지됩니다.

내 서블릿이 직렬화 될 것으로 예상하지 않습니다. 앱 서버가 복구되거나 정상적으로 시작될 때 새로 생성되기 때문입니다. 서블릿은 세션 별 구성원을 보유하지 않아야하므로 디스크에 기록하고 다시 인스턴스화하는 것은 의미가 없습니다. 이것에 대한 실제적인 사용이 있습니까?

내 우려 사항은 직렬화 불가능한 필드를 거기에 넣은 다음 다른 종류의 세션 복제가 발생하는 프로덕션 환경에서 내 앱이 신비롭게 실패한다는 것입니다.


기술적으로는 서블릿 컨테이너가 EJB 세션 빈과 비슷한 방식으로 서블릿 객체를 디스크에 "비활성화"할 수 있다고 생각합니다. 따라서 직렬화 할 수없는 필드로 인해 앱이 실패하는지 질문하는 것이 맞습니다.

실제로이 작업을 수행하는 컨테이너에 대해 들어 본 적이 없기 때문에 J2EE 초기의 나쁜 옛날 시절의 레거시 수하물 일뿐입니다. 나는 그것에 대해 걱정하지 않을 것입니다.


HttpServlet은 디스크에 직렬화되어 서블릿 컨테이너가 다시 시작되어야합니다. 예를 들어 tomcat을 사용하면 이러한 종류의 생존을 가능하게하는 플래그를 설정할 수 있습니다. 다음 옵션은 JNDI를 사용한 전송입니다. 이것은 쓰레기가 아니며 극단적 인 사용 사례에서만 사용됩니다.


Google은 컨테이너 작성자가 원하는 경우 옵션을 가질 수 있도록 이것이 수행되었다고 제안하는 것 같습니다.

서블릿이 세션 특정 멤버를 보유하지 않아야한다는 것이 맞습니다. 사실 저는 가능한 한 적은 상태를 원할 것이라고 생각합니다. Session 또는 ServletConfig에 모든 것을 저장하면 직렬화에서 살아남을 수 있다고 생각합니다.


세션 객체가 클러스터 옵션을 제공하는 서블릿 컨테이너에 대해 캐시를 유지하기 위해 직렬화되는 것처럼 컨테이너가 서블릿 인스턴스를 다른 클러스터 노드로 전송할 수있는 옵션이있을 수 있습니다. 나는 여기서 추측하고있다


Serializable은 분산 환경에서 세션 속성에 대한 마커 인터페이스 로 사용됩니다 .

SRV.7.7.2 분산 환경 (JSR-154)

배포 가능으로 표시된 애플리케이션 내 에서 세션의 일부인 모든 요청은 한 번에 하나의 JVM (Java Virtual Machine)에 의해 처리되어야합니다. 컨테이너는 setAttribute 또는 putValue 메서드를 적절히 사용하여 HttpSession 클래스의 인스턴스에 배치 된 모든 개체를 처리 할 수 ​​있어야합니다. 이러한 조건을 충족하기 위해 다음 제한 사항이 적용됩니다.

  • 컨테이너는 Serializable 인터페이스를 구현하는 객체를 허용해야합니다 .
  • 세션 마이그레이션은 컨테이너 별 시설에서 처리됩니다.

분산 서블릿 컨테이너는 컨테이너가이를 저장하는 세션의 마이그레이션에 필요한 메커니즘을 지원할 수없는 객체에 대해 IllegalArgumentException을 발생시켜야 합니다 .

분산 서블릿 컨테이너는 Serializable을 구현하는 객체마이그레이션하는 데 필요한 메커니즘을 지원해야합니다 .

(...)

컨테이너 공급자는 분산 시스템의 활성 노드에서 시스템의 다른 노드로 세션 개체 및 해당 콘텐츠를 이동할 수있는 기능을 통해로드 균형 조정 및 장애 조치와 같은 서비스 기능의 확장 성과 품질을 보장 ​​할 수 있습니다 . 분산 컨테이너 가 서비스 품질 기능을 제공하기 위해 세션유지하거나 마이그레이션하는 경우 HttpSession 및 해당 속성을 직렬화하기 위해 기본 JVM 직렬화 메커니즘을 사용하는 것으로 제한되지 않습니다. 개발자는 컨테이너가 세션 속성을 구현할 경우 readObject 및 writeObject 메서드를 호출 할 것이라는 보장은 없지만 해당 속성의 Serializable 클로저는 유지 됩니다.

참고 URL : https://stackoverflow.com/questions/179743/why-does-httpservlet-implement-serializable

반응형