::: SPAC (Simple Php Action Class) PHP Framework:::



Spac 은 PHP를 이용해 웹어플리케이션을 개발시 구조적이고 체계적인 개발을 할 수 있도록 도와주는 PHP를 위한 개발 프레임웍입니다.

최근 PHP 프레임웍이 외국으로부터 많이 알려지면서 프레임웍을 이용하여 개발하는 사례가 많아지며, 프레임웍에 대해 관심을 갖는 PHP 개발자들 또한 많아지고 있는 추세인것 같습니다.

이런 분위기를 타고 저 또한 개인적으로 사용하고 있는 PHP 개발 프레임웍 Spac을 소개하고자 합니다.

Spac은 작고, 가볍고,  빠른 PHP 웹어플리케이션 개발을 위한 프레임웍입니다.


Spac 이라는 PHP프레임웍에 대해 특징을 위주로 하나하나 소개하겠습니다.


1. 개인/기업/영리/비영리기관 관계없이 무료로 웹사이트 개발에 이용하실 수 있습니다. (수정배포 불가)


2. 클래스기반의 작고, 가볍고, 빠른  PHP 웹어플리케이션 개발 프레임웍입니다.


3. URL을 분석하여 액션클래스를 매핑, 실행합니다.


4. M.V.C 패턴을 기본으로 지원합니다.


5. 웹어플리케이션을 위한 디렉토리 구성이 자유롭습니다.


6. 호출되는 URL과 이에 매핑되는 액션클래스를 사용자가 임의로 설정할 수 있습니다. (액션클래스매핑)


7. 간편한 HTML 레이아웃 구성 도구가 제공됩니다.


8. 뷰에서 PHP코드의 활용이 자유롭습니다.


9. 뷰에 전용템플릿태그를 기본적으로 지원하며, 사용자가 직접 태그규칙을 작성하여 실행할 수도 있습니다.


10. 뷰파일은 캐시되어 좀 더 빠른 엑세스를 가능하게 합니다.


11. URL 암호화 기능을 지원하며, 이 암호화 처리는 사용자 암호화클래스를 로드하여 구성할 수도 있습니다. 


12. 개발에 중요한 사항은 기본적인 플러그인으로 제공됩니다. ( Dao,  Paging 등)


13. 기타 다양한 확장을 위해 외부컨트롤러로드 도구를 제공합니다.


14. 지속적인 업데이트가 진행되며 업데이트 반영시 이미 개발된 사용자 어플리케이션에 영향을 거의 주지 않습니다.






1. Spac(Simple Php Action Class)은 클래스기반 개발 프레임웍입니다.

아래는 간단한 "Hello World" 를 출력하는 간단한  예제입니다.


(1) "HelloWorld"  클래스 작성 

model/HelloWorld.Class.php
<?php
class HelloWorld extends Controller {
    function HelloWorld () {
       $this->message = "Hello World!";
    }
    function execute() {
       $this->result_uri = 'helloworld.html';
       $this->dispatcher();
    }
}
?>

view/helloworld.html
<html>
<head></head>
<body>
{=message}
</body>
</html>


(2) 브라우저 호출 / 출력





2. URL을 이용하여 직접 클래스/메소드를 호출하는 방식을 사용합니다.

Spac에선 URL에 실제 웹서버의 디렉토리 및 파일구조를 명시하는 방식이 아닌 가상의 URL을 사용합니다.
이 가상의 URL은 Spac 내부에 구성된 사용자 클래스를 기반으로 구성됩니다.

위의 예제와 같이 URL에 클래스명 및 메소드명을 직접 명시하여 호출하면 Spac 컨트롤러가 해당 클래스의 메소드를 실행시켜 줍니다.

아래는 Spac 을 이용하여 개발시 일반적인 URL 호출 유형입니다.

 





3. Model, View, Controller 의 구조를 기본으로 하는 개발 프레임웍입니다.

다른 일반적인 프레임웍과 마찬가지로 Spac 프레임웍이 비즈니스로직과 프리젠테이션 영역을 분리하여 개발할 수 있도록 도와줍니다.

