2011-03-03 3 views
2

NBP (Netbeans Platform)로 구현 된 리치 클라이언트가 포함 된 프로젝트를 시작한 후 비즈니스 로직을 구현하고 데이터 액세스를 위해 Spring 프레임 워크가 선택되었습니다. 웹 응용 프로그램 개발 배경에서 나온 이래로 몇 가지 질문이 있으며 몇 가지 제안을 원합니다.다중 계층 엔터프라이즈 애플리케이션의 NBP 리치 클라이언트는 무엇입니까?

  1. 리치 클라이언트가 Spring과 통합하기위한 옵션은 무엇입니까?
  2. 다중 계층 Java EE 환경에서 리치 클라이언트와 관련된 모범 사례/서적/문서는 무엇입니까?
  3. 특별한주의가 필요한 것은 무엇입니까?

답변

1

우리는 최근 내가 일하는 회사에서 비슷한 경험을했습니다. 슬프게도, 우리는 그 과정에 대한 확실한 지침을 찾을 수 없었습니다. 우리가 발견 한 것은 여기 저기에서 부분적인 안내자들이었습니다. 나는 다른 사람들이이 문제를 어떻게 다뤘는지 확신 할 수 없으며 다른 해결책이 여기에 게시되어 있는지 열망합니다. 그러나 우리가 어떻게 처리했는지 그리고 우리가 경험 한 것을 배울 수 있기를 바랍니다.

처음부터 우리는 Spring의 어떤 버전 (그리고 우리의 경우 최대 절전 모드)을 사용할 것인지를 제어 할 수 있기를 원한다는 것을 알았다. 당연히 NetBeans IDE에 내장 된 버전은 약간 날짜가 있기 때문에 우리는 서버 코드를 개발할 때 최신 버전을 사용할 수 있기를 원했습니다.

우리가 한 일은 서버 코드 (서비스, DAO 및 도메인 엔터티)와 클라이언트 응용 프로그램을위한 두 개의 개별 프로젝트를 만드는 것이 었습니다. 그런 다음 서버 코드를 jared하고 jar와 그 종속성을 클라이언트 프로젝트에 복사 한 다음 해당 jar를 클라이언트 코드의 종속성으로 나열했습니다. SpringHibernate라는 NetBeans 프로젝트에 모듈을 만들었습니다.이 모듈은 거의 모든 다른 모듈이 사용하는 jar 파일을 포함하고 있습니다.

NetBeans 프로젝트에 Jars를 추가하기 전에 jar의 버전 번호를 제거하는 ant 태스크를 만드는 것이 좋습니다. 따라서 클라이언트 코드가 차이점을 알지 못해도 서버 코드에서 jar 파일을 완벽하게 업데이트 할 수 있습니다. (NetBeans는 병을 제거하고 다시 추가하기 시작할 때 까다로운 도구 일 수 있습니다.)

첫 번째 주요 작업은 applicationContext.xml을로드하고 컨텍스트에서 빈을 반환 할 수있는 Util 클래스를 만드는 것입니다. 이 과정은 here으로 요약됩니다.

우리가 쳤던 주요 장애물 중 하나는 세션 (또는 JPA 용어로 EntityManagers)을 만드는 것입니다. NetBeans 플랫폼은 스레드가 많은 환경이며 EntityManagers는 단일 스레드에서만 작동하도록 설계되었습니다. 이 문제를 해결하기 위해 우리는 열린 세션에서 열린 세션을 진행했습니다. 요청한 모든 스레드에 동일한 EntityManager를로드 할 수있는 클래스를 작성했습니다. 그런 다음 서비스의 클라이언트 프록시를 생성하여 실제 Spring 관리 서비스를 호출하기 전에 스레드에 EntityManager를로드합니다. 클라이언트 프록시 서비스를 만드는 데 추가 된 보너스는 @ServiceProvider 주석을 사용하여 Lookup.getDefault().lookup(Service.class)으로 찾을 수 있다는 것입니다.

그런 다음 응용 프로그램 종료시 EntityManager 및 EntityManagerFactory를 해체하고 닫을 수있는 create a custom LifeCycleManager이어야합니다.

도움이 되었기를 바랍니다.

* Open Session in View가 AntiPattern으로 labeled 이었음을 알고 있습니다. 그러나 관련된 문제를 이해하는 한, 시간이 지남에 따라 변경되지 않는 개체를 캐싱하고 스마트하게 만듭니다 데이터베이스 호출 등).또한 우리 연구 결과 Gavin King의 포럼 게시물에서 Open Session In View가 클라이언트 응용 프로그램의 권장 경로임을 알았습니다. 당연히, 나는 지금 지점을 찾을 수 없다. 그러나 그것은 어딘가에있다.

관련 문제