DBA로 살기 위해 여러 세미나와 각종 교육 등을 받아보면, 자주 등장하는 강사(혹은 발표자)의 농담 섞인 얘기들이 있습니다.
"DBA가 할 일이 별로 없는 회사가 시스템이 잘 굴러가는 곳이다."
"가장 효과적이고 확실한 튜닝은 돈을 투자하는 것이다."
"오늘 설명한 작업은 시스템에 사용자가 별로 없는 시간대에 하거나, 외부의 접속을 끊고 진행하는것이 좋습니다."
라는 얘기죠.
 흔히 낮에는 하지 말자라는 작업을 몇가지 생각나는대로 읇어보면...(물론 어떤 시스템이냐, 어떤 장비를 쓰느냐에 따라 달라지긴 합니다.)

1. 대용량 Data file 추가
2. 대용량 Data table의 이전 혹은 여기에 생성되어 있는 Index의 rebuild 작업
3. online full backup
4. 통계 Data 정리
음... 이거 말고도 부하를 줄만한 작업이 꽤 많죠. 음... DW구축 등의 작업이 보통 새벽이나 밤에 시작되죠.
예전에 근무했던 곳에서는 내부 업무용 DW DB라 그런지 9시 쯤부터 배치 작업이 돌아갔었던거 같습니다. 음... 일년 정도 지나니까 생각이 잘 안나네요.

 암튼... 이런 얘기를 하는건...
뭔가 원인이 있었겠지만, 저희 팀의 윗분 한분이 사용자가 많은 시간에 인덱스 리빌드를 몇개 돌리시더군요. 저한테는 DBA가 왜 낮에 시스템에 부하를 주는 작업을 하냐고 타박을 주시던 분인데...
DB 서버에 Wait가 걸리고, 웹 서버 프로세스 수가 급증하는 통에 전화기에는 불이나고...

음... 그대로 놔뒀으면 사용자들이 조금은 느리더라도 서비스를 이용할 수 있었을텐데, 굳이 그런 작업을 해서 서비스가 중단되는 테러를 자행하다니...

전화 폭탄과 SMS에 스트레스가 쌓여서 요렇게 글로 풀어봅니다. ^^;
 TmaxData의 Tibero4로 migration을 진행하면서 알게된 몇가지 내용 중 Index rebuild에 대해서 얘기해보고자합니다. 기존에 사용하던 Oracle을 기준으로 하면... (제가 가장 잘 아는게 Oracle이라 이녀석이 기준입니다.) Index를 사용하다가 rebuild 해줄때 몇가지 옵션을 줄 수 있습니다.

SQL> ALTER INDEX IDX01 REBUILD ONLINE;
   * 기존의 인덱스를 계속 유지한채로 REBUILD하고, REBUILD가 끝나면 바꿔치기 하는 옵션이죠.

SQL> ALTER INDEX IDX01 REBUILD ONLINE TABLESPACE TS_IDX2;
   * REBUILD를 하면서 저장하는 TABLESPACE도 바꾸는 옵션이죠.


 사실 DB 관리를 하다보면 tablespace를 바꿔줄 일이 가끔씩 생깁니다. 그래서 Tablespace를 바꿀 수 있는 옵션은 아주 유용합니다. 그런데... Tibero4에서는 이를 지원하지 않고 있네요. ㅡ.ㅡ
[General syntax error]라는 오류가 발생합니다. Tmax에서도 지원하지 않는다고 하네요. 그런데, Tmax에서 제공하는 Tibero 관리/개발용 툴인 tbAdmin에는 인덱스 리빌드창(마법사??)에서 Tablespace를 선택할 수 있도록 되어있습니다. 혹시나 해서 실행시켜보니까 똑같은 오류가 발생하네요.


 Tibero를 사용하면 꼭 사용해보게되는 tbAdmin이라는 Tool이 있습니다. Tmax에서 Eclipse 기반으로 개발한 Tibero client tool입니다.
 작년 겨울부터 사용해온 툴인데... 이건 뭐...이클립스로 이런 저런 툴을 다 만들수 있구나 하는걸 알 수 있습니다.
IBM은 심포니라는 오피스 프로그램까지 만들어 놓기는 했지만, 국내 기업 중에서 이렇게 툴을 만들어 내놓은게 참 반갑더군요.

 문제는 Tibero에 있지 않나 생각합니다. tbAdmin에는 설정하는 항목이 있는데, Tibero에서는 막상 그 설정변경된 내용이 지원되지 않아서 에러가 발생하는 웃기는 상황이 있더군요.
