아파치 태피스트리

아파치 태피스트리(Apache Tapestry)는 오픈 소스 컴포넌트 지향 자바 웹 프레임워크로 개념적으로는 자바서버 페이스와 아파치 위켓과 유사하다. 태피스트리는 하워드 루이스 십이 만들었으며, 2006년 아파치 소프트웨어 재단에 의해 최상위 프로젝트로 채택되었다.Drobiazko 2012, p. 1.

태피스트리는 단순성, 사용 편의성 및 개발자 생산성을 강조한다. 거의 모든 XML 구성을 제거하여 설정보다 관례 패러다임을 따른다. 태피스트리는 웹 페이지의 각 사용자 인터페이스 컴포넌트(객체)와 해당 자바 클래스 간의 강력한 바인딩을 통해 웹 개발에 모듈식 접근 방식을 사용한다. 이 컴포넌트 기반 아키텍처는 웹오브젝트에서 많은 아이디어를 차용했다.Tapestry in Action - Preface by Howard Lewis Ship

 주요 기능 
 라이브 클래스 리로딩 태피스트리는 자바 페이지 클래스, 컴포넌트 클래스, 서비스 구현 클래스, HTML 템플릿 및 컴포넌트 속성 파일의 변경 사항을 파일 시스템에서 모니터링하고, 재시작 없이 실행 중인 애플리케이션에 변경 사항을 핫스왑한다. 이는 코드 저장-보기 피드백 주기를 매우 짧게 제공하여 개발자 생산성을 크게 향상시킨다고 주장된다.
 컴포넌트 기반 페이지는 작은 중첩 가능한 컴포넌트로 구성될 수 있으며, 각 컴포넌트는 템플릿과 컴포넌트 클래스를 가진다. 사용자 지정 컴포넌트는 구성하기에 사소한 것으로 알려져 있다.Drobiazko 2012, p. 20.
 설정보다 관례 태피스트리는 애플리케이션을 구성하기 위해 XML 대신 명명 규칙과 어노테이션을 사용한다.Drobiazko 2012, p. 7.
 HTTPSession의 절약적 사용 HTTPSession을 최소한으로 사용하여, 태피스트리는 클러스터링된 세션 복제 환경에서 고효율적으로 설계되었다.
 Post/Redirect/Get 대부분의 양식 제출은 Post/Redirect/Get (PRG) 패턴을 따르며, 이는 다중 양식 제출 오류를 줄이고 URL을 더 친근하게 만들고 북마크 가능하게 하며, 브라우저의 뒤로가기 및 새로고침 버튼이 정상적으로 작동하도록 한다.
 제어의 역전(IoC) 태피스트리는 구글 주스와 유사하지만, 태피스트리 동작의 거의 모든 측면을 구성하고 교체할 수 있도록 설계된 경량 제어의 역전 계층 위에 구축되었다.

 헬로 월드 예제 
최소한의 템플릿 태피스트리 애플리케이션은 세 개의 파일만 필요하다:

 HelloWorld.tml
 /helloworld 페이지용 (X)HTML 템플릿. 태피스트리 템플릿은 잘 형성된 (X)HTML 마크업을 포함할 수 있다.
 <!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd">
<body>
    <p>Hello, ${username}</p>
</body>
</html>

 HelloWorld.java
 템플릿과 연결된 페이지 클래스. 여기서는 템플릿이 접근할 수 있는 *username* 속성만 제공한다.
package org.example.demo.pages;

/** A page class (automatically associated with the template file of the same name) */
public class HelloWorld {

    /** An ordinary getter */
    public String getUsername() {
        return "World";
    }
}

 web.xml
 태피스트리를 서블릿 필터로 설치하는 서블릿 애플리케이션 배포 설명자.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app
        PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
    <display-name>Tapestry Example</display-name>
    <context-param>
        <!-- Tell Tapestry 5 where to look for pages, components and mixins -->
        <param-name>tapestry.app-package</param-name>
        <param-value>org.example.demo</param-value>
    </context-param>
    <filter>
        <!-- Define the Tapestry servlet filter -->
        <filter-name>app</filter-name>
        <filter-class>org.apache.tapestry5.TapestryFilter</filter-class>
    </filter>
    <filter-mapping>
        <!-- Tell the servlet container which requests to send to the Tapestry servlet filter -->
        <filter-name>app</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

 클래스 변환 
