IBM®
메인 컨텐츠로 가기
    Korea [국가변경]    이용약관
 
 
   
        제품    서비스 & 솔루션    고객지원 & 다운로드    회원 서비스    
메인 컨텐츠로 가기

한국 developerWorks  >  웹 개발 | 오픈 소스  >

Java 기반 PHP 프레임워크 Quercus 소개

developerWorks
문서 옵션
PDF format - Fits A4 and Letter

PDF - Fits A4 and Letter
516KB (20 pages)

Get Adobe® Reader®

JavaScript가 필요한 문서 옵션은 디스플레이되지 않습니다.

샘플 코드

영어원문

영어원문


제안 및 의견
피드백

난이도 : 중급

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. 새 프로젝트 작성하기
새 Dynamic Web Project를 시작하는 Eclipse 인터페이스
  • 프로젝트 이름과 대상 런타임을 입력한다. 그림 2에서 샘플 설치 화면을 볼 수 있다.
    • File --> New(Alt + N)를 클릭한 후 기본 작업 공간에서 TestHelloWorld라는 새 동적 웹 애플리케이션을 작성한다.
    • 여기에서는 Apache Tomcat 버전 5.5를 애플리케이션의 런타임 환경으로 구성했다.

그림 2. 새 프로젝트 설정하기
TestHelloWorld에 대한 New Dynamic Web Project 대화 상자
  • 그림 3과 같이 Quercus 및 관련 jar가 포함된 구조를 복제한다. 또한 WebContent, META-INF(매니페스트 또는 컨텍스트 파일 포함), JavaScript resources 등의 폴더를 작성한다.

그림 3. 디렉토리 구조 설정하기
WEB-INF/lib 폴더 아래에 javamail-141.jar,quercus.jar 및 resin-util.jar가 있는 프로젝트 폴더

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. 새 서버 구성 설정하기
Eclipse 서버 구성. 사용자가 Tompacat 서버를 마우스 오른쪽 단추로 클릭하고 New, Server를 차례로 선택했다.

별다른 요구 사항이 없는 한 기본값을 선택하여 새 서버를 정의할 수 있다(그림 5 참조). 서버 런타임은 프로젝트를 작성할 때 선택했던 것과 같은 런타임이다(이 경우에는 Apache Tomcat 버전 5.5).


그림 5. 새 서버 구성을 위해 선택한 옵션
Tomcat v5.5 Server에 대한 기본값을 보여 주는 New Server 구성 대화 상자
  • 서버를 구성한 후에는 왼쪽 "available" 열에 있는 리소스를 오른쪽 "configured" 열에 추가할 수 있다.

새 서버를 구성한 후에는 새로 작성된 리소스를 서버에서 구성해야 한다(그림 6 참조). 이 서버 구성은 개발 작업 중에 작성한 리소스를 전개한다.


그림 6. 서버의 리소스 구성
New Server에 대한 리소스 구성



위로


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 페이지의 출력
간단한 텍스트와 현재 날짜 및 시간 그리고 실행 중인 PHP에 대한 정보 등을 보여 주는 애플리케이션 출력



위로


Quercus의 실제 예제

이제 실제 예제를 살펴보자. 그림 9에서는 신규 고객 추가, 고객 검색, 데이터베이스의 모든 고객 보기 등의 작업을 수행할 수 있는 Manage Customer 페이지의 예제를 보여 준다.


그림 9. Manage Customer 애플리케이션의 흐름
Manage Customer 애플리케이션의 아키텍처 다이어그램. Apache Tomcat은 왼쪽에 있는 클라이언트와 HTTP를 주고 받고 오른쪽에 있는 'PHP with HTML'과 통신한다. 그리고 PHP with HTML은 PHP 코드의 렌더링을 위해 Quercus를 호출한다. 백 엔드에서는 Quercus/PHP/HTML 조합이 MySQL 서버와 통신한다.

위 다이어그램에서 보듯이 Tomcat이 HTTP 요청을 받는다. web.xml의 구성은 php 파일을 구문 분석하도록 QuercusServlet 오브젝트를 정의한다. 이 오브젝트는 Quercus 라이브러리와 통신하는 Java 서블릿이다. 이 샘플 애플리케이션에서는 php 파일 내에서 인스턴스화된 PDO 오브젝트가 MySQL 커넥터를 통해 MySQL 데이터베이스 연결을 인스턴스화한다. PDO(PHP Data Object)는 준비된 명령문과 같은 고급 기능을 포함하여 일관된 방식으로 데이터베이스 액세스를 제공한다.

Manage Customer 애플리케이션의 디렉토리 구조(그림 10 참조)는 HelloWorld 예제에서 설명한 것과 동일한 패턴 디렉토리 구조를 따른다.


그림 10. Manage Customer 애플리케이션의 디렉토리 구조
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 인덱스 페이지
고객 이름을 추가하기 위한 텍스트 필드와 단추, 고객을 검색하기 위한 텍스트 필드와 단추 및 모든 고객을 보기 위한 단추가 제공되는 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 codeTestHelloWorld.zip1.7MBHTTP
Sample codeManageCustomer.zip1.9MBHTTP
다운로드 방식에 대한 정보


참고자료

교육

제품 및 기술 얻기


필자소개

미국 솔트레이크시티에 소재한 유타 대학교에서 석사 학위를 받은 Sachin은 미국과 인도의 크고 작은 여러 회사에서 다양한 기술 및 관리 업무를 수행했다. 현재는 IBM Software Group의 Lotus 부서 소속으로 활동하고 있다.




기사에 대한 평가


보다 나은 서비스를 제공하기 위함이오니 잠시 짬을 내어 이 양식을 제출하여 주십시오.



 


 


 


이 문서 북마킹 하기

mar.gar.in mar.gar.in naver naver eolin eolin del.icio.us del.icio.us





위로


developerWorks 콘텐트를 다른 사이트에 전재하기:
developerWorks 콘텐트에 대한 저작권은 IBM에 있습니다. IBM의 서면 허가나 원본 저자의 허락이 없이는 전재를 금합니다. 저희 콘텐트를 전재하시려면 IBM developerWorks 담당자 에게 문의하십시오.
    IBM 소개 개인정보 보호정책 문의