Model 에서 수행된 비즈니스로직 수행 결과를 View에 전달하여 사용자에게 출력(프리젠테이션) 하는 구조를 가지고 있으며, 이때 Model 과 View를 연결해주는 연결자 역할을 Spac 프레임웍의 Controller 가 담당하고 있습니다.



다음 그림은 Spac 프레임웍의 일반적인 프로세스 구성도 입니다. 



 


 

4. 웹어플리케이션들이 위치하는 웹디렉토리 구성이 자유롭습니다.

Spac 프레임웍을 이용하여 개발하면 웹디렉토리 및 파일구성이 자유롭습니다.

Spac 의 핵심코어 및 개발자가 작성한 중요한 어플리케이션들은 웹에서 직접 접근 불가능한 위치에 둘 수 있으며, 이를 권장합니다.

웹에서 접근 가능한 디렉토리 (일반적으로 "public_html" 혹은 "www" 등..) 에는 "index.php" 파일과 이미지 및 자바스크립트, 스타일시트 파일등만 위치하고, 중요한 웹어플리케이션 파일들은 웹디렉토리 외 다른 디렉토리에 구성할 수 있습니다.


아래는 기본적인 Spac의 디렉토리 구성입니다. (그림에서 public_html 은 웹에서 접근 가능한 웹디렉토리를 의미합니다.)



(위의 디렉토리 구성은 예제이며 사용자의 환경에 맞추어 자유롭게 구성할 수 있습니다.)






5. 클래스매핑을 이용하여 URL 에 직접 명시되는 클래스명이 노출됨으로서 발생할 수 있는 미연의 사고를 방지할 수 있습니다.

Spac에서는 URL 에 비즈니스로직을 명시 호출하여 해당 클래스가 실행되도록 하고 있는데 이때 노출될 수 있는 클래스명을 클래스매핑을 이용하여 전혀 다른 클래스가 실행 되도록 설정할 수 있습니다.

이는 URL로 "AClass" 가 호출되면 실제 "AClass" 가 아닌 "BClass"가 실행되도록 설정 할 수 있음을 의미합니다.



 

6. Spac 프레임웍에는 간편하게 페이지 레이아웃을 구성할 수 있는 도구가 제공됩니다.

기존 PHP 개발시 여러개의 조각 파일을 하나의 레이아웃 파일에 인클루드로 삽입하여 사용하던 방식을 Spac Layout 기능을 이용하면 더욱 더 간편하게 작성하실 수 있고, 유지보수 또한 간편하게 하실 수 있습니다.




▼▼▼





7. HTML을 이용하여 뷰 화면을 구성 / 출력 할 수 있으며, 자유롭게 PHP코드를 사용할 수 있습니다.

사용자가 작성한 클래스에서 도출된 결과값을 특정한 View 파일을 이용하여 출력할 수 있습니다.
이 View 파일은 HTML 코드로 작성할 수 있으며, 이 파일내에서 PHP 코드의 사용 또한 자유롭습니다.





8. 위 View 파일내에 PHP코드를 섞어 쓰는대신 템플릿전용 태그를 사용하여 좀 더 간결한 View를 작성하실 수 있습니다.

View 파일은 기본적으로 HTML코드 및 PHP코드를 사용하여 작성하지만, 여러가지 이유로 PHP코드 섞어 사용하기 불편한 경우 이를 대신하여 전용 템플릿태그를 사용할 수 있습니다.






9. View 파일은 Cache 파일로 저장하여 좀 더 빠른 엑세스를 가능하게 합니다.


레이아웃 및 템플릿 전용 태그를 사용하는 경우 서버에 부담을 줄여주고 속도를 높이기 위해 해당 결과물을 캐시파일로 저장하여 다음번 호출시 해당 로직을 수행하지 않고 즉각 캐시파일을 실행합니다.

원본파일이 수정될 경우 캐시파일이 자동 업데이트 ON/OFF 기능 또한 내장되어 있습니다. 






