C++ xerces-c 파서를 이용한 프로그래밍 기초

Projects/CoVNC 2006.11.13 22:11 Posted by soulfree >동네청년<
http://xml.apache.org/xerces-c/에서 라이브러리를 다운로드 받아야 합니다. 이 사이트에서 “Xerces-C++ is a validating XML parser written in a portable subset of C++”

즉, C++로 XML를 파싱하도록 합니다. 몇개 파싱 라이브러리가 존재하는데 이 Parser는 Free입니다.아무튼 이 사이트에 있는 설치를 보고 설치합니다. lib, 그에 맞는 filepath를 Visual c++에 설정을 해야한다. 에러가 좀 많이 나서 DOM 기반 파서만 여기서 풀어놓겠습니다.

#include [xercesc/util/PlatformUtils.hpp]
#include [xercesc/util/XMLString.hpp]
#include [xercesc/util/Base64.hpp]
#include [xercesc/util/PlatformUtils.hpp]
#include [xercesc/parsers/AbstractDOMParser.hpp]
#include [xercesc/parsers/XercesDOMParser.hpp]
#include [xercesc/dom/DOMImplementation.hpp]
#include [xercesc/dom/DOMImplementationLS.hpp]
#include [xercesc/dom/DOMImplementationRegistry.hpp]
#include [xercesc/dom/DOMBuilder.hpp]
#include [xercesc/dom/DOMException.hpp]
#include [xercesc/dom/DOMDocument.hpp]
#include [xercesc/dom/DOMNodeList.hpp]
#include [xercesc/dom/DOMError.hpp]
#include [xercesc/dom/DOMLocator.hpp]
#include [xercesc/dom/DOMNamedNodeMap.hpp]
#include [xercesc/dom/DOMAttr.hpp]
#include [xercesc/dom/DOM.hpp]
#include [xercesc/dom/DOMNodeFilter.hpp]
#include [xercesc/framework/MemBufInputSource.hpp]
#include [xercesc/framework/MemBufFormatTarget.hpp]
#include [xercesc/framework/LocalFileFormatTarget.hpp]

   // Initialize the XML4C2 system.
   try
   {
       XMLPlatformUtils::Initialize();
   }

   catch(const XMLException& toCatch)
   {
       char *pMsg = XMLString::transcode(toCatch.getMessage());
       XERCES_STD_QUALIFIER cerr << "Error during Xerces-c Initialization.\n"
            << "  Exception message:"
            << pMsg;
       XMLString::release(&pMsg);
       return 1;
   }

1.  XML 생성하기  

DOMImplementation* impl =
  DOMImplementationRegistry::getDOMImplementation(X("Core"));

//(Root )노드 생성
DOMDocument* doc = impl->createDocument(
         0,                    // root element namespace URI.
         X(”company”),   // root element name
         0);                   // document type object (DTD).

DOMElement* rootElem = doc->getDocumentElement();  

// node 생성와 값에 대한 값을 넣는다.
// 노드 생성
DOMElement*  prodElem = doc->createElement(X(”product”));
rootElem->appendChild(prodElem);

// 그 노드에 맞는 값
DOMText*    prodDataVal = doc->createTextNode(X(”Xerces-C”));
          prodElem->appendChild(prodDataVal);

2. 생성한 XML 파일로 저장하기.  

static XMLCh*  gOutputEncoding = 0;

DOMWriter  *theSerializer = ((DOMImplementationLS*)impl)->createDOMWriter();

// set user specified output encoding
theSerializer->setEncoding(gOutputEncoding);
XMLFormatTarget *myFormTarget;

