 |
|
난이도 : 중급 Sachin K Mahajan , Software Developer, IBM
원문 게재일 : 2009 년 9 월 22 일 번역 게재일 : 2009 년 10 월 27 일 Quercus는 Java™ 기술과 PHP를 함께 사용하여 웹 서비스와
애플리케이션을 작성할 수 있는 새로운 도구입니다. Quercus 프레임워크에는 Java와 PHP가 서로 통합되어 있기 때문에 Spring, Hibernate
등의 유용한 Java 라이브러리를 애플리케이션에 쉽게 통합할 수 있습니다. 이 기사에서는 약간의 코드
샘플과 함께 이 프레임워크에 대해 간략하게 설명합니다. 간단한 HelloWorld 샘플을 사용하여 이 프레임워크의
기능과 장점을 살펴본 후 마지막으로 프레임워크 아키텍처에 대해 설명하고 실제 예제를 자세히 살펴봅니다.
소개
Quercus는 순수하게 Java로 구현된 오픈 소스 PHP 5 엔진이다. Quercus 문서에 따르면
Quercus는 Resin 애플리케이션 서버를 기반으로 실행되고 로드 밸런싱, 프록시 캐싱 등의 Resin 기능을
사용한다. 이 기사에서는 Apache Tomcat을 기반으로 Quercus를 실행하면서 그 기능에 대해 설명한다. 또한
PHP와 Java가 통합되어 있는 Quercus를 통해 웹 서비스와 애플리케이션을 쉽고 유연하게 작성하는 방법도
보여 준다.
Quercus를 사용해야 하는 이유
Quercus PHP 라이브러리는 온전히 Java로 구현되어 있기에 Java 및 PHP 애플리케이션에서
모두 사용할 수 있다는 장점이 있다. Java와 PHP가 완벽하게 통합되어 있기 때문에 Quercus 애플리케이션에서는
Java 기술과 Spring, Hibernate, SOA 프레임워크 등의 프레임워크를 사용할 수 있다. 이 상호 운용성을
활용하기 위해 Quercus에서는 PHP에서 Java 라이브러리를 호출할 수 있는 API를 제공한다.
기타 장점은 다음과 같다.
- 손쉬운 개발: 이 PHP 라이브러리는 Java로 구현되어 있으므로 빠르고 안정적인
성능을 제공하는 동시에 사용하기도 쉽다. 또한 C 기반 PHP 구현에서 발생하는 세그멘테이션 오류와
C 포인터 오버런 문제가 발생하지 않는다.
- 확장성: Java를 기반으로 구현되어 있으므로 Quercus는 Resin 및 Apache
Tomcat과 같은 애플리케이션 서버에서 실행된다. 따라서 애플리케이션 서버에서 제공하는 모든
기능(연결 풀링, 분산 세션 등)을 사용할 수 있다.
- 국제화: Java로 구현한 PHP이므로 기본적으로 16비트 유니코드 문자열 및 함수가 지원된다.
Quercus 설치하기 Quercus는
jar 파일을 Java 애플리케이션에 설치하는 것처럼 간단하게 설치할 수 있으며 Resin 애플리케이션
서버의 기능이므로 Resin에 포함되어 있다. 또한 Quercus는 PHP 엔진의 역할을 수행하므로 PHP 엔진을
다운로드하지 않아도 된다. Quercus를 설치하려면 다음 단계를 수행한다.
- 회사 웹 사이트에서 Resin 애플리케이션 서버를 다운로드한다(참고자료 참조).
- zip 파일을 열고 quercus.jar, resin-util.jar, javamail-141.jar 등의 jar 파일을 압축 풀기한다.
- 이러한 파일을 MySQL 커넥터 jar 파일(필요한 경우)과 함께 웹 애플리케이션의 WebContent\WEB-INF\lib 폴더에 복사한다.
- 또는 이 기사의 끝에서 제공하는 압축된 샘플 애플리케이션을 사용하여 이 위치에서
라이브러리를 쉽게 복사할 수 있다(다운로드 참조).
Quercus 시작하기 Quercus의
기능을 설명하기 위해 이 기사에서는 간단한 HelloWorld 예제를 제공한다. 이 애플리케이션은 다음과
같은 단계를 통해 작성할 수 있다. (이 기사에서는 Eclipse IDE를 사용하여 모든 애플리케이션을 작성했으며
관련된 단계를 쉽게 알 수 있도록 스크린샷을 제공한다. 원하는 IDE를 사용할 수도 있다.)
아래 단계에서 설명하려는 기본 내용은 동적 웹 애플리케이션 프로젝트를 작성한
후 애플리케이션 서버 런타임(이 경우에는 Apache Tomcat)을 가리키도록 지정하고 php.ini 및 web.xml과
같은 매개변수를 구성하는 것이다.
- 그림 1과 같이 IDE(여기에서는 Eclipse) 내에서 새 웹 프로젝트를 작성한다(Alt + Shift + N).
그림 1. 새 프로젝트 작성하기
- 프로젝트 이름과 대상 런타임을 입력한다. 그림 2에서 샘플 설치 화면을 볼 수 있다.
- File --> New(Alt + N)를 클릭한 후 기본 작업 공간에서 TestHelloWorld라는
새 동적 웹 애플리케이션을 작성한다.
- 여기에서는 Apache Tomcat 버전 5.5를 애플리케이션의 런타임 환경으로 구성했다.
그림 2. 새 프로젝트 설정하기
- 그림 3과 같이 Quercus 및 관련 jar가 포함된 구조를 복제한다. 또한 WebContent, META-INF(매니페스트
또는 컨텍스트 파일 포함), JavaScript resources 등의 폴더를 작성한다.
그림 3. 디렉토리 구조 설정하기
TestHelloWorld 프로젝트의 루트 디렉토리에는 다음과 같은 폴더가 있다.
- WebContent: 이 디렉토리에는 lib 폴더에 quercus.jar 등의 라이브러리를 포함하는 WEB-INF
디렉토리와 Manifest.mf 파일에 대한 META-INF 디렉토리가 있다. WEB-INF 폴더에는 php, jsp, html 파일
등과 같이 웹 애플리케이션에 사용할 정적 및 동적 컨텐츠도 있다.
-
Java Resources: 이 디렉토리에는 Apache Tomcat, JRE 및 웹 애플리케이션 라이브러리와 같은 라이브러리가 있다.
- JavaScript resources: 이 디렉토리에는 프로젝트에 포함할 모든 리소스가 있다.
서버는 IDE를 통해 작성하고 구성할 수 있으며 정상 또는 디버그 모드에서 실행할 수 있다(그림 4 참조).
Eclipse의 J2EE Perspective에는 마우스 오른쪽 단추를 클릭했을 때 새 서버를
작성할 수 있는 옵션을 제공하는 서버 탭이 있다(그림 4 참조). 이 서버는 Eclipse IDE에서
애플리케이션 서버를 관리하는 데 사용할 수 있다.
그림 4. 새 서버 구성 설정하기
별다른 요구 사항이 없는 한 기본값을 선택하여 새 서버를 정의할 수 있다(그림 5
참조). 서버 런타임은 프로젝트를 작성할 때 선택했던 것과 같은 런타임이다(이 경우에는 Apache Tomcat 버전 5.5).
그림 5. 새 서버 구성을 위해 선택한 옵션
- 서버를 구성한 후에는 왼쪽 "available" 열에 있는 리소스를 오른쪽 "configured" 열에 추가할 수 있다.
새 서버를 구성한 후에는 새로 작성된 리소스를 서버에서 구성해야 한다(그림 6 참조). 이
서버 구성은 개발 작업 중에 작성한 리소스를 전개한다.
그림 6. 서버의 리소스 구성
Quercus 구성하기
php.ini 파일은 디렉토리 설정, 파일 경로, 세션 변경 등과 같은 PHP 동작을 구성하는
데 사용되며 web.xml 파일에서 지정할 수 있다. Listing 1에서는 이 파일의 예제를 보여 준다.
Listing 1. web.xml 파일에서 php.ini 지정하기
<init-param>
<param-name>ini-file</param-name>
<param-value>WEB-INF/php.ini</param-value>
</init-param>
|
PHP 소스 파일의 인코딩은 스크립트 인코딩을 통해 지정되며 Listing 2와 같이 정의된다.
Listing 2. web.xml에 지정된 PHP 인코딩 스펙
<init-param>
<param-name>script-encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
|
QuercusServlet은 php 파일을 구문 분석하는 Quercus 엔진에 대한 인터페이스이며 일반적으로 Listing 3처럼 구성된다.
Listing 3. web.xml 파일의 QuercusServlet 구성
<web-app xmlns=”http://java.sun.com/xml/ns/j2ee”
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=”http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd”
version=”2.4”>
<description>Quercus Hello World on Tomcat</description>
<servlet>
<servlet-name>Quercus Servlet</servlet-name>
<servlet-class>com.caucho.quercus.servlet.QuercusServlet</servlet-class>
|
Quercus Hello World php 파일(index.php)에 대한 설명
index.php 파일은 Java 오브젝트를 인스턴스화하는 getTheDate
메소드를 정의한다. Quercus에서는 import 문을 통해 Java 클래스를 사용할 수 있기 때문에 상호 운용성과
유연성이 매우 높다. Listing 4에서는 예제를 보여 준다. Listing 4. PHP import 함수의 예제
<?php
function getTheDate() {
import java.util.Date;
$currentDate = new Date();
return $currentDate;
}
?>
|
Listing 5의 코드에서는 HTML 조각에 포함된 getTheDate() 및
phpinfo() 메소드 호출을 보여 준다.
Listing 5. getTheDate() 및 phpinfo() 호출
<body>
<h1>This is the Hello World page</h1>
<h3>but, it does something more then Hello World!</h3>
<h4> The current date and time is :<?php echo getTheDate() ?></h4>
<h4> and finally here is the phpInfo: <?php echo phpinfo()?>
</body>
|
코드를 변경한 후에는 HelloWorld 애플리케이션을 테스트하기 위해 서버를 시작해야
한다. 서버를 작성하려면 앞에서 작성한 서버 구성을 마우스 오른쪽 단추로 클릭한 다음 Run
또는 Debug 옵션을 클릭한다.
그림 7. 디버그 또는 실행 모드로 서버 시작하기
그림 8에서는 서버를 시작하고 url로 이동한 이후의 최종 출력을 보여 준다.
기사의 끝에 있는 샘플 파일 HelloWorld.zip에는 압축된 버전의 애플리케이션이 있다(다운로드
참조). 그리고 Eclipse IDE로 직접 끊김 없이 가져올 수 있도록 Eclipse에 필요한 메타데이터 파일도
들어 있다.
그림 8. Hello World 페이지의 출력
Quercus의 실제 예제 이제
실제 예제를 살펴보자. 그림 9에서는 신규 고객 추가, 고객 검색, 데이터베이스의 모든 고객 보기 등의
작업을 수행할 수 있는 Manage Customer 페이지의 예제를 보여 준다.
그림 9. Manage Customer 애플리케이션의 흐름
위 다이어그램에서 보듯이 Tomcat이 HTTP 요청을 받는다. web.xml의 구성은 php
파일을 구문 분석하도록 QuercusServlet 오브젝트를 정의한다. 이 오브젝트는 Quercus 라이브러리와
통신하는 Java 서블릿이다. 이 샘플 애플리케이션에서는 php 파일 내에서 인스턴스화된 PDO
오브젝트가 MySQL 커넥터를 통해 MySQL 데이터베이스 연결을 인스턴스화한다. PDO(PHP Data
Object)는 준비된 명령문과 같은 고급 기능을 포함하여 일관된 방식으로 데이터베이스 액세스를
제공한다.
Manage Customer 애플리케이션의 디렉토리 구조(그림 10 참조)는 HelloWorld 예제에서
설명한 것과 동일한 패턴 디렉토리 구조를 따른다.
그림 10. Manage Customer 애플리케이션의 디렉토리 구조
이 애플리케이션의 핵심 파일은 다음과 같은 WebContent 폴더의 서브디렉토리에 있다.
- META-INF: 이 디렉토리에는 MySQL 데이터베이스 연결에 필요한 데이터베이스 신임 정보가 있다.
- WEB-INF: 이 디렉토리에는 애플리케이션을 실행하는 데 필요한 Quercus jar 등의
파일이 포함된 lib 폴더가 있다. 데이터 소스를 설명하는 web.xml도 있다.
- 관련된 모든 php 및 html 파일은 WebContent 폴더에 있다. 이러한 파일은 웹
애플리케이션에 동적 및 정적 컨텐츠를 제공하는 애플리케이션의 보기 파트 역할을 수행한다.
기사의 끝에 있는 샘플 파일 ManageCustomer.zip에는 압축된 버전의 애플리케이션이
있다(다운로드 참조). 그리고 Eclipse IDE로 직접 끊김 없이 가져올 수 있도록 Eclipse에 필요한 메타데이터 파일도
들어 있다.
Tomcat 및 MySQL의 구성
Tomcat의 구성은 HelloWorld 애플리케이션과 매우 비슷하다. 또한 Listing 6과 같이
리소스 참조를 정의해야 한다. 이 요소는 리소스 관리자 연결 팩토리 참조의 이름을 지정하며 이
경우에는 jdbc/mysql에 지정된 javax.sql.DataSource 형식의 데이터베이스 연결이다. Listing 6. 리소스 참조 정의 web.xml
web.xml
. . .
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/mysql</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
. . .
|
WebContent/META-INF 폴더에 있는 context.xml에서 Listing 7과 같이 연결 리소스를
정의해야 한다. 이 파일에는 드라이버 이름, jndi 이름, 사용자 이름, 암호, 데이터 형식, url
등의 특성이 있다. Listing
7. context.xml에 정의된 특성
context.xml
. . .
<Context>
<Resource driverClassName="com.mysql.jdbc.Driver"
maxActive="4" maxIdle="2" maxWait="5000" auth="Container"
name="jdbc/mysql" password="" type="javax.sql.DataSource"
url="jdbc:mysql://localhost:3306/customer" username="root"/>
</Context>
. . .
|
customer 데이터베이스에는 다음과 같은 스크립트를 실행하여 작성할 수 있는 단일 테이블이 있다.
use customer;
CREATE TABLE users (
id INT NOT NULL PRIMARY_KEY AUTO_INCREMENT,
name VARCHAR(200)
);
|
이제 HelloWorld 애플리케이션을 살펴보면서 설명했던 구성 단계 즉, 새 서버 구성을 작성하고,
리소스를 추가하고, 디버그 또는 실행 모드에서 서버를 시작하는 등의 단계를 이 애플리케이션에서도 유사한
방법으로 적용할 수 있다.
애플리케이션 요약
애플리케이션의 인덱스 페이지에는 사용자가 수행할 수 있는 작업 목록이 표시된다(그림 11 참조).
그림 11. Manage Customer 인덱스 페이지
지원되는 작업은 다음과 같다.
- 고객 추가
- 고객 검색
- 모든 고객 보기
- 모든 고객 삭제
모든 작업을 보여 주는 index.html 페이지는 고유한 작업을 수행하는 여러 개별
양식으로 구성되어 있다. "Add Customer"를 보면서 자세히 살펴보자. 해당 html에는 addCustomer.php에
대한 참조가 양식 동작으로 POST 메소드와 함께 포함되어 있다.
<H2>Add Customer</H2>
<form action="addCustomer.php" method="post">
<label>Customer name</label>
<input type="text" id="customerName" name="customerName"/>
<input type="submit" value="Add"/>
</form>
|
동작의 php 코드는 POST에서 customerName 매개변수를 추출한
다음 삽입 작업을 위한 sql 명령문을 작성한다. 그런 다음 데이터 소스의 jndi 이름이 전달되면서 PHP
데이터 오브젝트가 인스턴스화된다.
<?php
$custName = $_POST['customerName'];
$pdo = new PDO("java:comp/env/jdbc/mysql");
$sql = "insert into users values ('" . $custName . "');";
$rows = $pdo->exec($sql);
if ($rows>0) {
echo("<h4> Adding ". $custName . " was successful</h4>");
}
else echo('<h4> An error occurred</h4>');
?>
|
Look Up, View All 및 Delete 작업도 비슷한 방식으로 구현되었다(다운로드 섹션에 첨부된 소스 코드 참조).
그림 12. View all Customers 페이지
결론 이
기사에서는 Apache Tomcat을 기반으로 실행 중이면서 MySQL 데이터베이스에 연결된 Quercus의 기능을
살펴보았다. Quercus는 100% Java로 구현된 PHP 프레임워크이므로 Spring, Hibernate 등의 Java 기반
프레임워크를 활용할 수 있다. Quercus는 PHP 패싯을 지원하므로 유용성이 매우 높으며 핵심 프레임워크가
Java로 구현되었기 때문에 높은 성능과 확장성을 제공한다.
다운로드 하십시오 | 설명 | 이름 | 크기 | 다운로드 방식 |
|---|
| Sample code | TestHelloWorld.zip | 1.7MB | HTTP |
|---|
| Sample code | ManageCustomer.zip | 1.9MB | HTTP |
|---|
참고자료 교육
제품 및 기술 얻기
필자소개  | |  | 미국 솔트레이크시티에 소재한 유타 대학교에서 석사 학위를 받은 Sachin은 미국과 인도의
크고 작은 여러 회사에서 다양한 기술 및 관리 업무를 수행했다. 현재는 IBM Software Group의
Lotus 부서 소속으로 활동하고 있다. |
기사에 대한 평가
 |
| 이 문서 북마킹 하기
|
|