10. 외부 플러그인 컨트롤러의 자유로운 사용

Spac 프레임웍에서 개발에 필요한 모든 기능을 제공하지 않는 대신, 유용한 외부 클래스를 플러그인으로 로드하여 사용할 수 있는 환경을 제공합니다.

개발의 주가 되는 비즈니스로직과 직접적인 관련인 없는 범용 클래스들을 Spac에서는 외부컨트롤러로 인식하여 로딩하여 사용할 수 있도록 해줍니다.

 

이상 Spac의 일반적인 소개를 마칩니다.




Posted by webdata
우분투 소프트웨어 센터에서 "picker" 로 검색하여 설치하면된다.
html 에 사용할 RGB컬러값을 쉽게 찾을 수 있다..
스포이드 툴도 있어 특정 영역 컬러값을 찾을수도 있다.




Posted by webdata
ErrorBackMsg($msg) 메소드는 어떤 요청에 대해 처리시 에러가 발행했거나, 오류처리를 한 후 뒤로 다시 돌려야 하는경우 사용합니다. 이 메소드는 인자값을 1개 가지고 있으며, 에러시 보여줄 메세지를 등록하면 됩니다.

ex) 로그인시 아이디/비밀번호가 일치 하지 않는경우 해당 메세지 출력 후 뒤로가기 처리

* Login.Class.php
<?php
class Login Extends Controller {
    function Login() {
        .
        .
        .
    }
    function processLogin() {
        if(!$this->checkAccount()) {         //계정이 맞지 않으면 에러출력 후 되돌려보낸다.
             $this->ErrorBackMsg("아이디나 비밀번호가 맞지 않습니다.");
        }
        .
        .
        .
    }
    function checkAccount() {
      .
      .
      .
      .  
        return $result;
    }


}


위의 클래스에선 checkAccount() 메소드가 아이디/비밀번호를 체크하는 메소드라고 가정합니다.
아이디/비밀번호를 체크한 후 맞지 않을경우에 $this->ErrorBackMsg("아이디나 비밀번호가 맞지 않습니다."); 을 호출하면
"아이디나 비밀번호가 맞지 않습니다." 라는 메세지를 자바스크립트 경고창(alert)으로 보여주고 한페이지 뒤로 이동합니다.
Posted by webdata
카테고리 없음2010. 3. 12. 23:47
Spac 프레임웍의 다운로드  제공을 다시 진행합니다.
소스는 아래의 링크에서 받으실 수 있습니다.

Spac 프레임워크 다운로드 : http://www.phpwork.kr/Shopping
Posted by webdata
1. 프로그램 - 우분투 소프트웨어센터 로 이동


2. "compiz" 로 검색한 뒤 관련 소프트웨어를 모두 설치한다.


3. 컴피즈 설정하기




4. 적용된 효과들...






Posted by webdata
Ubuntu 와 친해지기2010. 3. 5. 10:25
우분투에서 mp3 파일 재생이 안될경우에는 아래처럼 관련 소프트웨어를 설치해준다.

1. 프로그램 - 우분투 소프트웨어센터 로 이동


2. mp3 를 입력하여 검색된 결과중 "우분투 제한된 부가기능" 을 설치한다.

Posted by webdata
1. 시냅틱 패키지 관리자 들어가기



2. 패키지관리자가 실행되면 아래처럼 "cairo-dock" 라고 입력하신 후 검색하시어 검색되는 cairo-dock 관련 소프트웨어를
모두 체크한뒤 "적용" 버튼을 클릭하면 설치됩니다.



3. 설치가 완료된 후 프로그램-보조프로그램 'cairo-dock" 을 실행합니다.


4. cairo-dock 이 실행된 화면입니다.

Posted by webdata

Spac 템플릿 클래스에 정의된 사용 가능한 템플릿 태그 리스트입니다.
템플릿태그는 뷰에서 html 코드와 함께 사용 가능하며, 꼭 사용할 필요는 없습니다.
사용하고 싶지 않은경우 "PHP"코드를 그대로 사용하면 됩니다.