태피스트리는 런타임에 페이지 및 컴포넌트 클래스를 변환하기 위해 바이트코드 조작을 사용한다. 이 접근 방식은 페이지 및 컴포넌트 클래스를 간단한 POJO로 작성할 수 있게 하며, 몇 가지 명명 규칙과 어노테이션이 클래스 로드 시간에 상당한 추가 동작을 유발할 수 있다. 태피스트리 버전 5.0, 5.1 및 5.2는 자바시스트 바이트코드 조작 라이브러리를 사용했다. 이후 버전에서는 자바시스트를 ObjectWeb ASM을 기반으로 하는 Plastic이라는 새로운 바이트코드 조작 계층으로 대체했다.

 클라이언트 측 지원 
태피스트리 5 버전 5.3까지는 프로토타입과 script.aculo.us 자바스크립트 프레임워크를 태피스트리 특정 라이브러리와 함께 번들로 제공하여 Ajax 작업을 일급 시민으로 지원했다. 프로토타입/스크립타큘러스 대신 또는 추가로 jQuery를 통합하기 위한 서드 파티 모듈을 사용할 수 있다.

버전 5.4부터 태피스트리는 기본 제공 컴포넌트의 프로토타입 의존성을 제거하는 새로운 자바스크립트 계층을 포함하여, jQuery 또는 다른 자바스크립트 프레임워크를 플러그인할 수 있게 한다.

버전 5.4는 또한 RequireJS 모듈 로딩 시스템을 사용하는 자바스크립트 모듈 지원을 도입했다.

 핵심 원칙 
태피스트리 프로젝트 문서는 2008년 버전 5부터 모든 태피스트리 개발 결정을 지배하는 네 가지 "원칙"을 언급한다:

 정적 구조, 동적 동작—페이지 및 컴포넌트 구조는 기본적으로 정적이어서 대규모 페이지 및 컴포넌트 트리를 구성(및 세션 메모리에 저장)할 필요가 없다.
 적응형 API—프레임워크가 코드에 적응하도록 설계되었으며, 코드가 프레임워크에 적응하도록 하지 않는다.
 공개 API와 내부 API 구분—모든 API는 필수적으로 공개된 것을 제외하고는 명시적으로 "내부"(비공개)이다.
 하위 호환성 보장—태피스트리 개발자들은 태피스트리의 최신 버전으로 업그레이드하는 것이 항상 쉬울 것을 보장하기 위해 노력한다고 알려져 있다.

 비판 
태피스트리는 주요 버전 간의 하위 호환성이 부족하다는 비판을 받아왔으며, 특히 버전 4에서 버전 5로의 전환에서 기존 애플리케이션을 위한 깔끔한 마이그레이션 경로가 없었다는 점이 지적되었다. 프로젝트 팀원들은 이를 과거 태피스트리 사용자들에게 큰 문제였음을 인정했으며, 하위 호환성은 태피스트리가 앞으로 나아갈 주요 설계 목표가 되었다. 버전 5 개발 초기부터 하위 호환성은 태피스트리의 네 가지 새로운 "핵심 원칙" 중 하나로T 지정되었고, 나머지 세 가지 중 두 가지는 하위 호환성을 희생하지 않고 프레임워크의 진화를 가능하게 하기 위함이었다. 프로젝트 팀원들은 5.0 이후의 모든 태피스트리 릴리스가 높은 하위 호환성을 가졌다고 주장한다.

