본문 바로가기

Dev Story/아키텍처

Lazy 클레스를 이용한 싱글패턴 - 실무편(DB 관리 클레스)

이 글 을 쓰는 목적은 DotNet4.0 부터 사용가능한 Lazy<T> 클래스 는 싱글톤 적용시 

간편 하면서도 멀티 쓰레딩에 안전한 방법이라 소개 하고자 포스팅 하게 되었다.


(물론 많은 분들이 알고 계실테지만..)


정의: 객체 초기화 시점을 지연해서 객체가 필요한 시점에 초기화 가 이루어지고 

이후 생성된 객체를 참조 하게 된다.

용도: 메모리 효율을 높일수 있다, 싱글톤에 효율적으로 사용 된다.


간략하게 클레스 구조를 설명하자면 


객체 생성시 new를 사용하면 바로 객체가 생성 되므로 팩토리(Factory) 패턴을 이용하여 객체를 생성한다

(사용을 위한 선언과 실제 객체가 생성되는 시점을 관리 할 수 있으므로)


한번 생성된 객체는 이후에는 재사용 되므로 싱클톤(Singleton) 패턴을 띠고 있다.


출처:http://blog.naver.com/PostView.nhn?blogId=dotnethelper&logNo=60104797637&categoryNo=0&parentCategoryNo=0&viewDate=&currentPage=2&postListTopCurrentPage=&isAfterWrite=true



이 클래스 내부 구조는 DCL(doubl-checked locking) 패턴을 사용 하고 있어

멀티 쓰레딩 에 안전한 구조를 띠고 있다.


DCL에 대해 간략히 말하자면 객체 생성시 

클래스의 인스턴스가 이미 생성되었는지 검사하여 동기화 블록에 들어가지 않도록 하여 비용을 줄인다.

소스 예제를 보면 아래와 같다.


Class Singleton

{

  private static Singleton instance = null;

 

  public static Singleton Instance() 

  {

    if ( instance == null ) 

    { 

      lock(typeof(Singleton) )

      {

        if ( instance == null ) 

        {

          instance = new Singleton();

        }

      }

    }

    return instance;

  }

}

  

이런식으로 이중으로 체크를 한다고 해서 DCL 이라고 부른다.


DCL에 자세한 내용을 알고 싶다면 아래 사이트를 참고 하길 바란다.

출처:http://www.hanbit.co.kr/channel/category/category_view.html?cms_code=CMS6818849791



다음은 실무에 적용한 예제를 설명 하겠다.

MySql 을 관리 하는 클레스 이다.




이 클레스 호출은 GetInstance 를 호출한다.








클레스 전체 소스를 원하시거나 궁금한 사항 있으시면 댓글 바랍니다.