천

PHP에서 싱글톤 패턴 구현하기 입니다.

· 2015-11-28 (토) 15:31:46 · 2674

싱글톤 패턴이란?
 싱 글톤 패턴이란 프로그램/사이트 전체에서 단 하나의 객체만 생성해서 사용하게 만드는 디자인 패턴이다. 조금만 주의해서 객체를 하나만 생성해서 전체적으로 사용하면 되지 굳이 디자인 패턴까지 사용해야 하냐는 사람도 있겠지만, 사이트가 커지고 파일이 여러군대로 갈라지며 파일 여기저기서 객체를 생성해야 할 때가 되면 내가 어디서 어떤 객체를 생성 하였고 또 어디서 사용하였는지 기억하기란 쉽지 않다. 그래서 항상 하나의 인스턴스만 생성하게 해주는 싱글톤 패턴이 탄생 하게 되었다.
 PHP도 5.0버전대로 진입하면서 static 멤버와 함수를 사용가능하게 되면서 싱글톤 패턴이 사용가능 하게 되었다.


싱글톤 패턴의 장점
 객 체가 하나만 생성된다는 장점도 크지만, 한가지 더 장점이 있다. 객체를 사용하는 그 순간에 생성된다는 것이다. 예전에 사용하던 전역 변수 방식과 비교해 보면 전역변수 방식은 모든 객체를 일시에 생성하고 페이지 로딩이 끝날때 쯤에 모두 소멸한다. 하나의 사이트에 객체를 수십/수백 가지를 사용하게 된다면 그 수십/수백가지의 객체들이 모든 페이지에서 모두 사용되는 것은 아닐 것이다. 사용되는 객체도 있고 사용되지 않는 객체도 있다.
 전역변수 방식을 사용하면서 효과를 보기위해서는 모든 변수를 한곳에 몰아 넣고 일괄 생성하고 수정사항이 발생하면 몰아 넣은 파일에 가서 수정하는 것이 가장 효율적인 방법이다. 이렇게 되면 특정 페이지에서 필요없는 객체를 생성하는 비효율적인 면을 보이게 된다.
 그러나 싱글톤을 잘 구현하게 되면 이러한 제약에서 벗어나게 된다. 최초 getInstance()를 호출하게 되는 순간에 객체가 생성되고 두번째 호출부터는 생성된 인스턴스만 반환하게 된다. 생성자도 한번만 호출되게 되고 소멸자도 한번만 호출 되게 된다. 그리고 언제 어느곳에서 사용해도 문제가 없으며, 여러번 getInstance()를 호출해도 객체는 한번만 생성된다. getInstance()를 호출하지 않은 객체는 생성되지 않는다.

 

싱글톤 패턴의 구현
 설명은 거창하게 했지만 구현은 아주 간단하다.

 
1.class Singleton 
2.{ 
3. 
4.    /* 싱글톤 패턴 */ 
5.    private static $singleton; 
6.    public static function getInstance() { 
7.        if(!isset(Singleton::$singleton)) Singleton::$singleton= new Singleton(''); 
8.        return Singleton::$singleton; 
9.    } 
10. 
11.    function __construct() { 
12.        echo "생성"; 
13.    } 
14. 
15.    function __destruct() { 
16.        echo "소멸"; 
17.    } 
18. 
19.} 
class Singleton { /* 싱글톤 패턴 */ private static $singleton; public static function getInstance() { if(!isset(Singleton::$singleton)) Singleton::$singleton= new Singleton(''); return Singleton::$singleton; } function __construct() { echo "생성"; } function __destruct() { echo "소멸"; } }
  static 메소드와 static 멤버변수를 이용해서 구현한다. static 멤버를 호출하는 방법은 클래스명::메소드(변수) 이렇게 호출한다. static 이란 말의 의미는 객체를 생성하지 않아도 호출 가능하다는 것이다.
 static 멤버변수를 하나 선언하고 선언된 멤버변수를 getInstance()에서 new를 이용해 할당한다. 이때 isset
 

기존페이지나 새로운 페이지로 연결. [링크]를 클릭함
 •검색 결과가 존재하지 않습니다.

[새 페이지 생성] - 관련페이지가 없을 경우 새 페이지를 생성함
함수를 이용해 할당되었으면 할당된 것을 반환하고 할당되지 않은 것이라면 new연산자를 이용해 객체를 생성한다.

 
1.$single3 = Singleton::getInstance(); 
2.echo $single3->view(15); 
3. 
4.$single = Singleton::getInstance(); 
5.echo $single->view(15); 
6. 
7.$single2 = Singleton::getInstance(); 
8.echo $single2->view(15); 
9. 
10.$single4 = Singleton::getInstance(); 
11.echo $single4->view(15); 
$single3 = Singleton::getInstance(); echo $single3->view(15); $single = Singleton::getInstance(); echo $single->view(15); $single2 = Singleton::getInstance(); echo $single2->view(15); $single4 = Singleton::getInstance(); echo $single4->view(15);
  클래스를 선언하고 위와 같이 사용하게 된다. Singleton::getInstance();는 언제 어디서나 사용가능하다. 위와 같이 사용하게 되어도 아래와 같은 결과가 나오게 된다.

생성
소멸

 객체는 하나만 생성 되었기 때문에 위와 같이 생성자와 소멸자가 한번만 호출 되게 된다.

 