1. 단순한 변수 출력용으로 태그를 사용할경우에는 "{=변수}"를 사용합니다. 이때 $this->는 생략합니다.

[ex1]
PHP코드
<?PHP echo $this->myName; ?>

템플릿코드
{=myName}

[ex2]
PHP코드
<?PHP echo $this->printView(); ?>

템플릿코드
{=printView()}




2. 긴 php 코드를 삽입할 경우에는 시작시 "<!--[", 종료시 "]-->" 를 사용합니다. ("<?php.....?>" 를 그대로 사용가능)

[ex1]
<!--[
        if($this->aaa == 10) echo "hello";
]-->


3. 위의 긴 php코드를 삽입할경우 코드내의 변수를 간략히 표현할 경우 "{}" 를 사용하며, 이때 "$this->" 는 생략가능합니다. (단, php 코드안에서 "{=변수}" 형태는 사용할 수 없습니다.)

[ex1] 2번의 예제를 간단히 표현하면
<!--[
            if({aaa} == '11') echo "hello";
]-->


4. Object 지시자("->") 는 점(".") 으로 대체하여 사용 가능합니다.

[ex1]
PHP코드
<?php echo $this->ClassName->MethodName() ?>

템플릿코드
{=ClassName.MethodName()}
  :  "{= " 로 시작했으므로 "<?PHP echo" 가 실행되며, "$this->"는 생략되고, 지시자 "->" 는 "." 으로 대체.

'Spac 매뉴얼 > 템플릿태그의사용' 카테고리의 다른 글

템플릿태그의 사용  (0) 2010.01.18
Posted by webdata
Spac 매뉴얼/Paging2010. 2. 8. 22:21
Spac 에는 기본적으로 페이징 기능이 플러그인으로 내장되어 있습니다.
여기서 페이징이란 게시판처럼 많은 양의 데이터를 한페이지에 모두 한번에 표현할 수 없기때문에 일정량씩 페이지를 분할하여 화면에 출력해주는 것을 뜻합니다.

일반적으로 사용하는 다른 페이징과 크게 다르지 않으나, Spac 의 GET변수 전달방식에 맞추어 쉽게 사용할 수 있도록 제작되어졌습니다.

Spac 페이징을 사용하기 위해선 Paging 클래스 파일을 삽입하거나, getControllerInstance 메소드를 이용하여 Paging 클래스를 Spac 액션클래스 내부로 가져와 사용합니다.

이해를 돕기 위해 실제 게시판 소스의 일부를 발췌했습니다.

아래는 게시판 글 리스트를 출력하는 "예" 입니다. 파란색으로 표현된 부분이 페이징을 위한 코드이므로 이부분을 확인하시면 됩니다.

* Spac/model/BBS.Class.php
<?php
require_once("/home/myAccount/Spac/controller/Paging/Paging.Class.php");     //페이징클래스 파일 삽입
class BBS extends Controller {

    var $Paging = null;
   
    var $page_url;
    var $first = 0;
    var $pgSize = 2;
    var $blcSize = 5;
    var $page = 1;

    function BBS() {}

