아파치 위켓

**아파치 위켓**(Apache Wicket)은 보통 **위켓**이라고 불리며, 자바 프로그래밍 언어를 위한 컴포넌트 기반 웹 프레임워크로, 개념적으로 자카르타 페이스 및 태피스트리와 유사하다. 이 프레임워크는 조너선 로크가 2004년 4월에 처음 작성했다. 버전 1.0은 2005년 6월에 출시되었다. 2007년 6월에는 아파치 최상위 프로젝트로 승격되었다.

## 원리
기존의 모델-뷰-컨트롤러 (MVC) 프레임워크는 전체 요청과 전체 페이지 단위로 작동한다. 각 요청 주기에서 들어오는 요청은 컨트롤러 객체의 메서드에 매핑되며, 이 메서드는 일반적으로 모델에서 데이터를 가져와 특수 템플릿 마크업으로 작성된 뷰를 채움으로써 나가는 응답 전체를 생성한다. 이는 애플리케이션의 흐름을 단순하고 명확하게 유지하지만, 컨트롤러에서의 코드 재사용을 어렵게 만들 수 있다.

반면, 위켓은 상태 유지 GUI 프레임워크(예: 스윙)를 면밀히 본떠 만들어졌다. 위켓 애플리케이션은 컴포넌트 트리로 구성되어 있으며, 스윙 컴포넌트가 마우스 및 키 입력 이벤트에 반응하는 것과 동일한 방식으로 리스너 델리게이트를 사용하여 링크 및 폼에 대한 HTTP 요청에 반응한다. 위켓은 컴포넌트 기반 프레임워크로 분류된다.

## 설계
위켓은 템플릿을 위해 순수 XHTML을 사용한다(이는 프레젠테이션과 비즈니스 로직의 명확한 분리를 강제하며, 템플릿을 일반적인 위지위그 디자인 도구로 편집할 수 있게 한다). 각 컴포넌트는 XHTML의 이름 지정된 요소에 바인딩되며, 최종 출력에서 해당 요소를 렌더링하는 역할을 담당한다. 페이지는 단순히 최상위 컨테이너 컴포넌트이며, 정확히 하나의 XHTML 템플릿과 짝을 이룬다. 특별한 태그를 사용하여 개별 컴포넌트 그룹을 패널이라는 단일 컴포넌트로 추상화할 수 있으며, 이 패널은 해당 페이지, 다른 페이지 또는 다른 패널에서도 통째로 재사용할 수 있다.

각 컴포넌트는 자체 모델에 의해 지원되며, 이는 컴포넌트의 상태를 나타낸다. 프레임워크는 컴포넌트가 모델과 어떻게 상호 작용하는지 알지 못하며, 모델은 요청 간에 자동으로 직렬화되고 지속되는 불투명한 객체로 처리된다. 그러나 더 복잡한 모델은 분리 가능하게 만들어져 각 요청 주기 시작 및 끝에서 자체 저장 및 복원을 처리하는 훅을 제공할 수 있다. 위켓은 특정 객체 지속성 또는 ORM 계층을 강제하지 않으므로, 애플리케이션은 종종 하이버네이트 객체, EJB 또는 POJO의 조합을 모델로 사용한다.

위켓에서는 모든 서버 측 상태가 자동으로 관리된다. HttpSession 객체나 유사한 래퍼를 직접 사용하여 상태를 저장해서는 안 된다. 대신 상태는 컴포넌트와 연결된다. 각 서버 측 페이지 컴포넌트는 상태 유지 컴포넌트의 중첩된 계층 구조를 가지며, 각 컴포넌트의 모델은 결국 POJO(Plain Old Java Object)이다.

위켓은 단순함을 지향한다. 위켓에는 배워야 할 설정 파일이 없다. 위켓은 컴포넌트 구조에 대한 일관된 접근 방식을 가진 단순한 클래스 라이브러리이다.

## 예시
네 개의 파일로 구성된 헬로 월드 위켓 애플리케이션:
; HelloWorld.html
: XHTML 템플릿.
 
```xml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd"
      xml:lang="en" lang="en">

<body>
    <span wicket:id="message" id="message">Message goes here</span>
</body>
</html>
```


; HelloWorld.java
: 템플릿에 바인딩될 페이지 컴포넌트. 이 컴포넌트는 다시 자식 컴포넌트(이름이 "message"인 Label 컴포넌트)를 바인딩한다.

```java
package org.wikipedia.wicket;

import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;

public class HelloWorld extends WebPage {
    /**
     * Constructor
     */
    public HelloWorld() {
        add(new Label("message", "Hello World!"));
    }
}
```


; HelloWorldApplication.java
: 홈페이지 요청을 HelloWorld 페이지 컴포넌트로 라우팅하는 주 애플리케이션 클래스.

```java
package org.wikipedia.wicket;

import org.apache.wicket.protocol.http.WebApplication;

public class HelloWorldApplication extends WebApplication {
    /**
     * Constructor.
     */
    public HelloWorldApplication() {
    }

    /**
     * @see org.apache.wicket.Application#getHomePage()
     */
    public Class getHomePage() {
        return HelloWorld.class;
    }
}
```


; web.xml
: 서블릿 애플리케이션 배포 기술자, 위켓을 서블릿의 기본 핸들러로 설치하고 시작 시 HelloWorldApplication이 인스턴스화되도록 구성한다.

```xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                             http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         id="WebApp_ID" version="2.5">
    <display-name>Wicket Example</display-name>
    <filter>
        <filter-name>HelloWorldApplication</filter-name>
        <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
        <init-param>
            <param-name>applicationClassName</param-name>
            <param-value>org.wikipedia.wicket.HelloWorldApplication</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>HelloWorldApplication</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>
```


## 구성요소
폼, 링크, 리피터 등과 같은 기본 구성요소가 내장되어 있다.

## 릴리스
}
|}

## 같이 보기

* 바딘
* 태피스트리
* 클릭
* ZK
* 리치페이스
* 에코

## 각주

* 
* 
* 
* 
* 

### 내용주

## 외부 링크

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