싱글톤 사용을 위한 좀더 나은 방법
 싱 글톤 패턴 사용을 위해서 좀더 나은 방법을 사용해 보자. PHP5.0버전에 추가된 __autoload()함수를 오버라이드 해 보자. 이 함수는 클래스의 메소드가 아니라 독립적인 함수이다. 클래스의 선언없이 외부에서 사용가능하다. 이 메소드를 사용하면 선언되지 않은 클래스를 사용할때 자동으로 호출되며, 내부 구현에 따라 클래스가 정의된 파일을 인크루드 하게 된다. 


1.function __autoload($name) { 
2.    global $g4; 
3.    include_once "$g4[path]/class/{$name}.class.php";   // 절대경로는 지원하지않는다. 상대경로만 적도록.. 
4.} 
function __autoload($name) { global $g4; include_once "$g4[path]/class/{$name}.class.php"; // 절대경로는 지원하지않는다. 상대경로만 적도록.. }
  위 예제는 그누보드에서 모든 클래스 파일들을 /class 폴더에 위치 시키고 __autoload()를 위와 같이 선언하게되면 언제 어디서든 인크루드 없이 클래스를 사용가능하다. static 메서드를 호출할 때에도 마찬가지로 자동으로 인크루드 해 준다. $name은 호출하려한 클래스 명이다.

 

그누보드에서 사용하기
 그누보드에서 /extend 폴더를 활용한다. /extend 폴더에 php파일을 넣어두면 모두 인크루드 된다. 간단하게 /extend/index.php 파일에 위 소스코드를 삽입한다. 그리고 /class 폴더 아래에 자신이 생성하고자 하는 클래스 파일을 파일명을 맞추어서 넣어준다. 위의예에서는 클래스명.class.php 이러한 형식으로 파일을 넣어준다.
 이제 그누보드 어디서든 클래스명::getInstance() 하게되면 인스턴스를 반환 받게되고 클래스 정의 파일은 자동으로 인크루드 된다.

 

테스트 환경
 PHP 5.2.5

|
댓글을 작성하시려면 로그인이 필요합니다.

프로그램

8,188건
+
제목 글쓴이 날짜 조회
15-12-13 조회 2,905
15-12-11 조회 3,371
15-12-11 조회 3,066
15-12-11 조회 2,904
15-12-11 조회 2,552
15-12-11 조회 2,518
15-12-11 조회 2,523
15-12-10 조회 2,478
15-12-10 조회 2,545
15-12-10 조회 2,519
15-12-10 조회 2,761
15-12-09 조회 2,685
15-12-08 조회 3,609
15-12-08 조회 2,891
15-12-08 조회 2,637
15-12-08 조회 2,919
15-12-07 조회 3,000
15-12-07 조회 2,718
15-12-07 조회 3,101
15-12-07 조회 2,749
15-12-06 조회 2,874
15-12-06 조회 2,582
15-12-06 조회 2,823
15-12-05 조회 2,748
15-12-05 조회 3,003
15-12-05 조회 2,775
15-12-04 조회 2,640
15-12-04 조회 2,752
15-12-04 조회 2,802
15-12-03 조회 2,760
15-12-03 조회 2,792
15-12-03 조회 2,821
15-12-03 조회 2,900
15-12-03 조회 3,161
15-12-03 조회 2,675
15-12-02 조회 2,899
15-12-02 조회 2,853
15-12-02 조회 2,842
15-12-02 조회 2,991
15-12-02 조회 3,038
15-12-01 조회 2,730
15-12-01 조회 2,520
15-12-01 조회 2,600
15-11-30 조회 2,793
15-11-30 조회 2,950
15-11-30 조회 2,850
15-11-29 조회 2,618
15-11-29 조회 2,868
15-11-29 조회 2,681
15-11-28 조회 2,615
15-11-28 조회 2,642
15-11-28 조회 2,675
15-11-27 조회 2,769
15-11-27 조회 2,622
15-11-27 조회 2,631
15-11-26 조회 2,798
15-11-26 조회 3,655
15-11-25 조회 2,753
15-11-25 조회 2,712
15-11-25 조회 2,771
15-11-25 조회 2,567
15-11-25 조회 2,911
15-11-23 조회 2,833
15-11-23 조회 2,981
15-11-23 조회 2,812
15-11-21 조회 2,706
15-11-21 조회 2,606
15-11-21 조회 2,548
15-11-20 조회 2,540
15-11-20 조회 2,496
15-11-20 조회 2,626
15-11-20 조회 2,881
15-11-18 조회 2,778
15-11-18 조회 2,658
15-11-18 조회 2,640
15-11-17 조회 2,845
15-11-17 조회 2,603
15-11-17 조회 2,744
15-11-16 조회 2,629
15-11-16 조회 2,594
15-11-16 조회 2,780
15-11-15 조회 2,793
15-11-15 조회 2,650
15-11-15 조회 2,740
15-11-13 조회 3,596
15-11-12 조회 3,481
15-11-12 조회 2,936
15-11-12 조회 3,602
15-11-11 조회 2,739
15-11-11 조회 3,001
15-11-11 조회 3,252
15-11-09 조회 2,756
15-11-09 조회 2,985
15-11-09 조회 2,952
15-11-09 조회 2,711
15-11-09 조회 2,758
15-11-09 조회 3,003
15-11-06 조회 3,348
15-11-05 조회 2,808
15-11-05 조회 2,689