태피스트리 5에 대한 초기 비판은 문서 부족을 언급하기도 했다. 프로젝트 팀원들은 이제 완전히 개정되고 업데이트된 사용자 가이드 및 기타 문서를 통해 이러한 단점이 크게 해소되었다고 주장한다.

버전 5.0부터 태피스트리는 프로토타입 및 스크립타큘러스 자바스크립트 라이브러리를 번들로 제공했다. 하워드 루이스 십에 따르면, 2008-2009년경에는 이들이 합리적인 선택이었다. 그러나 이후 프로토타입의 인기는 하락했고, jQuery의 인기는 급증했다. 이에 대응하여 태피스트리 커뮤니티는 프로토타입 외에 또는 대신 jQuery를 사용할 수 있도록 하는 모듈을 개발했다. 한편, 현재 버전의 태피스트리인 5.4는 프로토타입에 대한 의존성을 완전히 제거하고, jQuery 또는 프로토타입(또는 잠재적으로 다른 자바스크립트 프레임워크)을 플러그인할 수 있는 호환성 계층으로 대체했다.

 다른 프레임워크와의 관계 
하워드 루이스 십에 따르면, 태피스트리는 당시에 오브젝티브-C로 작성되었고 비공개 소스였던 웹오브젝트에서 발견된 일반적인 개념과 접근 방식을 자바로 구현하려는 시도로 처음 고안되었다.

아파치 위켓의 창시자 조나단 로크에 따르면, 아파치 위켓은 초기 버전의 태피스트리의 복잡성에 대한 대응으로 개발되었다고 한다.

자바서버 페이스의 기본 뷰 기술인 페이스릿은 "산업 표준인 자바서버 페이스를 기반으로 하는 태피스트리 같은 프레임워크"의 필요성을 채우려는 시도로, 초기 버전의 태피스트리에서 영감을 받았다고 알려져 있다.

 역사 
 버전  날짜  설명  2000  하워드 루이스 십이 내부 사용을 위해 개발  2002-04  GNU 약소 일반 공중 사용 허가서에 따라 소스포지에서 처음으로 제공됨.  2004-04  아파치 산하 자카르타 서브프로젝트로 첫 릴리스.  2006-01  JDK 1.5 어노테이션, 새로운 입력 유효성 검사 서브시스템, 향상된 오류 보고 지원 도입  2008-12  태피스트리 4에서 거의 완전히 재작성되었으며, 설정보다 관례를 강조하는 새로운 POJO 기반 컴포넌트 모델을 도입하고, Hivemind를 새로운 노-XML 제어 역전 계층으로 대체했다.  2009-04  성능 및 메모리 개선, 자동 GZIP 압축, 자바스크립트 집계 기능이 추가되었지만 태피스트리 5.0과 하위 호환성을 유지했다.  2010-12  JSR 303 빈 유효성 검사가 추가되었다. 서비스 구현으로 라이브 클래스 리로딩이 확장되었다. 페이지 풀링이 제거되었다.  2011-11  HTML5 DOCTYPE 지원, 주입을 위한 JSR-330 어노테이션 지원, 성능 및 메모리 개선, 새로운 컴포넌트 추가, JavaAssist에서 ASM 바이트코드 조작으로 전환  2012-2014  버그 수정 및 사소한 개선 사항  2015-2019  주요 클라이언트 측 개선. 교체 가능한 jQuery/프로토타입 지원을 위한 새로운 자바스크립트 계층, 자바스크립트 모듈 시스템을 위해 Require.js 사용, 기본 스타일링을 위해 트위터 부트스트랩 사용.  2020-03  현재 안정 버전. 자바 12 바이트코드, 타입스크립트, 부트스트랩 4 지원.

 같이 보기 
 아파치 위켓
 웹 프레임워크 비교
 페이스릿
 자바 EE
 자바 뷰 기술 및 프레임워크

 각주 






 내용주 

 외부 링크 


분류:아파치 소프트웨어 재단 프로젝트
분류:웹 프레임워크
분류:자바 플랫폼, 엔터프라이즈 에디션