JSF가 서버에 UI 구성 요소의 상태를 저장하는 이유는 무엇입니까?


108
  1. JSF는 언제까지 서버 측에서 UI 구성 요소의 상태를 저장하고 UI 구성 요소의 상태 정보 가 서버 메모리에서 정확히 제거 되는시기는 언제입니까? 애플리케이션에 로그인 한 사용자가 페이지를 탐색 할 때 구성 요소의 상태가 서버에 계속 누적됩니까?

  2. UI 구성 요소 상태를 서버에 유지하는 이점이 무엇인지 이해하지 못합니다 !? 검증 된 / 변환 된 데이터를 관리 Bean에 직접 전달하지 않습니까? 나는 그것을 피할 수 있습니까?

  3. 수천 개의 동시 사용자 세션이있는 경우 서버 측에서 너무 많은 메모리 를 소비하지 않습니까? 사용자가 특정 주제에 대한 블로그를 게시 할 수있는 애플리케이션이 있습니다. 이 블로그는 크기가 상당히 큽니다. 포스트 백이나 블로그보기 요청 이있을 때이 큰 페이지 데이터가 구성 요소 상태의 일부로 저장됩니까? 이것은 너무 많은 메모리를 소모합니다. 이것이 문제가되지 않습니까?


업데이트 1 :

이제 더 이상 JSF를 사용하는 동안 상태를 저장할 필요가 없습니다. 고성능 Stateless JSF 구현을 사용할 수 있습니다. 관련 세부 사항 및 토론 은이 블로그이 질문 을 참조하십시오 . 또한 JSF에 대한 상태 비 저장 모드를 제공하는 옵션 인 JSF 사양에 포함해야 할 미해결 문제 가 있습니다. (PS는 문제에 대한 투표를 고려 ,이 & 이 당신을 위해 유용한 기능입니다 경우.)


업데이트 2 (2013 년 2 월 24 일) :

Mojarra 2.1.19stateless 모드 로 나왔다는 좋은 소식입니다 !

여기를 보아라:

http://weblogs.java.net/blog/mriem/archive/2013/02/08/jsf-going-stateless?force=255

http://java.net/jira/browse/JAVASERVERFACES-2731

http://balusc.blogspot.de/2013/02/stateless-jsf.html

답변:


199

JSF가 서버 측에 UI 구성 요소의 상태를 저장해야하는 이유는 무엇입니까?

HTTP는 상태 비 저장이고 JSF는 상태 저장이기 때문입니다. JSF 구성 요소 트리는 동적 (프로그래밍 방식) 변경의 대상이됩니다. JSF는 양식이 최종 사용자에게 표시되었을 때의 정확한 상태를 알면됩니다. 그러면 양식이 다시 제출 될 때 원래 JSF 구성 요소 트리에서 제공 한 정보를 기반으로 전체 JSF 라이프 사이클을 성공적으로 처리 할 수 ​​있습니다. 서버. 컴포넌트 트리는 요청 매개 변수 이름, 필요한 변환기 / 유효성 검사기, 바인딩 된 관리 Bean 특성 및 조치 메소드에 대한 정보를 제공합니다.


JSF는 언제까지 서버 측에서 UI 구성 요소의 상태를 저장하며 UI 구성 요소의 상태 정보는 정확히 언제 서버 메모리에서 제거됩니까?

이 두 가지 질문은 똑같이 요약되는 것 같습니다. 어쨌든 이것은 구현에 따라 다르며 상태가 서버 또는 클라이언트에 저장되는지 여부에 따라 다릅니다. 약간 괜찮은 구현은 만료되었거나 대기열이 가득 차면 제거합니다. 예를 들어 Mojarra는 상태 저장이 세션으로 설정된 경우 기본 제한이 15 개의 논리적 뷰입니다. 다음 컨텍스트 매개 변수를 사용하여 구성 할 수 있습니다 web.xml.

<context-param>
    <param-name>com.sun.faces.numberOfLogicalViews</param-name>
    <param-value>15</param-value>
</context-param>

다른 Mojarra 관련 매개 변수 및 관련 답변 com.sun.faces.numberOfViewsInSession 대 ​​com.sun.faces.numberOfLogicalViewsMojarra FAQ 를 참조하십시오.


애플리케이션에 로그인 한 사용자가 페이지를 탐색 할 때 구성 요소의 상태가 서버에 계속 누적됩니까?

기술적으로는 구현에 따라 다릅니다. 페이지 간 탐색 (GET 요청)에 대해 이야기하는 경우 Mojarra는 세션에 아무것도 저장하지 않습니다. 그러나 POST 요청 (명령 링크 / 버튼이있는 양식) 인 경우 Mojarra는 최대 제한까지 세션에서 각 양식의 상태를 저장합니다. 이를 통해 최종 사용자는 동일한 세션의 다른 브라우저 탭에서 여러 양식을 열 수 있습니다.