뭐... 자세한 내용은 다음에 소개하도록 하겠습니다. 다만... 이클립스 기반으로 만들 툴이 좀 아깝구나 하는 생각이 들었습니다. 그럭저럭 client 설치없이 바로 쓸 수 있는 편한 환경이던데...

 MS-SQL에서 Oracle에 있는 Data에 접근하기 위한 방법으로 Openquery라는걸 소개한 적이 있죠.
기본적으로 제공하는 기능이라 좋긴 하지만 동적으로 쿼리를 만들어서 결과값을 받아올수 없다는 얘기를 한 적이 있습니다. 그렇게 되면 WHERE절 조건을 정확하게 줄 수 없으니 오라클 DB에 부하를 많이 주게 되겠죠.
저도 이렇게 알고 서비스 중인 MS-SQL과 Oracle 사이에 Data 동기화 프로시져를 만들었었습니다.
그런데....

 웬걸...

 회사에서 사용중인 MS-SQL 2005에서 혹시나 하는 마음에 문자열 변수에 커서를 정의하는 문장까지 포함해서 동적으로 쿼리를 만들어 주고, 커서를 열었더니... 결과 값이 정상적으로 나오네요. 앗싸~ 가오리~

아래와 같은 방식으로 처리하니까 동적으로 쿼리문장을 만들어서 실행시키고 결과값을 커서에 받아서 사용할 수 있습니다.


DECLARE @QUERY_STRING VARCHAR(1000)
DECLARE @CODE        VARCHAR(30)
SET @CODE='SUPERCODE'
DECLARE @USERNAME VARCHAR(50)

