본문 바로가기

Academy I/Tech Academy

[Delphi]Spring4d 강좌 2 Lazy Object Creation

혹시 Lazy Loading라는 말을 들어본적이 있는가? 이 게으른 로딩이라는 것은 쉽게 말하자면 어떤 자원을 정말로 필요할 때까지 메모리나 네트웍에 적재하지 않겠다는 것이다. 

예를 들면, Database 프로그래밍에서 Blob 필드는 매우 까탈스런 존재다. select 쿼리 문장에 Blob 필드가 추가되는 순간, 그 select 문은 매우 느려질 수 있다. 왜냐하면 Blob 필드는 크기도 가변적이지만, 일반 문자열 필드에 비하면 용량이 월등히 커기에 네트웍 대역폭을 엄청 잡아 먹을 수 있기 때문이다. 

이 때문에 일반적인 SELECT문에 BLOB 필드를 나열하지 말고 단순 필드만 나열해서 호출하고, 실제로 BLOB 필드 내용을 보여줄 필요가 있을 때에만 다시 Blob 필드만 select하는 쿼리를 별도로 호출하라는 것이다. 이 개념이 Lazy Loading 이다.

객체지향에서도 이와 비슷한 개념이 Lazy Object Creation이다. 그 객체가 정말로 필요할 때 까지 그 객체를 생성하지 않겠다는 개념이다. 

전역 객체들 중에는 프로그램 실행 중에 한번도 참조되지 않는 것이 있을 수 있다. 그 객체가 필요하긴 하지만, 사용자가 어떤 버튼을 클릭하지 않는 한, 또는 어떤 특정 함수를 실행하지 않는 한, 그 객체 생성이 필요 없을 수 있다. 그 객체가 매우 덩치가 커서 메모리 용량을 많이 먹거나, 빈번한 생성/파괴가 바람직하지는 않아서, 정작 필요할 때만 생성토록 하자는 것이 Lazy Object Creation이다. 

다음과 같은 코드가 있다고 가정하자.

uses Spring;

type
  TMyObject = class
  public
    // 중략
    constructor Create;
    destructor Destroy; override;
  end;

  // 중략

var
  obj : Lazy<TMyObject>;

메인폼의 OnCreate 이벤트 혹은 initializaton 영역에 다음과 같은 코드를 기술했다고 가정하자.

obj.Create(function : TMyObject begin
      Result := TMyObject.Create;
    end, true);

메인폼의 어떤 버튼에 다음과 같은 OnClick 이벤트를 만들었다고 가정하자.

procedure TForm3.Button1Click(Sender: TObject);
begin
  obj.Value.field1 := '1111';
end;


이제 TMyObject 객체는 저 버튼을 클릭하지 않는 한, 생성되지 않는다. 다시 말하자면 obj.value를 참조하는 코드가 실행되지 않는 한 TMyObject 객체는 생성되지 않는다는 것이다. 

Srping4d의 Lazy<T>는 그 객체 혹은 자원을 실행중에 정말 참조할지 말지 애매모호할 때 사용한다.

참고로 Lazy<T>.Create 의 두번째 인수는 자동 파괴 여부이다. 위 코드에서는 true이므로 이전 강좌의 Managed<T>처럼 자신이 선언된 위치에 따라서 자동으로 파괴된다.




[출처 : https://www.delmadang.com/community/bbs_view.asp?bbsNo=3&bbsCat=0&indx=452250&page=2]