또는 상태 저장이 클라이언트로 설정되면 JSF는 세션에 아무것도 저장하지 않습니다. 다음 컨텍스트 매개 변수를 사용하여 수행 할 수 있습니다 web.xml.

<context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
</context-param>

그런 다음 javax.faces.ViewState양식 이름 이 있는 숨겨진 입력 필드의 암호화 된 문자열로 직렬화됩니다 .


나는 서버 측에서 UI 구성 요소의 상태를 유지하는 이점이 무엇인지 이해하지 못합니다. 검증 된 / 변환 된 데이터를 관리 Bean에 직접 전달하지 않습니까? 그것을 피할 수 / 피해야합니까?

JSF의 무결성과 견고성을 보장하기에는 충분하지 않습니다. JSF는 제어의 단일 진입 점이있는 동적 프레임 워크입니다. 상태 관리하지 않고, 하나의 수 스푸핑 / 해킹 HTTP 어떤 방법으로 요청 (예를 들어, 조작 것 disabled, readonlyrendered특성), JSF는 다른 - 그리고 잠재적으로 hazardful- 일을 할 수 있도록. CSRF 공격과 피싱에 취약합니다.


수천 개의 동시 사용자 세션이있는 경우 서버 측에서 너무 많은 메모리를 소비하지 않을까요? 사용자가 특정 주제에 대한 블로그를 게시 할 수있는 애플리케이션이 있습니다. 이 블로그는 크기가 상당히 큽니다. 포스트 백 또는 블로그보기 요청이있을 때 큰 블로그는 구성 요소 상태의 일부로 저장됩니다. 이것은 너무 많은 메모리를 소비합니다. 이것이 문제가되지 않습니까?

메모리는 특히 저렴합니다. 앱 서버에 충분한 메모리를 제공하십시오. 또는 네트워크 대역폭이 더 저렴한 경우 상태 저장을 클라이언트 측으로 전환하십시오. 최적의 일치를 찾으려면 예상되는 최대 동시 사용자 수로 웹앱을 스트레스 테스트하고 프로파일 링 한 다음 앱 서버에 측정 된 최대 메모리의 125 % ~ 150 %를 제공하십시오.

JSF 2.0은 상태 관리에서 많이 향상되었습니다. 그것은 (예 : 부분적인 상태를 저장하는 것이 가능 단지 (가) <h:form>대신에 전체 물건의 저장됩니다 <html>모든 끝으로가는 길). 예를 들어 Mojarra는 그렇게합니다. 10 개의 입력 필드 (각각 레이블 및 메시지 포함)와 2 개의 버튼이있는 평균 양식은 1KB를 넘지 않습니다. 세션에 15 개의 뷰가있는 경우 세션 당 15KB를 넘지 않아야합니다. 최대 1000 명의 동시 사용자 세션이있는 경우 15MB를 넘지 않아야합니다.

세션 또는 애플리케이션 범위에있는 실제 개체 (관리 Bean 및 / 또는 DB 엔터티)에 더 중점을 두어야합니다. 필자는 레코드를 필터링 / 그룹화 / 정렬하기 위해 SQL 대신 Java가 사용 된 세션 범위 빈의 풍미에서 전체 데이터베이스 테이블을 Java의 메모리로 불필요하게 복제하는 많은 코드와 프로젝트를 보았습니다. ~ 1000 개의 레코드를 사용하면 사용자 세션 당 10MB를 쉽게 초과 할 수 있습니다 .


1
# 2를 명확히 할 수 있습니까? 각 요청에서 구성 요소 트리를 다시 만들 수없는 이유는 무엇입니까? 요청 사이에 실제로 어떤 상태를 저장해야하며 그 이유는 무엇입니까? 요청 사이에 구성 요소 트리를 저장하는 유일한 이유는 성능 때문인 것 같습니다.
라이언

여기에 더 초점을 맞춘 질문 : stackoverflow.com/questions/7349174/...
라이언

당신의 대답은 나에게 매우 분명했습니다! JSF 성능 및 확장성에 관한 문제는 프로그래머의 구현과 본질적인 관계가 있습니다! 올바른 방법으로 기술을 사용하는 것을 알아야합니다!
Lucas Batistussi 2012

"그냥 appserver에 충분한 메모리를 제공하십시오." 음, 수천 개의 동시 사용자 세션에 대해 이야기하고 있다면 여기서 엔터프라이즈 수준의 이야기를하고 있다는 인상을받습니다. 기업에 엔터프라이즈 급 장비가있는 경우 집의 Linux 상자 에서처럼 "애플리케이션 서버에 충분한 메모리를 제공"할 수 없습니다.
stu dec

귀하의 답변은 매우 명확했으며 감사합니다. javax.faces.PARTIAL_STATE_SAVING을 true로 설정하면 JSF 플래시 범위가 사라지는 이유는 무엇입니까? getFacesContext (). getExternalContext (). getFlash (). put ( "buildingId", buildingId).
May Thet
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.