SET @QUERY_STRING = 'DECLARE ORA_CUR CURSOR FOR
                     SELECT USERNAME
                         FROM OPENQUERY(ORA_DB, ''SELECT USERNAME
                                FROM USER_INFO
                               WHERE CODE='''''+@CODE+''''' AND USER_FLAG=''''N'''' '') '

EXEC (@QUERY_STRING)
OPEN ORA_CUR
FETCH NEXT FROM ORA_CUR INTO @USERNAME

WHILE @@FETCH_STATUS = 0
    BEGIN
    INSERT INTO dbo.USER_INFO(USERNAME)
    VALUES(@USERNAME)

    FETCH NEXT FROM ORA_CUR INTO @USERNAME
  END;

CLOSE ORA_CUR

DEALLOCATE ORA_CUR

 요즘 이기종 DBMS간의 Data 동기화에 대해서 많은 고민을 하고 있습니다. 지금 근무하는 직장에 입사하기 전, DW 구축 업무를 했을 때에는 Data 동기화보다는 정해진 시간내에 통계 Data 구축을 마치는데에 신경을 썼지 실시간 동기화는 큰 필요성을 느끼지 못했었죠. ETL Tool을 이용하면 여러 시스템에서 Data를 가져오거나, 보내주는 Data file 등을 가공하는데 불편함이 없었으니까요. DataStage가 좋더군요. (비싼게 좋네요. ㅡㅡ)
 고사양, 대용량 시스템에서 DW 구축할때와는 달리 소규모 DB를 여러대 사용하는 환경으로 바뀌게 되니까 여러가지 제약과 마주치게 되었습니다. 예산이 적다보니 편리한 ETL Tool은 쓸 수 없고, 기준 정보를 동기화 해야한다던지(꼭 실시간을 원하더군요.), 서로 다른 서비스/업무 시스템에서 서로 다른 DBMS를 사용하는 경우가 많네요.
 Oracle을 사용하던 중에 MS-SQL이 도입되었고, 이제는 TmaxData의 Tibero까지 도입되었습니다. ㅜㅜ
TmaxData의 ProSync, Tibero와 MS-SQL 등과 씨름하던 중에 Oracle의 Golden gate에 대해서 듣게 되었고, 01월 12일(화)에 세미나를 한다는 정보를 접하게 되었습니다. 월차를 내고 거기에 갔었죠. 이 글은 Oracle Data Integration Day에 참석한 DBA의 소감입니다.

 아래 사진은 코엑스 인터컨티넨탈 호텔 지하1층 다이아몬드홀 앞에 준비되어있던 참석자를 위한 휴식 공간에 비치된 의자들입니다. 편안하게... 거의 누워있는듯한 자세로 앉게 되는 빈백(이름이 맞는지 모르겠네요?)과 영화 감독님 의자(낚시 의자 같은)입니다. 편하더군요.



















































 늦게 도착해서 첫번째 세션인 [[Keynote] Real Time Enterprise를 위한 혁신 : Data Integration]은 듣지 못했고, 두번째 세션인 [Real Time Data Integration 고객 사례 : 현대증권]부터 들었습니다.

 Golden gate
 Exadata 소개 세션을 제외한 세션들은 저마다 차이는 있으나 Golden gate를 이용한 고객 사례 소개와 이번에 새로 나온 제품이 아닌 기존에 여러 기업에서 사용하고 있던 좋은 솔루션이라는 점을 강조하고 있었습니다.
 일단 제가 봐도 좋아보이는 점은 다양한 이기종 DBMS간의 Data 동기화를 가능하게 해준다는 점과 단방향 및 양방향 동기화까지 지원해준다는 점입니다. 실시간 동기화는 현대증권에서 이미 구축 사례가 있으니 신뢰가 가네요.
 저희 회사처럼 세 가지 이상의 DBMS를 사용하는 곳이라면 적절한 솔루션이 아닐까요? 음... 가격을 모르니까 좀 걱정이 되긴 하네요.

 Exadata V2
 Exadata는 하드웨어와 소프트웨어를 통합한 제품으로 DW에 초첨이 맞춰져있었던 Exadata V1때부터 관심이 있던 제품인데, V2는 정말 맘에 드는 제품으로 변해있더군요. SUN을 인수 이후 가장 눈에 띄는 제품이라고 생각합니다. 두 회사의 강점이 모여서 나온 이 제품은 SUN의 Flash fire 및 하드웨어 노하우와 Oracle의 DBMS, Storage 관리 기능이 한데 묶여서 DW와 OLTP를 모두 지원하는 하이브리드 장비이면서 기존의 Exadata V1보다 월등히 빠른 제품이 되었습니다.
 강력한 Data 압축 기능(Exadata Hybrid Columnar Compression라고 하던데... 정확한 명칭인지는 확인을 못했습니다.)을 지원하는... 좀 아쉬운점은 일반 Oracle 11g에서도 지원하는 기능인데, Exadata에서만 작동 가능하도록 설정되어 있다고 합니다. 음...
 Exadata의 핵심은 SUN의 Flash Fire 카드를 장착하고 Oracle Storage Software를 설치한 SUN Oracle Exadata Storage Server인것 같습니다. Flash Fire 카드의 캐쉬 기능을 이용하여  반응 속도를 빠르게 하고, 강력한 압축 기능을 이용하여 Storage 효율을 높인 점, 그리고 SUN Oracle Exadata Storage Server가 자체적으로 Query 문장을 인식하여 처리가 가능하여 더욱 빠른 Data 처리가 가능하도록 만들어져있더군요. 언젠가 여건이 된다면 Exadata를 도입한 회사에서 근무해보고 싶네요. 음... 한번 만져보고 싶은...

그리고...
 세미나 참가자 기념품이 배송 사고로 인해서 추후 택배로 배송해준다고해서 회사 주소를 적어놓고 왔는데, 오늘 도착했습니다. 아래 사진에 보이는 제품입니다. ^^ 폰카로 찍어서 화질이 안 좋네요.

 회사에서 MS-SQL과의 Data 동기화에 누락된게 있다고 전화가 와서 경품 추첨을 뒤로한채 나와야 했었는데, 이날 경품 중에 순금이 있더군요. ㅜㅜ
꼭 받고 싶었는데... 우웅...
 새로 도입하는 시스템이 MS-SQL을 사용한다고 해서 기존에 사용하던 Oracle에서 일부 Data는 초기에 한번, 일부 Data는 주기적으로 동기화를 맞춰주는 작업을 해야합니다. 초기에 한번 이전해 주는 작업은 MS-SQL의 SSIS라는 기능을 이용해서 넘겨주기로 했고, 기능 테스트도 이미 했죠. 문제는 주기적으로 Data의 동기화를 맞춰주는 작업인데요. DB 복제 솔루션을 이용하거나 ETL을 이용하면 쉽게 해결되겠지만, 예산이 없어서 보류하고요. 다른 방법을 찾아보기로 결정했었죠. 그래서 알아본게 다음의 두가지입니다.

1. Oracle Gateway를 이용한 이기종 DBMS간 Data 공유
2. MS-SQL의 Open Query를 이용한 이기종 DBMS간 Data 공유


 Oracle DB에 원천 Data가 있으니 변경된 내용이 생길때 바로바로 적용하기 위해서는 Oracle Gateway를 이용하는게 좋을것 같긴 한데요. 문제는 이건 제가 한번도 해보질 않아서 프로젝트 일정에 맞출수가 없을 것 같더군요. 그래서 MS-SQL에서 구현하기로 했습니다. Open query는 예전에도 써본적이 있거든요.
자꾸 이러면 실력이 늘지 않을텐데 큰일입니다. ^^;  자~ 이제 MS-SQL의 Open query를 이용해서 주기적으로 Data 동기화를 맞춰주는 기능을 구현해보도록 하겠습니다.

 제일 먼저 할 일은 MS-SQL 서버에 Oracle client를 설치하는 일입니다. 설치가 완료되면 Data를 가져올 Oracle server의 정보를 tnsnames.ora에 설정해주면 됩니다. 이제 Linked server를 설정해줄 차례입니다.

 Open Query를 사용하기 위해서 우선 Oracle과 Link를 걸어야 합니다. SQL Server Management Studio에서 [연결된 서버]라는 항목에 추가를 해주면 됩니다. 이때 [Oracle provider for OLEDB]를 선택해서 사용하시는게 좋습니다. MS에서 제공하는 OLEDB provider를 사용할 수도 있는데, 이건 뭔가 문제가 있어보이더군요. Open query에서는 테스트해보지 않았지만, SSIS에서 Oracle의 Data를 가져올때 데이터형을 좀 잘못 가져오는것 같더군요. tnsnames.ora에 설정된 이름과 사용할 Oracle의 계정 정보 등을 입력해서 linked server를 생성하시면 됩니다.

 이제 Open query에 대해서 얘기해볼까합니다. Open query를 이용하면 MS-SQL에서 Oracle DB에 insert, select, update, delete를 실행 할 수 있습니다.

USE TESTDB
GO

SELECT * FROM OPENQUERY(LINK_NAME, `SELECT * FROM 테이블이름`);


UPDATE OPENQUERY(LINK_NAME, `SELECT A FROM 테이블이름 WHERE 조건1`)
SET A='AA' WHERE 조건2;

DELETE OPENQUERY(LINK_NAME, `SELECT A FROM 테이블이름 WHERE 조건1`)
 위의 query문을 보시면 update문을 실행시키는데 select문을 실행시키고 set을 해주는 부분이 보일겁니다. 그리고 조건이 2개 붙은 부분이 보일겁니다. [조건2]가 붙는 이유는 [조건1]에 ms-sql의 프로시져에서 사용하는 변수를 적용할 수 없기 때문입니다. 변수로 처리하지 않고 문자열로 넣어서 처리할 수 있는 부분은 [조건1]에 다 넣어주고, 변수로 받아서 넣어줘야할 내용은 [조건2]에 넣어주면 됩니다. 아래에 프로시져 코드를 보시면 바로 이해하실 겁니다.

이제 배치작업을 위해서 해당 기능을 프로시져로 만듭니다. 제가 작성한 간단한 샘플 코드를 보여드리겠습니다.

USE [testdb]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [tdb].[user_sync]
AS

    DECLARE ora_cursor CURSOR FOR
    SELECT TRG_FLAG, USER_ID, USER_NAME, TEL, CEL, EMAIL, ZIP_CD, ADDR1, ADDR2
       FROM OPENQUERY(VOCA2, 'SELECT B.TRG_FLAG, B.USER_ID, A.USER_NAME, A.TEL, A.CEL, 
                                                               A.EMAIL, A.ZIP_CD, A.ADDR1, A.ADDR2
                                                     FROM USER_TEST A, USER_TRG B
                                                    WHERE B.USER_ID = A.USER_ID(+)  AND B.MIG_DATE IS NULL');

    OPEN ora_cursor

    DECLARE @TRG_FLAG        VARCHAR(1)
    DECLARE @USER_ID            VARCHAR(30)
    DECLARE @USER_NAME            VARCHAR(50)
    DECLARE @TEL            VARCHAR(50)
    DECLARE @CEL            VARCHAR(50)
    DECLARE @EMAIL        VARCHAR(100)
    DECLARE @ZIP_CD            VARCHAR(7)
    DECLARE @ADDR1        VARCHAR(100)
    DECLARE @ADDR2        VARCHAR(100)

    FETCH NEXT FROM ora_cursor INTO @TRG_FLAG, @ USER_ID , @USER_NAME, @USER_TEL, @USER_CEL, @USER_EMAIL, @ZIP_CD, @USER_ADDR1, @USER_ADDR2

    WHILE @@FETCH_STATUS = 0
    BEGIN
        IF (@TRG_FLAG = 'I')
            BEGIN
                INSERT INTO USER_TEST  ( USER_ID , USER_NAME, USER_TEL, USER_CEL, USER_EMAIL, ZIP_CD, USER_ADDR1, USER_ADDR2)
                VALUES(@USER_ID, @USER_NAME, @USER_TEL, @USER_CEL, @USER_EMAIL, @ZIP_CD, @USER_ADDR1, @USER_ADDR2);

                UPDATE OPENQUERY(VOCA2, 'SELECT MIG_FLAG, MIG_DATE, USER_ID FROM  USER_TRG  WHERE TRG_FLAG=''I'' AND MIG_FLAG=''N''')
                    SET MIG_FLAG='Y', MIG_DATE=GETDATE()
                    WHERE USER_ID=@USER_ID;
            END;
        ELSE IF (@TRG_FLAG = 'U')
            BEGIN
                UPDATE  USER_TEST    SET USER_NAME=@USER_NAME, USER_TEL=@USER_TEL, USER_CEL=@USER_CEL, USER_EMAIL=@USER_EMAIL, ZIP_CD=@ZIP_CD,
                                           USER_ADDR1=@USER_ADDR1, USER_ADDR2=@USER_ADDR2
                WHERE USER_ID=@USER_ID;

                UPDATE OPENQUERY(VOCA2, 'SELECT MIG_FLAG, MIG_DATE, USER_ID FROM  USER_TRG   WHERE TRG_FLAG=''U'' AND MIG_FLAG=''N''')
                    SET MIG_FLAG='Y', MIG_DATE=GETDATE()
                    WHERE USER_ID=@USER_ID;
            END;
        ELSE IF (@TRG_FLAG = 'D')
            BEGIN
                DELETE FROM  USER_TEST    WHERE USER_ID=@USER_ID;

                UPDATE OPENQUERY(VOCA2, 'SELECT MIG_FLAG, MIG_DATE, USER_ID FROM  USER_TRG   WHERE TRG_FLAG=''D'' AND MIG_FLAG=''N''')
                    SET MIG_FLAG='Y', MIG_DATE=GETDATE()
                    WHERE USER_ID=@USER_ID;
            END;

        INSERT INTO dbo.USER_TEST_LOG(REG_DATE, USER_ID, TRG_FLAG) VALUES(GETDATE(), @USER_ID, @TRG_FLAG);
        
    FETCH NEXT FROM ora_cursor INTO @TRG_FLAG, @USER_ID, @USER_NAME, @USER_TEL, @USER_CEL, @USER_EMAIL, @ZIP_CD, @USER_ADDR1, @USER_ADDR2 
    END;

    CLOSE ora_cursor                                        -- 커서 클로즈

    DEALLOCATE ora_cursor                              -- 커서 메모리 반환
GO




자 이제 배치작업으로 주기적으로 실행시키는 일만 남았네요.


 지난번에 소개한 [Linux 전력 소비량 줄이기] 시리즈의 세번째 문서를 소개합니다.

원문 : Linux 전력 소비량 줄이기, Part 3: 조정 결과

세 편의 기사로 구성된 이 시리즈에서는 전력 효율 향상을 위해 시스템을 조정하는 방법에 대해 설명합니다. Part 3에서는 조정된 상태와 조정되지 않은 상태에서 다섯 가지 커널 내 거버너의 성능을 비교하여 Linux 기반 System x 서버를 최적화하는 방법에 대해 살펴봅니다.

 현재 재직중인 직장에서 TmaxData의 Tibero4로 DBMS를 migration 및 신규 서비스 구축을 한다는 말씀을 드렸었나요? 음... 암튼 지금 그런 일이 진행되고 있습니다. 나름 대규모 작업이 진행중인데요.
국내 기업이다보니 버그나 기능 개선이 요구되면 그때그때 패치가 되고 있습니다. 이건 뭐 긍정적이라고 생각합니다. 아직 개선할 점이 많은게 문제이긴하지만 대응이 빠른 편이라고 생각합니다. 좋게좋게 생각해야죠.

 이번에 말씀드리려는건 현재 패치가 진행중이라고 알고있는데요. PSM(Oracle의 PL/SQL에 해당함)을 이용해서 함수(Function)를 만들어서 쓸때 생기는 문제입니다.

문제점 : select문장에서 만들어 놓은 함수를 실행시켰는데, 널(null) 값이 반환된다.

원인 : 함수안에서 실행되는 Query 문장이 인덱스를 타게되면 널(null) 값이 반환된다.

해결책 : 현재 패치 진행중이라고 한다. 일단 Full table scan하도록 힌트를 주면 됨.

 뭐... 패치 중이니까요... 곧 해결되겠죠.
이번에는 Speaking UNIX 시리즈 중 하나로 Screen에 관한 문서를 소개하려합니다.


원문 : Speaking UNIX: Screen을 사용하여 세션을 계속 유지하기

Harry Potter에게는 지팡이가 있고 Thor 신에게는 철퇴가 있으며 Buckethead에게는 도끼가 있지만 이러한 모든 도구는 QWERTY에 비하면 빈약하기 짝이 없다. 명령행에서 몇 가지 명령을 실행하기만 하면 웹 사이트를 실행하여 대의를 위해 싸울 군대를 모집하거나 약탈을 일삼는 무리들을 물리칠 수 있다.

그러나 이처럼 강력한 QWERTY도 연결이 끊기면 무용지물이 된다는 치명적인 약점이 있다. 잡음이 많은 전화선, 연결이 끊긴 셀룰러나 무선 연결 또는 네트워크 시간 종료 문구는 원격 쉘에게는 분명히 치명적이다. 애플리케이션 디버깅과 같은 작업에 많은 시간을 사용하는 경우 갑자기 작업이 중단되면 좌절하거나 화가날 수 있다.

그러나 자신을 탓하지 말고 대신 GNU Screen을 사용하라. Screen은 콘솔 내에서 다중 쉘 창(즉, 실제로 호스트에 연결된 더미 터미널), xterm 창 또는 SSH(Secure Shell) 로그인을 작성하고 관리한다. 쉘 간에 빠르게 전환할 수 있으며 쉘을 계속 실행 중인 상태로 두고 언제든지 다시 연결할 수 있다. Screen은 다수의 가상 콘솔을 효과적으로 제공한다.


 IBM DeveloperWorks의 문서 제목을 보던중에 재밌는 문서를 발견했습니다. 사실 발견한지는 꽤 시간이 지났지만, 테스트를 해본다는 둥, 내용을 검증 해봐야겠다는 둥... 평소에 하지 않던 짓을 하려다가 시간만 보내고 이제야 글을 올립니다. 아마도 게으름이 가장 큰 탓이겠죠.
 제목만으로는 개인적으로 아주 많이 기다려왔던 문서가 아닐까합니다. Java 애플리케이션 서버에서 PHP 프로그램을 돌릴 수 있고, Java의 클래스들을 PHP 안에서 실행시킬 수 있다는거. 아주 맘에 드네요. 자세한 내용은 원문을 보시길...
원래 레진(Resin)에 포함되어있는데 톰캣에서도 돌릴 수 있다고 합니다.

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

Quercus는 Java™ 기술과 PHP를 함께 사용하여 웹 서비스와 애플리케이션을 작성할 수 있는 새로운 도구입니다. Quercus 프레임워크에는 Java와 PHP가 서로 통합되어 있기 때문에 Spring, Hibernate 등의 유용한 Java 라이브러리를 애플리케이션에 쉽게 통합할 수 있습니다. 이 기사에서는 약간의 코드 샘플과 함께 이 프레임워크에 대해 간략하게 설명합니다. 간단한 HelloWorld 샘플을 사용하여 이 프레임워크의 기능과 장점을 살펴본 후 마지막으로 프레임워크 아키텍처에 대해 설명하고 실제 예제를 자세히 살펴봅니다.

소개

Quercus는 순수하게 Java로 구현된 오픈 소스 PHP 5 엔진이다. Quercus 문서에 따르면 Quercus는 Resin 애플리케이션 서버를 기반으로 실행되고 로드 밸런싱, 프록시 캐싱 등의 Resin 기능을 사용한다. 이 기사에서는 Apache Tomcat을 기반으로 Quercus를 실행하면서 그 기능에 대해 설명한다. 또한 PHP와 Java가 통합되어 있는 Quercus를 통해 웹 서비스와 애플리케이션을 쉽고 유연하게 작성하는 방법도 보여 준다.


+ Recent posts