    function getBBSList() {
       
        $this->setListVars();
       
        $this->bbs_list_array = array();

        //paging
        $this->Paging        = new Paging;                                 //페이징 Object 생성
       
        if(!$this->page)    $this->page = 1;                               //페이지가 명시되지 않으면 항상 1페이지로 고정
        $this->page_url        = "/bbs/BBS/".$this->category;       //기본적으로 호출할 게시판리스트 URL
        $this->pgSize        = 10;                                           //한페이지에 출력할 게시물 수
        $this->blcSize        = 5;                                            //페이지하단에 한번에 표시할 페이지 링크 수
        $this->first        = $this->pgSize*($this->page-1);           //수정하지 않고 그대로 사용합니다.
       
        $query = " Select SQL_CALC_FOUND_ROWS * From bbs where category='".$this->category."' Order by reg_date DESC Limit $this->first,$this->pgSize";
        $this->Dao->executeQuery($query);
       
        while($Rows = $this->Dao->getFetchArray()) {
            $this->bbs_list_array[] = $Rows;           
        }
       
        $query = "Select FOUND_ROWS()";
        $this->Dao->executeQuery($query);
        $this->total_record = $this->Dao->getResult();                //전체 레코드수를 파악하여 변수에 넣습니다.
       
        $this->Paging->initPaging($this->total_record, $this->blcSize, $this->pgSize, $this->page, $this->page_url);
        $this->Paging->getPaging();

    function viewBBS() {
        //특정게시물 보기 코드..........
    }


}
?>


* Spac/view/bbs_list.html
<div id="body_contents" style="display:none">

<table border="0" width="100%" cellpadding="0" cellspacing="0" style="margin-bottom:5px">   
    <tr>
        <td align="left">
            총 <?= $this->total_record ?> 개의 글이 있습니다.
        </td>
        <td align="right">
            <input type="button" value="글작성하기" onClick="Write('{=category}')"></input>
        </td>
       