myFormTarget = new LocalFileFormatTarget(”c://output.xml”);

theSerializer->writeNode(myFormTarget, *doc);  
3. 이미 생성된 XML 파일 검색하기  

// 이미 기본 설정한거라 보고…다운받으면 그 안에 소스가 존재합니다. 참고 바람.
// 외부 파일을 가져온다.
parser->resetDocumentPool();
doc = parser->parseURI(xmlFile);

// 파일을 검색할때는 재귀가 기본이다.

// DOMNode *n

if (n->getNodeType() == DOMNode::ELEMENT_NODE)

{

    // 노드의 이름 가져온다.
    char *name =  XMLString::transcode(n->getNodeName());

    // 노드에 대한 값을 가져온다.
    char* nodeValue = XMLString::transcode (n->getFirstChild()->getNodeValue ());

    // 속성
   if(n->hasAttributes()) {

        DOMNamedNodeMap *pAttributes = n->getAttributes();
        int nSize = pAttributes->getLength();

        // 한 노드에 붙어있는 모든 속성과 값을 가져온다.
        for(int i=0; nSize>i; i++){  
                   DOMAttr *pAttributeNode = (DOMAttr*) pAttributes->item(i);
                   // get attribute name
                   char *name = XMLString::transcode(pAttributeNode->getName());
                 
                   XERCES_STD_QUALIFIER cout << "Attribute Name : " << name << " -> “;
                   XMLString::release(&name);
                 
                   // get attribute type
                   name = XMLString::transcode(pAttributeNode->getValue());
                   XERCES_STD_QUALIFIER cout << “Attribute Value : “<< name << XERCES_STD_QUALIFIER endl;
                   XMLString::release(&name);
               }
   }
}

TAG DOM, xercesc, xml

DOM에 대한 소개

Projects/CoVNC 2006.11.13 21:59 Posted by soulfree >동네청년<

DOM(Document Object Model)

DOM은 HTML과 XML 문서를 연결시켜주는 프로그래밍적 인터페이스이다. DOM은 어떤 XML 문서를 열고 XML 데이터를 처리할 수 있는 방법을 정의하고 있다.

DOM을 이용하면 개발자는 XML 문서를 만들 수 있고, XML 문서 구조를 내비게이션할 수 있으며, 그 요소들을 추가/수정/삭제할 수 있다.

DOM의 중요한 목적은 아주 다양한 환경과 애플리케이션에서 사용할 수 있는 표준적인 프로그래밍 인터페이스를 제공하는 것이다.

W3C DOM은 어떠한 프로그래밍 언어로도 개발될 수 있도록 고안되었다.


노드(Node) 인터페이스

다음 장에서 살펴보겠지만 XML 문서를 읽어들이기 위해 XML 파서(XML Parser, XML 해석기)라고 불리는 프로그램이 사용될 것이다. 문서가 메모리로 올라오면 Document Object Model (DOM) 를 통해 XML 문서의 정보를 읽고 조작할 수 있게 된다.

DOM은 XML 문서 구조를  트리 형식으로 나타낸다. documentElement 는 그 트리의 탑-레벨이다. 이 요소는 하나 또는 그 이상의 자식 노드(childNodes)를 가진다. 이 자식 노드는 그 트리의 가지로 보면 된다.

노드 인퍼페이스(Node Interface)는 XML 노드 트리의 각 요소를 읽고 쓰기 위해 사용된다. 각각의 노드를 접근하기 위해 documentElement의 childNodes 속성을 접근할 수 있다.

Microsoft XML parser 는 인터넷 익스플로러에서 DOM을 입증하기 위해 사용된다. 이 파서는 노드 트리를 탐색하고, 노드와 그 노드의 속성 값에 접근하고, 노드의 추가/삭제, 노드 트리를 XML로 바꾸는 등의 모든 필요한 기능들을 지원한다.

Microsoft XML parser의 모든 입증된 기능은 공식적인 W3C XML DOM 권고안을 따른다.

Microsoft XML parser는 현재 전체 13개의 노드 타입을 지원한다. 가장 많이 사용되는 노드 타입은 다음 표와 같다:

노드 타입(Node Type)
Document type<!DOCTYPE food SYSTEM "food.dtd">
Processing instruction<?xml version="1.0"?>
Element<drink type="beer">Carlsberg</drink>
Attributetype="beer"
TextCarlsberg

DOM 관련 예제를 보려면 Microsoft Internet Explorer 5.0 이상을 사용해야 한다

TAG DOM, xml

C, C++ DOM API

Projects/CoVNC 2006.11.09 18:13 Posted by soulfree >동네청년<
출처 블로그 > 사람은 언제나 웃을 수 있는 태세를 갖추어야 한다
원본 http://blog.naver.com/iku88/130003398020

Source: saveDOM.cpp


역시 MSDN에 있는 예제.


.NET 2003에서 실행했다.


그대로 복사해서 실행하면 myData.xml이란 파일을 생성한다.


나의 경우, 역시 오류가 뜨던데.. vsprintf_s 란 이름을 vsprintf 로 바꿔주면 된다.


아마 2005버전에선 에러가 안 날것 같다. (안해봐서 확신은 못하지만)


보면..


bstr = SysAllocString(L"<r>\n<t>top</t>\n<b>bottom</b>\n</r>");


일단 bstr이란 스트링 변수에 위의 내용을 넣었다.

이걸

HRCALL(pXMLDom->loadXML(bstr, &status),
              "dom->loadXML(): ");

명령으로 xml 클래스에 등록한다.


그 다음, bstr을 free시킨 후에


HRCALL(pXMLDom->get_xml(&bstr), "dom->get_xml: ");

이렇게 해서 아까 저장한 내용을 다시 읽어온 후에


dprintf("XML DOM loaded from stocks.xml:\n%S\n",bstr);

콘솔에 출력하고 있다.


이때, 콘솔을 보면, 아까의 bstr은 줄바꿈문자('\n')는 있었지만, 탭문자('\t')는 없었는데, 결과를 보면 알아서 탭이 들어가 있다. 저렇게 만들어주나 보다.


그 다음에는 var에 저장할 파일 이름을 저장해서

HRCALL(pXMLDom->save(var), "dom->save: ");

명령으로 파일에 저장을 하고 있다.

TAG C/C++, DOM

API에서 HINSTANCE와 HWND에 대한 질문입니다.

Projects/CoVNC 2006.11.08 22:48 Posted by soulfree >동네청년<

안녕하세요. API에 대해 공부하고 있는 학생입니다.


공부를 하던 중 궁금한 점이 있어서 이렇게 질문을 드립니다.


다름이 아니고..


왜 HINSTANCE(프로그램을 구별하기 위한 핸들)과 HWND(윈도우를 구별하기 위한 핸들)


을 왜 나누는것이죠? 차라리 하나를 합치는게 출력할때 더 편하지 않을까요? 어떤 윈도우


에대가 출력해라가 아니라.. 어떤 프로그램에 출력해라가 더 좋지 않나요? 굳이 HWND를


사용할 필요가 있나요? 아니면 하나의 프로그램에 하나의 윈도우가 아니라 하나의 프로그


램에 다수의 윈도우에다가 출력할려고 그러는건가요? 만약 그렇다면... 예좀 들어주십시요


.. 제가 이해가 잘못되어서인지 잘 모르겠습니다. 복잡하게 질문을 드렸는데.. 제가 초보라


서 그렇습니다.. 황당한 질문이시겠지만 답변을 주시면 감사하겠습니다

질문자가 선택한 답변 
re: API에서 HINSTANCE와 HWND에 대한 질문입니다. 

theuhm (2005-10-18 23:43 작성) 
이의제기 | 신고

질문자 평
감사합니다^^ 

우선 한가지 오해가 있습니다.

HINSTANCE는 프로그램의 핸들이 아닙니다. HINSTANCE는 프로그램 코드를 담고 있는 모듈에 대한 핸들이죠. 즉, 프로그램이 수행되려면, 프로그램 코드를 담고 있는 파일을 메모리의 특정 영역에 올려서 명령을 하나씩 읽어가면서 수행할 수 있도록 준비해 놓아야 합니다. 이렇게 메모리에 올려진 프로그램 코드 덩어리를 윈도우에서 관리하기 위해서 일종의 고유 식별 번호를 부여하는데, 이것이 인스턴스핸들, HINSTANCE입니다. 기본적으로 프로세스를 실행하는 실행파일의 코드를 메모리에 올려놓은 모듈이 하나 있어야 하므로, 실행파일의 모듈에 대한 인스턴스 핸들을 OS가 어플리케이션에 WinMain의 인자로 넘겨주는 것입니다.

한 프로세스가 여러개의 모듈을 로딩하여 프로그램을 실행하고 있다면 하나의 프로그램이 여러개의 인스턴스 핸들을 할당받아 쓰고 있을 수가 있습니다. (물론 한 개의 모듈을 여러 프로세스가 공유하고 있을 수도 있습니다) 대표적인 예가 바로 IE입니다. 간단하게, DLL파일 한개를 쓸 때마다 이 DLL모듈에 대한 인스턴스 핸들이 한개씩 생긴다고 보시면 됩니다. 물론 DLL이 한번 로딩되면 다른 프로그램 사이에서 공유된다는 점은 알고 계시리라 믿습니다.


한개의 프로그램에서 HINSTANCE가 한 개만 있는 것이 아니며, 또한 하나의 인스턴스핸들이 한개의 프로그램에만 종속되는 것이 아니므로, 어떤 프로그램의 출력 대상을 지정하는 데에는 부적절하다는 점을 알 수 있을 겁니다. 물론, 인스턴스 핸들은 애초부터 화면 출력을 고려하여 만들어진 식별자는 아닙니다. 인스턴스 핸들은 단지 프로그램 코드 덩어리를 관리하기 위해 만들어진 리소스입니다.



윈도우라는 OS에서 화면 출력을 위해 관리하는 리소스가 바로 윈도우핸들입니다. MSN메신저등을 보시면 알겠지만, 하나의 프로그램이 하나의 창을 사용한다는 보장이 없습니다. 오히려 99.99%의 프로그램은 한 개 이상의 윈도우로 구성되어 있습니다. 지금 쓰고 계실 것으로 추정되는 IE역시  메뉴바, 툴바, 하단 상태바, 주소창 등등이 모두 별개의 윈도우입니다. 물론 가장 바깥쪽의 프레임 윈도우와, 내부에 웹문서를 보여주는 클라이언트 윈도우도 따로 존재합니다. 즉, 한 프로그램의 윈도우가 겉보기에는 단일한 대상 영역으로 보일지라도, 실제로는 구성요소별로 분리하여 별개의 윈도우로 만들어 각 윈도우는 자기 자신이 맡은 부분에 대한 화면 출력과 사용자 입력만을 담당합니다. 자연히 하나의 프로그램에서 사용하는 윈도우핸들, HWND타입의 개체 역시 1개 이상이 될 수밖에 없으며, 이러한 상황에서 특정 위치에 특정한 동작을 수행하기 위해서는 HWND로 대상 영역을 구분할 수밖에 없는 것이죠.

Win32 API reference

Projects/CoVNC 2006.11.06 12:47 Posted by soulfree >동네청년<
TAG C++, Win32 API

win32 API를 이용한 file dialog 띄우기 예제

Projects/CoVNC 2006.11.05 02:49 Posted by soulfree >동네청년<

#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
LPSTR lpszClass="FODial";

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
  ,LPSTR lpszCmdParam,int nCmdShow)
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst=hInstance;

WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=(WNDPROC)WndProc;
WndClass.lpszClassName=lpszClass;
WndClass.lpszMenuName=NULL;
WndClass.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&WndClass);

hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,(HMENU)NULL,hInstance,NULL);
ShowWindow(hWnd,nCmdShow);

