15.3. JavaServer Faces

15.3.1. DelegatingVariableResolver

JSF 웹 계층과 스프링의 미들티어와 연동하는 가장 쉬운 방법은 DelegatingVariableResolver 클래스를 사용하는 것입니다.

faces-context.xml 파일을 다음과 같이 수정합니다.

<faces-config>
  <application>
    <variable-resolver>org.springframework.web.jsf.DelegatingVariableResolver</variable-resolver>
      <locale-config>
        <default-locale>en</default-locale>
        <supported-locale>en</supported-locale>
        <supported-locale>es</supported-locale>
      </locale-config>
      <message-bundle>messages</message-bundle>
    </application>
</faces-config>

DelegatingVariableResolver는 먼저 값을 가져오는 것을 JSF 구현체의 기본 리졸버에게 위임할 것이고, 그 다음에 스프링의 비즈니스 문맥이 담긴 WebApplicationContext에 위임합니다. 이 방법을 사용해서 간단하게 JSF에 의해 관리되는 bean들에 의존성을 주입할 수 있습니다.

JSF가 관리하는 bean들은 faces-config.xml에 정의 되어 있으며 아래의 예제에서 #{userManager}는 스프링의 비즈니스 문맥으로부터 가져오는 bean을 나타냅니다.

<managed-bean>
  <managed-bean-name>userList</managed-bean-name>
    <managed-bean-class>com.whatever.jsf.UserList</managed-bean-class>
  <managed-bean-scope>request</managed-bean-scope>
  <managed-property>
    <property-name>userManager</property-name>
    <value>#{userManager}</value>
  </managed-property>
</managed-bean>

15.3.2. FacesContextUtils

faces-config.xml에 있는 bean들(JSF 빈)의 한 프로퍼티를 주입할 때는 위와 같은 방법이 용이합니다. 그러나 명시적으로 스프링 bean이 왕창 필요할 때는  FacesContextUtils를 사요할 수 있습니다.

ApplicationContext ctx = FacesContextUtils.getWebApplicationContext(FacesContext.getCurrentInstance());

WebApplicationContextUtils 와 사용법은 유사하며 차이점은 인자로 facesContext를 넘겨준다는 것입니다.

15.2. Common configuration

웹과 관련된 것들은 별도의 레이어에 위치하고 있으며, 그들이 필요로 하는 내부 서비스와 DAO Bean들은 Facade를 통해서 사용합니다. 이 때 이러한 bean들을 등록하는 방법은 간단합니다.

web.xml에 다음과 같이 ContextLoaderListner를 등록하면 됩니다.

<listener>
   <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

그리고 contextConfigLocation <context-param/>을 사용해서 설정 파일의 위치를 알려줍니다.

<context-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>/WEB-INF/applicationContext*.xml</param-value>
</context-param>

contextConfigLocation을 명시적으로 설정하지 않으면 기본으로 /WEB-INF/applicationContext.xml 파일을 찾게 됩니다.

설정 파일을 읽어들이면, WebApplicationContext를 생성하고 이것을 웹 애플리케이션의 ServletContext에 저장합니다.

모든 자바 웹 프레임워크는 Servlet API를 기반으로 만들어졌기 때문에, 다음의 코드를 사용해서 ‘비즈니스 bean’들을 담고 있는 컨테이너에 접근할 수 있습니다.

WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);

위의 메소드 ApplicationContext가 존재하지 않을 때, null을 반환합니다. 따라서 저것 대신에getRequiredWebApplicationContext() 을 사용하면 NullPointerException 대신에
ApplicationContext가 존재하지 않는 다는 예외를 던져줍니다.

앞으로 살펴볼 웹 프레임워크들에서 WebApplicationContext를 위와 같은 방법으로 얻은 다음 스프링이 관리하는 bean들을 얻을 수 있습니다. 하지만 대부분의 웹 프레임워크들은 스프링이 관리하는 bean을 얻기 위한 편리한 방법들을 제공해줌과 동시에 컨트롤러에서 의존성 삽입도 사용할 수 있도록 해줍니다.

Integrating with other web frameworks

15.1. Introduction

이번 챕터는 스프링과 제 3의 웹 프레임워크인 Struts, JSF, Tapestry, WebWork와의 연동에 해대 다룹니다. 스프링 프레임워크가 가지고 있는 핵심 가지 중에 하나가 바로 선택이 가능하다는 것입니다. 스프링은 어떠한 방법론, 아키텍처, 프레임워크도 강요하지 않으며, 그저 개발자나 개발팀에게 익숙한 것들을 사용하면 됩니다.

15.2. Common configuration

각각의 프레임워크와의 연동을 살펴보기 전에, 어떤 프레임워크를 선택하든지 상관없이 꼭 필요로 하는 설정을 살펴봅니다.

15.3. JavaServer Faces

JavaServer Faces (JSF)는 컴포넌트 기반의 인기 급상승 중인 이벤트 주도 웹 프레임워크입니다. Spring과 JSF 연동에서 핵심적인 클래스는 DelegatingVariableResolver 클래스입니다..

15.4. Struts

Struts는 자바 애플리케이션의 사실상 표준de facto 웹 프레임워크입니다. 2001년 6월 출시된 이후 오랜 시간 사용되고 있기 때문입니다.

Craig McClanahan가 만들었으며, Struts Apache Software Foundation이 호스팅하는 오픈소스 프로젝트 입니다.

Spring과 Struts 연동에는 두 가지 방법이 있습니다.

  •     Action을 bean으로 스프링에서 관리하도록 설정하는 방법 : ContextLoaderPlugin을 사용하고 그들간의 종속성을 스프링 설정 파일에서 설정.
  •     스프링의 ActionSupport 클래스의 하위 클래스를 작성하고 스프링이 관리하는 빈을 getWebApplicationContext() 메소드를 사용하여 명시적으로 얻어가는 방법

15.5. Tapestry

  Tapestry is an open-source framework for creating dynamic, robust, highly scalable web applications in Java. Tapestry complements and builds upon the standard Java Servlet API, and so it works in any servlet container or application server.

15.6. WebWork

 WebWork is a Java web-application development framework. It is built specifically with developer productivity and code simplicity in mind, providing robust support for building reusable UI templates, such as form controls, UI themes, internationalization, dynamic form parameter mapping to JavaBeans, robust client and server side validation, and much more

15.7. Further Resources

Struts 홈페이지
JSF 홈페이지
Tapestry 홈페이지
WebWork 홈페이지
StrutsTI 프로젝트 위키