    </tr>
</table>


<table border="0" width="100%" cellpadding="0" cellspacing="0">
    <tr align="center">
        <td width="50" class="head_col_bg">번호</td>
        <td width="" class="head_col_bg">제목</td>
        <td width="80" class="head_col_bg">작성자</td>
        <td width="130" class="head_col_bg">작성일</td>
    </tr>
   
   
<?
foreach($this->bbs_list_array as $this->Rows) {

    $this->url = "/bbs/BBS/viewBBS/".$this->category."/".$this->Rows['bbs_no']."/".$this->page;

    $this->Rows["reg_date"]        = substr($this->Rows["reg_date"],0,10);

?>   

    <tr align="center" onMouseOver="this.style.backgroundColor='#FFFFFF'" onMouseOut="this.style.backgroundColor=''">
        <td class="body_col_bg">{=Rows["bbs_no"]}</td>
        <td class="body_col_bg" width="" align="left"><a href="{=url}">{=Rows['subjects']}</a></td>
        <td class="body_col_bg">{=Rows["user_name"]}</td>
        <td class="body_col_bg">{=Rows["reg_date"]}</td>
    </tr>


<?
}
?>   
   
</table>   
   
   
<table border="0" width="100%" cellpadding="5" cellspacing="0">   
    <tr>
        <td align="center">
             <?=$this->Paging->pageString?>
        </td>
    </tr>
</table>

</div>


*  BBS 클래스의  $this->Paging->getPaging(); 을 호출하게되면 "$this->Paging->pageString" 변수에 출력할 페이지 이동 링크가 저장되므로 위의 뷰에서처럼 그대로 출력해주면 됩니다.

Posted by webdata
Spac 매뉴얼/로깅2010. 2. 8. 21:58

Spac을 이용해 웹사이트를 개발하게되면 Spac 컨트롤러가 URL을 해석해서 적절한 모델클래스를 호출하고 실행하게되는데 이 일련의 과정을 로그로 기록할 수 있습니다.

로그를 기록하기 위해선 Spac 컨트롤러 설정을 해야 합니다.
아래는 로그관련 설정부분입니다.

* Spac/controller/Controller.ini
[loging]
spacFileLoging    = true
spacLogFilePath    = "/home/계정/Spac/logs/spac"
errReport    = true    
errPrintView   = false 
errFileLoging   = true 
errLogFilePath   = "/home/계정/Spac/logs/error"
errPage     = "/error.html"
viewDispatcherSource = false

1. spacFileLoging  : true 로 설정하게 되면 로그 기록이 작동됩니다. 이후부터  Spac 접속로그가 모두 파일로 기록됩니다.
2. spacLogFilePath : 로그 파일이 저장되는 경로입니다.
3. errReport  : 에러발생시 에러내용을 출력할 것인지 여부입니다.
4. errPrintView : 위 3번에서 에러내용을 출력할 경우에 화면으로 보여줄것인지 설정합니다.
5 errFileLoging  : 위의 에러 내용을 파일로 저장합니다.
6. errLogFilePath : 파일로 저장할 경우 저장될 경로를 지정합니다.
7. errPage : 에러를 화면에 출력하지 않을경우 이동할 에러페이지를 지정합니다. (View 경로를 기준으로합니다.)
8. viewDispatcherSource : 화면에 출력할 내용을 소스그대로 출력합니다.(에러와 무관)

* 위의 설정 중 로그파일들이 저장될 경로는 익명으로 파일을 쓰기 가능하도록 퍼미션을 설정합니다.(ex. 707)

* 로그파일은 날짜별로 하루에 1개씩 생성되며, 하루의 로그들은 하나의 파일에 누적되어 저장됩니다.


아래는 Spac 로그의 예입니다.

* Spac/logs/spac/20091205.access.log
### ------------SPAC Access Log-----------###-------------2009-12-05 01:49:23
1. REMOTE_ADDR             : ::1
2. REQUEST_URI             : /User/viewUserRegForm
3. PATH_INFO             : /User/viewUserRegForm
4. QUERY_STRING         :
5. Used urlPathInfo     : /User/viewUserRegForm
6. actionClassName         :
7. actionMethodName     :
8. args                 : Array
(
)

### ------------SPAC Access Log-----------###-------------2009-12-05 01:49:28
1. REMOTE_ADDR접            : ::1
2. REQUEST_URI             : /User/User/viewUserRegForm
3. PATH_INFO             : /User/User/viewUserRegForm
4. QUERY_STRING         :
5. Used urlPathInfo     : /User/User/viewUserRegForm
6. actionClassName         : User
7. actionMethodName     : viewUserRegForm
8. args                 : Array
(
)


각각의 접속 시각이 기록되고 해당 접속의 URL 호출값 및 실행된 액션클래스값을 보여줍니다.

1. REMOTE_ADDR : 접속자의 ip 정보를 보여줍니다. (위의 예제에선 로컬서버에 접속한 이유로 기록되지 않았습니다.)
2. REQUEST_URI : 접속자가 브라우져에 요청한 URL 값입니다.
3. PATH_INFO : 접속자가 브라우져에 요청한 URL 값중 index.php 이하의 path 값을 보여줍니다.
4. QUERY_STRING : 접속자가 브라우져에 요청한 Query String 값을 보여줍니다.(index.html?/Class/Method 방식으로 호출)
5. Used urlPathInfo : 접속자가 호출한 URL 을 분석하여 실제 Spac에서 사용할 Url로 변환된 값입니다.
6. actionClassName : URL을 분석하여 실행된 액션클래스명
7. actionMethodName : URL을 분석하여 실행된 액션클래스내의 메소드명
8. args : 전달된 변수값들을 배열로 보여줍니다.





다음은 에러로그값입니다.

* Spac/logs/spac/20091205.error.log
### ------------SPAC Error Log-----------###-------------2009-12-05 01:49:23
1. REMOTE_ADDR             : ::1
2. REQUEST_URI             : /9User/viewUserRegForm
3. PATH_INFO             : /9User/viewUserRegForm
4. QUERY_STRING         :
5. Used urlPathInfo     : /9User/viewUserRegForm
6. actionClassName         :
7. actionMethodName     :
8. args                 : Array
(
)

9. error Message--------------------------

[클래스명 에러]
에러명 : Class Name Error
에러내용 : 클래스명으로 "9User" 을 사용할 수 없습니다
안내 : 클래스명은 영문대문자로 시작해야하며, 2글자이상이어야 하고, 두번째 글자부턴 영문 대/소문자, 숫자, 언더바(_) 만 사용가능합니다.


위의 로그값은 에러 발생시 생성되는 로그값입니다.
1~8 번까지는 이전의 access 로그의 값과 같습니다..
9. error Message : 에러내용을 출력해줍니다.




Spac 로그 및 에러로그는 접속시마다 많은양의 로그가 누적되어 기록됩니다.
따라서 실제 서비스 운영시 로그파일의 적절한 관리가 필요합니다. (예. 주기적으로 백업후 삭제)
Posted by webdata