while(GetMessage(&Message,0,0,0)) {
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return Message.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
OPENFILENAME OFN;
char str[300];
char lpstrFile[MAX_PATH]="";
switch(iMessage) {
case WM_LBUTTONDOWN:
memset(&OFN, 0, sizeof(OPENFILENAME));
OFN.lStructSize = sizeof(OPENFILENAME);
OFN.hwndOwner=hWnd;
OFN.lpstrFilter="Every File(*.*)\0*.*\0Text File\0*.txt;*.doc\0";
OFN.lpstrFile=lpstrFile;
OFN.nMaxFile=256;
OFN.lpstrInitialDir="c:\\";
if (GetOpenFileName(&OFN)!=0) {
  wsprintf(str,"%s 파일을 선택했습니다.",OFN.lpstrFile);
  MessageBox(hWnd,str,"파일 열기 성공",MB_OK);
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}


error LNK2001: unresolved external symbol _GetOpenFileNameA@4

Projects/CoVNC 2006.11.05 02:41 Posted by soulfree >동네청년<

View Full Version : error LNK2001: unresolved external symbol _GetOpenFileNameA@4


LearnMFC
08-25-2003, 10:34 PM
In a directShow Transform filter, I want to setup a file open dialog with GetOpenFileName(OPENFILENAME). I have included the #include <commdlg.h>, but the VC 6.0 compiler says :
error LNK2001: unresolved external symbol _GetOpenFileNameA@4


DO you know how to overcome this question?

Thanks.

AvDav
08-25-2003, 11:00 PM
Add Comdlg32.lib to your project settings->linker->object/library modules edit.

LearnMFC
08-25-2003, 11:49 PM
I get. Thanks.
TAG VC++ 6.0

컴퓨터 - 활용 … MySql 5.0과 Tomcat / 한글 관련 문제

Projects/Server 2006.10.18 14:51 Posted by soulfree >동네청년<
컴퓨터 - 활용 … MySql 5.0과 Tomcat / 한글 관련 문제
으으.. 일주일이 넘도록 신경쓰지 못했던 문제를 드디어 처리했다.
사건의 발단은 양질(?)의 수업을 제공하는 DB 과목 프로젝트..

1. MsSQL과 Tomcat으로 제작할까 하다가 Ym형이 mySql도 5.0부터 Procedure를 제공하는것을 발견. 실제 돌아가고 있는 서버에 설치하는것이 플러스 요소가 될것이라는 판단에 이쪽으로 결정.

2. 하지만 전에 돌던 MySql은 4.0.x였다. 5.x 알파 버전 설치 후 패스워드가 먹히지 않는 문제가 발생.. 메뉴얼을 뒤져서 old_password를 사용해야 한다는걸 알아냈으나 나중에 검색해보니 한글로 된 글도 이미 몇건 있었음.. -_-

# mysqld_safe --old_password &

이런식으로 적어줘야 4.1 이전 버전의 패스워드를 계속 사용할 수 있다. 제로보드 역시 비슷한 문제로 약간의 수정, install.php도 수정.

3. Stored Procedure
원래는 이게 정상적으로 동작해야 하지만, 뭘 잘못했는지 컴파일 버전으로는 도무지 저장/불러오기가 되지 않아 어쩔 수 없이 바이너리 버전을 사용하게 됐다.

4. 또 하나의 문제점은 character set. 4.1 이후 버전부터 euc_kr이 euckr로 바뀌었고, mySql 관련 작업을 할 때마다 항상 옵션을 붙여주어야 한다는 점이었다.
  • mysqld 구동시
    전까지는 euc_kr 옵션으로 컴파일을 해서 기본값으로 사용했지만, 4.1 이후 버전부터는 구동시에 character set 옵션을 항상 적어주어야 한다. (..라기 보다는 적어주는게 속 편하다. 더군다나 바이너리 버전이기 때문에 디폴트값은 latin1, 선택의 여지는 없다.)
    그래서 결론은,

    # mysqld_safe --character-set-server=euckr --default-character-set=euckr \
    --character-sets-dir=/usr/local/mysql/share/mysql/korean --language=korean \
    --old-password &


    --default-character-set 이 --character-set-server 로 대체되었다고는 하는데, 아무래도 메뉴얼을 뒤적여보면 이 옵션이 또 필요한 곳이 몇몇 군데 계속 나온다.

  • mysql 클라이언트 접속 시
    전에는 mysql -u namida -p 이런식으로만 접근했었지만, 이러면 character_set_result, character_set_client 변수가 latin1이기 때문에 쿼리문이나 결과문 모두 한글이 깨져나오게 된다. 따라서 mysql 실행 후, mysql> SET NAMES=euckr 명령을 한번씩 수행해주어야 했는데, 심각한건 php, jsp등에서 쿼리문을 수행하기 전에 이짓(?)을 한번씩 해주어야 한다는 것이다. 하지만 이 경우 그 세션에서만 해당 상태가 유지되고, 매번 연결시마다 SET 명령을 내려야 하는 방식이었다. 하지만 그 해결책은 역시 있었고, 몇번의 시행착오와 검색의 도움으로 해결할 수 있었다. 아래에 해결책이 있다.

    # mysql -u namida -p --default-character-set=euckr

    그냥 이런 옵션을 붙여서 클라이언트 환경을 한글로 유지할 수 있다는 것을 알게 해준다. 하지만 매번 저런 옵션을 칠 수는 없는 노릇이므로 환경설정 파일에 내용을 추가해준다.

    mysql 설치후 복사한 /etc/my.cnf 파일에서 [mysql], [client], [mysqldump] 부분에 default-character-set=euckr 행을 추가해주면 된다.

    # vi /etc/my.cnf
    [mysqld]
    port   = 3306
    socket   = /tmp/mysql.sock
    .. (생략)
    default-character-set=euckr

    [client]
    ..
    default-character-set=euckr

    [mysqldump]
    ..
    default-character-set=euckr


  • mysql/J (JDBC) 접속시
    가장 핵심적으로 고생을 시켰던 부분.. 막상 위 환경을 다 해결하고 JSP 페이지에서 한글 데이터를 insert를 해 보니 data truncation warning과 함께 물음표들이 잔뜩 들어가 있었다.

    메뉴얼을 찾아보니 4.1 이후 버전부터는 connection을 얻을때도 character set을 명시해줘야 했다.. (너무 복잡해..)

    Connection Conn = DriverManager.getConnection("jdbc:mysql://localhost/DB이름?characterEncoding=euckr&useUnicode=true&mysqlEncoding=euckr","아이디","패스워드");

    그러나 접속 문제를 해결하고나서도 물음표들은 없어지지 않았고 안되겠다.. 라는 생각이 드는 순간 문득 CLASSPATH를 살펴보니 아래와 같았다.

    # env |grep CLASS
    CLASSPATH=.:/usr/local/jdk/lib/tools.jar:/usr/local/tomcat/common/lib/mysql-connector-java-2.0.14-bin.jar
    #

    ..
    젠장!! connector 풀네임을 경로로 잡아놓고 있었다. 어쩐지 3.1이랑 3.2버전 다 넣어줘도 안되더라 했더니.. 즉시 2.0은 삭제하고 3.1로 대체, 경로 역시 나중에 같은 실수를 범하지 않기 위해 /usr/local/tomcat/common/lib/ 까지만 잡아줬다.

    Tomcat 재시작.. euckr 설정과 함께 정상적으로 삽입됐다. 휴..
닫기..

** DB 구동시 :
# mysqld_safe --old-password --character-set-server=euckr --default-character-set=euckr --character-sets-dir=/usr/local/mysql/share/mysql/korean --language=korean &
** 클라이언트(mysql 프롬프트) 접속 시 :
/etc/my.cnf 파일의 [mysql], [client], [mysqldump] 부분에 default-character-set=euckr 행을 추가해준다.

만약 서버에 설정이 되어있지 않다면 다음과 같이 접속한다.
$ mysql -u namida -p --default-character-set=euckr
** JDBC (MySql/J Connector)
3.1 버전을 사용한다 ㅡㅡ;
mysql-connector-java-3.1.8-bin.jar 파일을 CLASSPATH 가 있는 디렉토리에 넣어주면 된다. 다운로드는 MySql 홈페이지에서..


출처 : http://namida.pe.kr/tt/index.php

Installing Oracle, PHP, and Apache on Linux

Projects/Server 2006.09.23 00:36 Posted by soulfree >동네청년<

Installing Oracle, PHP, and Apache on Linux | 서버  2006/07/21 11:51 


출처 : http://blog.naver.com/spaper/120026857176


Installing Oracle, PHP, and Apache on Linux

By Robert Clevenger
Updated by Christopher Jones, May 2006


Are you ready to start using PHP to talk to an Oracle database?

Let's walk through the steps required to install the Oracle Database, Apache HTTP Server, and PHP as an Apache module on Linux. Check out the OTN Linux Technology Center to see what versions of Linux are certified for use with the Oracle Database. We will be using Red Hat Enterpise Linux AS 4.0 for this example.

Software Requirements:

Software Version URL
Oracle Database 10g Express Edition 10.2 http://www.oracle.com/technology/products/database/xe/
Apache HTTP Server 2.0.58 http://httpd.apache.org/download.cgi
PHP Hypertext Processor 5.1.3 http://www.php.net/downloads/


Installing Oracle

You have a choice here. You may either install the database locally on this Linux machine, or you may decide to use an Oracle server located on another machine on your network. If your database is remote, jump to the article on Installing PHP and the Oracle 10g Instant Client for Linux and Windows.

Otherwise, if this is your first time with Oracle, installing the Oracle Database 10g Express Edition only takes a few minutes. Download the Express Edition (commonly known as "XE") RPM package, log in as root and run:

  # rpm -ivh oracle-xe-univ-10.2.0.1-1.0.i386.rpm

After the software package is installed on the machine, configure a database by running this and answering its four questions:

  # /etc/init.d/oracle-xe configure

For Debian users, a .deb file is also available.

Starting and Stopping Oracle
Oracle XE will be running after installation. You can test it by opening your browser to the Database home page http://localhost:8080/apex. Use the username "SYSTEM" and the password you chose during installation.

Note: You may need to replace "localhost" with the IP address 127.0.0.1 or your machine's DNS name if you are behind a firewall or if localhost does not resolve for some other reason.

Don't forget to register for the free Oracle XE forum by following the "Forum Registration" link on the Database home page.

If you need to restart the database at any time use the Start Database and Stop Database items on the operating system's "Oracle Database 10g Express Edition" menu. To run these you will need to add yourself to the operating system "dba" group and re-login to the machine.

Alternatively you can call the oracle-xe script as the root user:

  # /etc/init.d/oracle-xe stopTo restart:

  # /etc/init.d/oracle-xe start

Installing Apache HTTP Server
Now that the Oracle Database is installed, you should install Apache. You must install Apache before you can install PHP, since PHP will be installed into Apache.

Download httpd-2.0.58.tar.bz2 from the Apache web site, log in as the root user and execute these commands:

  # tar -jxvf httpd-2.0.58.tar.bz2
  # cd httpd-2.0.58
  # ./configure --prefix=/usr/local/apache --enable-module=so
  # make
  # make installWhen configuring the web server, the option "--enable-module=so" allows PHP to be compiled as a Dynamic Shared Object (DSO). Also, the "--prefix=" option sets where Apache will be installed during the command "make install"

If you are familiar with the tar command on UNIX systems, you may be wondering why we did not need to invoke bunzip2 to extract the tar file. Linux includes the GNU version of tar which has a new 'j' flag to automatically uncompress a bzipped tar file. If you downloaded the gzipped file you could have used the 'z' flag instead.

Note: With Apache 2 you should use the default pre-fork MPM ("Multi-Processing Module") because many of the PHP extentions are not known to be thread-safe.

Starting and Stopping Apache

Start and stop Apache with the apachectl script:

  # /usr/local/apache/bin/apachectl startYou should test that Apache is up and running on your machine by opening your web browser to http://localhost/.

Now stop Apache so it can be configured for PHP:

  # /usr/local/apache/bin/apachectl stopInstalling PHP
If you don't want to mess about compiling PHP, use the pre-built Zend Core for Oracle package and follow its installation instructions.

Otherwise, Download the file php-5.1.3.tar.bz2 from the PHP downloads page.

Installation Steps

Log in as the root user and execute these commands:

  # tar -jxvf php-5.1.3.tar.bz2
  # cd php-5.1.3
  # export ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server
  # ./configure \
         --with-oci8=$ORACLE_HOME \
         --with-apxs2=/usr/local/apache/bin/apxs \
         --with-config-file-path=/usr/local/apache/conf \
         --enable-sigchild
  # make
  # make install

Note: if you are behind a firewall, you may need to set the environment variable http_proxy to your proxy server before running make install. This enables PHP's PEAR components to be installed.

Copy PHP's supplied initialization file:

  # cp php.ini-recommended /usr/local/apache/conf/php.iniFor testing it is helpful to edit php.ini and set display_errors to On so you see any problems in your code.

Edit Apache's configuration file /usr/local/apache/conf/httpd.conf and add the following lines:

  #
  # This next section will call PHP for .php, .phtml, and .phps files
   #    AddType application/x-httpd-php .php    AddType application/x-httpd-php .phtml    AddType application/x-httpd-php-source .phps
   #
   # This is the directory containing php.ini
   #    PHPIniDir "/usr/local/apache/conf"

If a LoadModule line was not already inserted by the PHP install, add it too:

  LoadModule php5_module modules/libphp5.so

Restart the Apache HTTP Server

You must now restart the Apache Server so that you can test your PHP installation.

  # /usr/local/apache/bin/apachectl start

Note: If you are using Oracle 10.2 but not the Express Edition, you must give the "nobody" user access to the Oracle directory. With Oracle 10.2.0.2 there is a script $ORACLE_HOME/install/changePerm.sh to do this.

If there are errors, they will display on your screen. They may also be recorded in /usr/local/apache/logs/error_log. If you have problems, double check your httpd.conf and php.ini, and make corrections.

When you start Apache, you must at least have ORACLE_HOME defined. Any other required Oracle environment variables must be set before Apache starts too. These are the same variables set by the $ORACLE_HOME/bin/oracle_env.sh or the /usr/local/bin/oraenv scripts.

To simplify things, you may create a script to start Apache. I did this and named it start_apache:

  #!/bin/sh    ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server    export ORACLE_HOME
   echo "Oracle Home: $ORACLE_HOME"
   echo Starting Apache
   /usr/local/apache/bin/apachectl start

Testing Apache and PHP with Oracle
Testing PHP with Oracle is easy. You simply need to place a PHP file into your htdocs directory; normally /usr/local/apache/htdocs.

Here are two files, the first is used to test basic PHP installation. Open it in a browser with http://localhost/phpinfo.php. If PHP is installed you should see a large page full of PHP configuration information.

phpinfo.php
  <?php
     phpinfo();
   ?>

Check there is a section titled "oci8".

oci8test.php

The second file will display name and salary columns from the EMPLOYEES table owned by the HR user. This requires the HR schema be installed otherwise you will need to modify the script. The HR schema comes with Oracle XE. You can unlock access and set a password using the Adminstration section of the Database home page.

This file uses PHP4-style function names such as "ocilogon". In PHP5 names were standardized like "oci_connect" but the old names are still available.

For Oracle XE the database connection string is simply "//127.0.0.1/XE". If you are not using Oracle XE then change the connection string (third parameter) to the Oracle Net entry for your database.

  <?php
     $db_conn = ocilogon("hr", "your_hr_password", "//127.0.0.1/XE");
     $cmdstr = "select last_name, salary from employees";
     $parsed = ociparse($db_conn, $cmdstr);
     ociexecute($parsed);
     $nrows = ocifetchstatement($parsed, $results);
     echo "<html><head><title>Oracle PHP Test</title></head><body>";
     echo "<center><h2>Oracle PHP Test</h2><br>";
     echo "<table border=1 cellspacing='0' width='50%'>\n<tr>\n";
     echo "<td><b>Name</b></td>\n<td><b>Salary</b></td>\n</tr>\n";
     for ($i = 0; $i < $nrows; $i++ )
     {
       echo "<tr>\n";
       echo "<td>" . $results["LAST_NAME"][$i] . "</td>";
       echo "<td>$ " . number_format($results["SALARY"][$i], 2). "</td>";
       echo "</tr>\n";
     }
     echo "<tr><td colspan='2'> Number of Rows: $nrows</td></tr></table>";
     echo "<br><em>If you see data, then it works!</em><br></center></body></html>\n";
  ?>

Conclusion

You should now have the Oracle Database, Apache HTTP Server, and PHP installed and configured. At this point you are ready to start writing PHP applications on the Oracle platform.

For more information about PHP and Oracle, visit the OTN PHP Developer Center.

Robert Clevenger joined Oracle in 1997 and is an architect for Oracle Fusion middleware.
Christopher Jones joined Oracle in 1990 and is an open source evangelist.



proftpd 계정설정

Projects/Server 2006.09.16 20:41 Posted by soulfree >동네청년<



  # To cause every FTP user to be "jailed" (chrooted) into their home
  # directory, uncomment this line.
  #DefaultRoot ~
 

요렇게 되어있습니다.

요넘이 뭐냐하면, 3번째 #을 떼버리시면, 사용자가 DefaultRoot 라는 곳에서 지정해준 디렉토리로밖에 이동을 못합니다.

예를 들어 , 개똥이라는 아이디로 로그인을 했다면, /home/개똥이 라는 디렉토리가

생성되죠? 그럼 DefaultRoot ~ 로 적어놓으면, 개똥이는 자기 홈디렉토리에서밖에

활동을 못합니다. (/home/개똥이)


절대경로도 정해줄수 있습니다.

예를 들어 /FTPserver 라는 디렉을 만드셨다면,

DefaultRoot /FTPserver 라고적어주시면, 모든 사용자는 저 디렉토리안에서

밖에 움직이지를 못합니다.



그밖의 다른 설명.............


> 홈페이지를 관리하는 계정을 별도로 두고 싶은데요?
> webmaster라는 계정을 가지고 ftp서버에 접속했을때 홈페이지가 올라가있는 폴더로 직접접속되게 설정하려면 어떻게 해야하나요? 홈페이지파일은 /var/www/html에 있습니다. 그러니까 ftp에 접속했을때 /var/www/html 폴더로 바로 접속되게할려구 합니다.

>
===========================================================
> 일단 유저를 추가하면 /home/user가 생성 됩니다.
> proftpd를 돌리고 계신다면,
> proftpd.conf 파일에서
> DefaultRoot ~
> 를 추가 하면 그 유저의 사용자 폴더가 루트로 보이게 됩니다.
> ex) 접속 했을 경우
> / = /home/user 디렉토리가 되는겨죠

여기서 말하는 ~ 의 뜻은 로그인한 사용자아이디를 말한다는 것입니다.
~ 라고 설정이 돼과 webmaster라는 아이디로 접속하면
ftp 루트폴더는
/ = /home/webmaster 라 나타나는것이죠.

> 아파치의 디폴트 디렉토리가 /var/www/html 은 루트 권한으로 가서
> 올려야 한다고 할까요? httpd.conf에서 DocumentRoot 를 /home/기본 폴더
> 로 지정하시는게 나을 거에요..
> 루트로 들어가고 싶으면
> RootLogin on 을 proftpd.conf에 넣어주시면 되구요
> ===========================================================
> 위와 같이 답변에서 DefaultRoot  /var/www/html
> 이라고 주니깐 webmaster로 접속하니까 /var/www/html로 바로 접속은 되는데 쓰기가 않됩니다.

/var/www/html 폴더의 권한 설정을 보십시오.
당연히 root 권한 설정되어있습니다.
그러니 webmaster 라는 아이디로는 쓸수없습니다.

/var/www/html 폴더에 자료을 올리려면 위와 같이 root 로그인을 가능케 한후 ftp 접속하고 위에 /var/www/html 폴더로 이동후 올려도 &#46093;니다.
또는 webmaster 와 같은 일반 계정 접속후 자료를 올린뒤에 텔넷으로 webmaster 계정의 파일을 /var/www/html 폴더로 복사할수도 있구요.

> 그러고 또한가지 문젠 계정접속자가 전부 /var/www/html로 접 > 속 됩니다. 어떻게 해야할지 모르겠네요!  도움부탁합니다

당연히 defaultroot 를 /var/www/html 로 했으니 다 저 디렉토리가 / 로 인식돼죠.

빨리 defaultroot 를 ~ 로 바꾸세요.

*추가 정보

위글대로 defaultroot ~ 를 했을경우
ftp 접속하면 /home/USER 디렉토리로 이동합니다.
그러나 웹페이지로 보이게 하려면 USER/public_html(기본설정) 폴더에 올려야 하죠.
ftp 접속후 일일이 public_html 폴더에 올려야 한다고 말하주는것 보다는 defaultroot ~/public_html 로 설정하여 바로 /home/USER/public_html 로 이동케 하는것이 좋습니다.

php 업로드 용량 제한 변경하기

Projects/Server 2006.09.16 20:25 Posted by soulfree >동네청년<

1. /etc/php.ini 에서

  upload_max_filesize=100M

  post_max_size=110M


2. /etc/httpd/conf.d/php.conf (혹은 httpd.conf)

  LimitRequestBody 1000000000 <== 1000,000,000


3. httpd restart 하고 제로보드는 게시판에서 업로드 용량제한 재설정

'Projects > Server' 카테고리의 다른 글

Installing Oracle, PHP, and Apache on Linux  (0) 2006.09.23
proftpd 계정설정  (0) 2006.09.16
php 업로드 용량 제한 변경하기  (0) 2006.09.16
[불펌]JBOSS 소개와 설치 2  (0) 2006.09.07
[불펌]JBOSS 소개와 설치 1  (0) 2006.09.07
Tatter tools 설치 - apache 설치  (0) 2006.09.07

[불펌]JBOSS 소개와 설치 2

Projects/Server 2006.09.07 21:50 Posted by soulfree >동네청년<
JBoss 탐험기를 다루는 본 기사에서는 오픈 소스 프로젝트로 진행되는 EJB 컨테이너인 JBoss의 설치부터 시작하여 간단한 예제를 만들고 실행하는 과정을 다룰 것이다. 본 기사는 EJB를 공부하고 싶어하는 자바 엔지니어(단, 초급자 제외)를 대상으로 작성되었다. 특히, 금전적인 부담으로 인해 상용 EJB 컨테이너를 살 능력이 없는 사람에게는 더욱 더 도움이 될 만한 기사이다. 왜냐… 공짜이니까…

1. 예제 프그램들

지난 기사(JBoss 탐험기 (상): JBoss 소개와 설치)에서는 설치와 간단한 테스트를 해보았다. 이제부터는 본격적인 EJB 예제를 실행해보도록 하자. 세션 빈과 엔티티 빈으로 나누어 이 두 가지에 대해 예제를 실행해 볼 것이다. 이 두 가지 모두 앞에서 설치한 예제 폴더에 있는 것들이다. 소스 설명은 따로 필요가 없다. 워낙 간단한 예제라서 EJB에 대한 상식이 있다면 누구나 쉽게 이해할 수 있기 때문이다.

1.1 Session bean

예제로는 'Interest'라는 무 상태 세션 빈을 사용할 것이다. 이 예제는 간단하게 이자 계산을 해주는 프로그램이다. 우선 JBOSS_DIST\examples\build 폴더에서 콘솔창을 열도록 한다. 그리고 'ant'라고만 입력하면 아래 [그림 1]과 같이 타겟을 지정하라는 메시지가 나올 것이다.


[그림 1] 타겟을 지정하지 않았다는 메시지

1.1.1 compile

그럼 이번에는 'ant intro-interest-compile'라고 입력해보자. 이번에는 폴더를 생성하고 컴파일을 하는 과정이 메시지로 출력된다.


[그림 2] 컴파일이 정상적으로 수행된 후

실제로 폴더에서 컴파일된 파일들을 확인할 수 있다.


[그림 3] 컴파일 후 생성된 클래스 파일들

1.1.2 jar

이번에는 컴파일된 파일들을 jar 파일로 묶어보자. 다음과 같이 입력한다.
ant intro-interest-jar 
여기까지는 이상 없이 실행될 것이다. 그리고 폴더에서 jar 파일이 생성된다.

1.1.3 deploy

이제 jar 파일을 디플로이 하도록 하자. 다음과 같이 입력한다.
ant intro-interest-deploy 
이것을 실행하면 자동으로 interest.jar 파일이 JBOSS_DIST\server\default\deploy 폴더로 복사되면서 디플로이가 되어야 한다. 그런데 동작하지 않는 것으로 보아 무엇인가 문제가 있는 것 같다. JBOSS_DIST\examples\org\jboss\docs\interest 에 있는 build.xml 파일에서 deploy-ejb-jar 타겟을 보자.
<target name="deploy-ejb-jar" depends="ejb-jar"> <copy file="${build.interest.dir}/interest.jar" todir="${jboss.dist}/deploy" /> </target> 
역시 폴더 설정이 잘못 되어있다. 아마도 JBoss 2.x 버전에서 사용하던 폴도 구조를 변경하면서 미처 반영을 하지 않은 것 같다. 다음과 같이 고치고 다시 실행하자.
<target name="deploy-ejb-jar" depends="ejb-jar"> <copy file="${build.interest.dir}/interest.jar" todir="${jboss.dist}/server/default/deploy" /> </target> 
그러면 아래 [그림 4]와 같이 성공적으로 디플로이 되었다는 메시지가 나올 것이다.


[그림 4] 정상적으로 디플로이된 화면

1.1.4 client

빈이 배치되었으니 클라이언트 프로그램을 실행해서 확인할 차례이다. 다음과 같이 입력한다.
ant intro-interest-client 
이것을 실행하면 테스트용 클라이언트 프로그램이 컴파일되고 실행된다. 그러나 아쉽게도 에러 메시지가 나타난다. 메시지를 살펴보니 몇몇 클래스를 찾을 수 없다는 내용이다. JBOSS_DIST\examples\org\jboss\docs\interest 에 있는 build.xml 파일에서 interest-client 타겟에서 아래와 같이 클래스 패스를 설정하는 부분이 있다.
<target name="interest-client" depends="compile"> <java classname="org.jboss.docs.interest.InterestClient" fork="yes"> <classpath> <pathelement path="${classpath}"/> <pathelement Location="${build.classes.dir}"/> <pathelement Location="${src.resources}"/> </classpath> </java> </target> 
여기에 아래와 같이 2줄을 추가하자.
<target name="interest-client" depends="compile"> <java classname="org.jboss.docs.interest.InterestClient" fork="yes"> <classpath> <pathelement path="${classpath}"/> <pathelement Location="${build.classes.dir}"/> <pathelement Location="${src.resources}"/> <pathelement Location="${jboss.dist}/lib/jboss-common-client.jar"/> <pathelement Location="${jboss.dist}/lib/log4j.jar"/> </classpath> </java> </target> 
다시 실행하여 [그림 5]와 같은 실행 결과가 나왔다면 성공한 것이다.


[그림 5] 클라이언트 실행 결과

1.2 Entity bean

앞에서 interest 세션 빈을 실행해 보았다. 이번에는 엔티티 빈을 실행해 볼 차례이다. 엔티티 빈을 실행하거나 데이터베이스를 사용하기 위해서는 적절한 설정이 필요한데, JBoss를 설치하고 실행하면 기본적으로 Hypersonic 이라는 데이터베이스가 설정되고 구동된다. 그냥 기본으로 제공하는 데이터베이스를 사용하도록 하자.

실행해 볼 엔티티 빈 예제는 'Music CD'이다. 우리가 인터넷으로 CD를 구매하기 위해서는 일단 어떤 CD가 있는지 살펴보게 되는데, 이 예제에서는 이러한 CD 데이터를 데이터베이스를 사용하여 관리할 것이다. 이번에 사용하는 예제는 엔티티 빈 단독으로 실행되는 것이 아니라, CD 자체를 표현하는 엔티티 빈과 CD를 관리하는데 필요한 기능을 담고 있는 CDCollection 세션 빈으로 구성된다. CD 빈은 CD의 타이틀, ID, 아티스트 등에 관련된 메소드들을 제공하며, CDCollection 빈에서는 CD의 추가, 삭제, 검색 메소드를 제공한다. (여기에서의 엔티티 빈은 Container Managed Persistence이다.)

1.2.1 compile

JBOSS_DIST\examples\build에 열려 있는 콘솔창에서 'ant cmp-cd-compile'라고 입력하면 컴파일이 되면서 cd.jar라는 파일이 생성되었다는 메시지가 출력된다. 이 파일 안에는 두 가지의 빈이 모두 포함 되어있다.


[그림 6] 컴파일이 무사히 끝나고 cd.jar 파일 생성

1.2.2 deploy

다른 과정 필요 없이 바로 디플로이 할 수 있다. 이번에는 아주 쉽게 할 수 있다. 단지 JBOSS_DIST\examples\build-examples\cmp-cd\ejb 폴더에 있는 cd.jar 파일을 JBOSS_DIST\server\default\deploy 폴더로 복사만 하면 자동으로 핫 디플로이가 이루어지기 때문이다. 디플로이가 정상적으로 끝나면 역시 아래 [그림 7]과 같은 화면을 볼 수 있다.


[그림 7] 정상적으로 디플로이 된 화면

1.2.3 client

디플로이도 끝났으니 클라이언트 프로그램으로 실행해 볼 차례가 왔다. 세션 빈에서의 클라이언트에서와 마찬가지로 클래스 패스에 누락된 것이 있다. JBOSS_DIST\examples\org\jboss\docs\cmp\cd\build 폴더에 있는 build-client.xml 파일을 수정해보자.
<target name="main" depends=""> <java classname="org.jboss.docs.cmp.cd.${client}" fork="yes" dir="${build.classes.dir}"> <classpath> <pathelement path="${classpath}"/> <pathelement path="${build.classes.dir}"/> <pathelement Location="${jboss.dist}/client/jboss-common-client.jar"/> <pathelement Location="${jboss.dist}/lib/log4j.jar"/> </classpath> </java> </target> 
디플로이만 끝난 상태로는 테이블에 CD 데이터가 아무 것도 없기 때문에 실행하는데 따르는 의미가 없을 것이다. 우선은 CD 데이터부터 입력하도록 하자. JBOSS_DIST\examples\build 콘솔창에서 'ant cmp-cd-upload'라고 실행하면 클라이언트와 서버에서 데이터가 입력되는 과정을 볼 수 있다. "앗, 어떤 데이터가 어떻게 입력이 되나요?" 당연히 이런 질문이 나와야 한다. 데이터는 cds.txt라는 파일에 있으며 파일 내용은 CD 데이터들을 CSV(Comma Separated Value) 형태로 담고 있다. 클라이언트가 실행되면서 이 파일을 읽은 후 CD 내용으로 입력하는 것이다. 아래 [그림 8]은 CD 데이터가 입력되는 서버의 화면이다.


[그림 8] CD 데이터 입력 중

CD 데이터 입력이 끝났으니 이제 CD 목록을 보는 클라이언트를 실행해보자. 'ant cmp-cd-list'는 먼저 입력 되었던 CD 데이터들을 가져 오는 예제이다. 모든 데이터를 삭제하고 싶다면 'ant cmp-cd-remove'라고 실행하면 된다.

이상으로 JBoss 탐험기를 마치겠다. 서문에서 밝혔던 것처럼 이 기사가 EJB를 공부하는 사람들에게 많은 도움이 되었기를 바란다.


참고문헌

  • http://www.jboss.org/online-manual/HTML/index.html
  • http://sourceforge.net/projects/jboss/

    저자: 한빛리포터 김영익

    출처: 한빛미디어

    http://network.hanbitbook.co.kr/view.php?bi_id=411

    http://network.hanbitbook.co.kr/view.php?bi_id=429
  • 'Projects > Server' 카테고리의 다른 글

    Installing Oracle, PHP, and Apache on Linux  (0) 2006.09.23
    proftpd 계정설정  (0) 2006.09.16
    php 업로드 용량 제한 변경하기  (0) 2006.09.16
    [불펌]JBOSS 소개와 설치 2  (0) 2006.09.07
    [불펌]JBOSS 소개와 설치 1  (0) 2006.09.07
    Tatter tools 설치 - apache 설치  (0) 2006.09.07
    TAG EJB, JSP, 자바

    [불펌]JBOSS 소개와 설치 1

    Projects/Server 2006.09.07 21:49 Posted by soulfree >동네청년<

    출처 - http://blog.naver.com/an5asis


    회사에서 톰켓을 대신해서 JBOSS를 사용한단다.

    그런데 JBOSS에는 톰켓도 내장되어있다!!

    도대체 뭐하는 놈인지 궁금해서 불펌하였다...

    어서 랩실에 서버 만들어서 블로그 돌리고파... 싸이 넘 불편스러워

    ===========================================================

    JBoss 탐험기를 다루는 본 기사에서는 오픈 소스 프로젝트로 진행되는 EJB 컨테이너인 JBoss의 설치부터 시작하여 간단한 예제를 만들고 실행하는 과정을 다룰 것이다. 본 기사는 EJB를 공부하고 싶어하는 자바 엔지니어(단, 초급자 제외)를 대상으로 작성되었다. 특히, 금전적인 부담으로 인해 상용 EJB 컨테이너를 살 능력이 없는 사람에게는 더욱 더 도움이 될 만한 기사이다. 왜냐… 공짜이니까…

    1. JBoss 소개

    http://sourceforge.net/projects/jboss/에 가면 다음과 같은 내용이 있다.

    The JBoss/Server is the leading Open Source, standards-compliant, J2EE based application server implemented in 100% Pure Java…

    쉽게 말해서 100% 자바로 구현되는 J2EE 기반의 애플리케이션 서버이며 오픈 소스 프로젝트로 진행되고 있다는 것이다. J2EE나 EJB 또는 애플리케이션 서버라는 용어에 낯선 분들은 아마도 이 글을 읽기에는 아직 무리인 듯 싶다. 좀더 내공을 쌓은 뒤에 읽어보시길…

    어쨌거나 시중에는 많은 상용 애플리케이션 서버들이 있지만 대부분이 고가의 제품이고, 가난한 개발자들에게는 그림의 떡이다. 물론 평가판을 사용할 수도 있지만 사용 기한이 지나서 사용할 수 없다는 메시지를 보면 가슴이 여간 아픈 것이 아니다. 그러나 JBoss를 사용하면 이런 상처를 받을 필요가 없다. 게다가 소스도 공개되어 있으므로 여력이 된다면 자신이 직접 개발에 참여할 수도 있다. 혹자는 "아무래도 싼 게 비지떡이 아닐까?"라고 의심하는 사람도 있을 것이다. 물론 JBoss에도 버그가 존재하고 상용 제품처럼 화려하지도 않고, 아직 미약한 부분들이 존재한다. 하지만 버그 없는 프로그램이란 어차피 존재하지 않는 것이고(그것이 상용 프로그램이라 할지라도), 공짜로 사용하면서 이 정도 기능과 성능을 내는 제품은 드물 것이다. 서론이 너무 길면 지루하므로 JBoss에 대한 탐험을 바로 시작하자. (본 기사에서는 EJB 컨테이너, J2EE 기반의 애플리케이션 서버는 같은 의미로 사용된다)

    JBoss 3.0은 J2EE 1.3을 기반으로 구현되어 있다. 지원하는 각각의 자세한 사항은 아래와 같다.

  • JDBC 2.0(3rd party)
  • JCA 1.0
  • Servlets/JSP 2.3 (Jetty + Tomcat)
  • JNDI
  • EJB 2.0, full CMP 2.0 engine
  • JMS 1.1
  • JTS/JTA
  • JavaMail
  • Clustering

    아래 [그림 1]은 JBoss의 구조를 나타낸다. JBoss는 모든 기능이 JMX(Java Management Extensions) 기반에서 수행된다. JMX는 다양한 플랫폼과 네트워크 프로토콜에 관련된 문제의 해결책을 제시하는 자바 환경의 장점을 관리 기능에서 사용하기 위해 개발되는 것이다. 현재 텔레커뮤니케이션이나 데이터 통신 분야에서 주로 사용되며, 웹로직 서버에서는 웹 기반의 개발자와 관리자들을 위한 구성과 관리, 모니터링을 위한 툴을 제공하는 데에 사용되고 있다. JMX에 대한 자세한 사항은 썬사의 홈페이지(http://java.sun.com/products/JavaManagement/)를 참고하기 바란다.


    [그림 1] JMX 기반의 JBoss 아키텍쳐

    우리의 관심은 오로지 JBoss이기 때문에 J2EE에 대한 자세한 사항은 다루지 않겠다. J2EE에 대한 보다 자세한 내용은 이미 시중에 출판된 책이나 자료도 많이 있으므로 그러한 자료들을 참고하기 바란다.

    2. 다운로드 받기

    2.1. JBoss 다운로드 받기

    JBoss 사이트(www.jboss.org)에 가면 다음과 같은 문구가 있다.

    JBoss 3.0.0 is our current beta, unstable version. It will run on 1.3+ JVMs…

    JBoss 3.0이 베타 버전이라서 아직 안정적이지 않다지만 그냥 사용하기로 하겠다. 그리고 JBoss 3.0이 JDK 1.3에서 실행된다지만 이미 JDK 1.4를 설치했기 때문에 필자는 무시했다. 별 상관 없을 것 같다.

    JBoss 사이트(www.jboss.org)에서 바이너리 파일을 다운로드 받자(참고로 http://sourceforge.net/projects/jboss에서도 다운로드 가능). 필자가 받은 파일은 Tomcat 4.0.3 버전이 포함된 것이다(jboss-3.0.0RC1_tomcat-4.0.31.zip). 파일 사이즈는 14 메가 바이트 정도로 이 파일에는 소스 코드를 포함하지 않는 바이너리만이 존재한다. 소스 코드를 원한다면 CVS를 이용하거나 소스가 압축된 파일을 받아야 할 것이다. CVS나 Ant 등에 익숙치 않은 개발자라면 바이너리를 다운로드 받는 것이 좋다. 소스 코드로부터 바이너리를 구축하는 데에는 많은 노력과 시간이 필요하기 때문이다. 마지막으로 예제와 문서들은 어디에 있을까? http://www.jboss.org/doco_files/에서 documentation-example.zip 파일을 다운 받자.

    2.2. Ant 다운로드 받기

    JBoss에서 제공하는 예제를 구축하기 위해서는 Ant라는 자바 빌드 도구가 필요하다. Ant는 Jakarta 사이트(http://jakarta.apache.org/builds/ant/release/v1.4.1/bin/)에 가면 다운 받을 수 있다. 본 기사를 쓰는 시점에서는 버전 1.4.1이 가장 최신 버전이다. 그러나 Ant도 버전에 따라 API의 변화가 있기 때문에 될 수 있다면 같은 버전을 다운 받아서 사용하기를 권장한다. Ant에 대한 다른 사항은 설치 후 매뉴얼을 참고하도록 하자.

    3. 설치

    3.1. Ant 설치

    설치는 복잡한 것이 없다. 일단 사이트에서 다운로드 받은 압축 파일(jakarta-ant-1.4.1-bin.zip)을 적당한 위치에 풀어서 놓기만 하면 된다. 이 외에 몇 가지 환경 설정을 추가로 해줄 필요가 있다.

    설치한 폴더가 c:\dev\tools\jakarta-ant-1.4.1 일 경우 다음과 같은 폴더들이 생성된다.

     /bin : Ant 실행을 위한 배치 파일이 있다(유닉스나 리눅스의 경우 쉘 파일 사용) /lib : jar 파일들 /docs : 매뉴얼과 API 문서가 있다. 

    Windows 환경에서는 환경 설정을 다음과 같이 하면 된다.

    set ANT_HOME=c:\dev\tools\jakarta-ant-1.4.1 set PATH=%PATH%;%ANT_HOME%\bin 

    유닉스나 기타 다른 OS에서의 설정에 대해서는 Ant 매뉴얼(http://jakarta.apache.org/ant/manual/install.html)을 참고하기 바란다.

    ※ 기타 ANT에 대한 더 자세한 사항은 위에서 말한 설치 후 매뉴얼 외에도 필자가 쓴
    'ANT(상): Ant 무엇에 쓰는 물건인고?''ANT(하): Ant 무엇에 쓰는 물건인고?'를 참고하면 더 자세한 사항을 쉽게 알 수 있을 것이다.

    3.2. JBoss 설치

    JBoss 설치 이전에 JDK가 설치되어야 하는 것은 너무나도 당연한 것이다.
    JAVA_HOME 환경 변수와 클래스 패스가 적절히 설정되었는지 확인하자.

    JBoss 설치는 간단하다. 적당한 위치에 압축 파일을 풀기만하면 설치는 끝난다. 필자의 시스템이 윈도우 2000이기 때문에 다른 운영체제를 사용하는 분들에게는 죄송하지만, 모든 과정은 윈도우 2000에서 작업한 결과임을 이해해 주면 고맙겠다.

    필자는 JBoss를
    D:\jboss-3.0.0RC1_tomcat-4.0.3 이라는 폴더에 설치했으며 편의상 이 폴더를 JBOSS_DIST라고 부르겠다. 그리고 환경 변수로 설정한다. 압축 파일을 풀면 [그림 2]에서 보는 바와 같이 아래와 같은 폴더들이 생성된다.


    [그림 2] JBoss 설치 후 생성된 폴더들

    3.3. 예제와 문서 설치

    JBOSS_DIST 폴더에서 documentation-example.zip 파일의 압축을 풀면 [그림 3]과 같은 폴더 구조와 파일들이 생성된다.


    [그림 3] JBoss 예제와 문서 설치 후 생성된 폴더들

    3.4. 테스트

    설치가 끝났으면 정상적으로 설치가 이루어졌는지 테스트 해보도록 하자. JBOSS_DIST 밑에 있는 bin 폴더를 보면 run.bat 파일이 있다. 사정없이 이 파일을 실행하자. 메시지가 마구 콘솔에 뿌려질 것이다. 한참을 그러다가 멈추고, 마지막에 16:17:24,235 INFO [Server] JBoss (MX MicroKernel) [3.0.0RC1 Date:200204150356] Started in 1m:3s:21ms 이런 비슷한 메시지가 보이면 서버가 실행되고 대기 상태에 있는 것이다.


    [그림 4] JBoss가 실행된 화면

    이제는 브라우저를 실행시키고 http://localhost:8080를 주소창에 입력하자. [그림 5]와 같은 화면이 보이면 일단 안심해도 된다. JBoss가 실행되면서 Tomcat도 같이 실행되기 때문이다.


    [그림 5] JBoss와 Tomcat이 같이 실행되고 있다

    브라우저에서 http://localhost:8082 를 주소창에 입력하면 아래와 같은 화면이 나온다. 여기에서는 현재 JBoss에서 실행되고 있는 컴포넌트들을 관리할 수 있다. 마치 게시판에서 관리자 화면을 제공하는 것과 같다고 할 수 있다.


    [그림 6] JBoss 관리 화면

  • 'Projects > Server' 카테고리의 다른 글

    Installing Oracle, PHP, and Apache on Linux  (0) 2006.09.23
    proftpd 계정설정  (0) 2006.09.16
    php 업로드 용량 제한 변경하기  (0) 2006.09.16
    [불펌]JBOSS 소개와 설치 2  (0) 2006.09.07
    [불펌]JBOSS 소개와 설치 1  (0) 2006.09.07
    Tatter tools 설치 - apache 설치  (0) 2006.09.07
    TAG EJB, JSP, 자바

    Tatter tools 설치 - apache 설치

    Projects/Server 2006.09.07 21:22 Posted by soulfree >동네청년<

    =====================================================================================

    apache2 웹 서버 설치

    1. http://www.apache.org에서 소스코드를 다운 받는다.

    2. 적당한데다 소스코드의 압축을 푼다.
    tar xfvz 소스코드이름

    3. ./configure \
    --prefix=설치경로 \
    --enable-module=rewirte \ //테더툴즈는 mod_rewrite.so 모듈을 사용한다.
                                  연구실의 서버 관리 책만보고 하다가 이 부분이 없어서 대략 삽질함.
    --enable-share=rewrite \ //DSO방식으로 mod_rewrite.so 모듈을 사용하는 옵션이라 함.
    --enable-mods-shared=most \
    --with-ssl           

    ****
    --enable-module=rewrite 이거 안하고 아파치 웹서버를 설치 했다면 mod_rewrite.c 파일을 컴파일 해서 mod_rewirte.so 모듈을 얻으면 된다. 이 모듈의 소스코드는 2.2.3버전의 경우 "소스코드 경로/modules/mappers" 디렉토리 밑에 있다.

    컴파일하는 방법은 설치된 아파치의 bin 디렉토리에서

    ./apxs -i -a-c 경로/modules/mappers/mod_rewrite.so

    이다.
    이렇게 컴파일을 하면 httpd.conf 파일에 LoadModule 부분이 자동으로 들어간다.

    4. 아파치 설치 경로의 conf디렉토리의 httpd.conf파일을 수정해 아파치 웹서버의 환경설정을 한다. 설정할 내용은 rewrite 모듈을 로드 하는 것..

    'Projects > Server' 카테고리의 다른 글

    Installing Oracle, PHP, and Apache on Linux  (0) 2006.09.23
    proftpd 계정설정  (0) 2006.09.16
    php 업로드 용량 제한 변경하기  (0) 2006.09.16
    [불펌]JBOSS 소개와 설치 2  (0) 2006.09.07
    [불펌]JBOSS 소개와 설치 1  (0) 2006.09.07
    Tatter tools 설치 - apache 설치  (0) 2006.09.07