지연 로딩이란 무엇입니까?


91

지연 로딩이란 무엇입니까?

[몇 가지 답변을 읽은 후 편집] 사람들이이 용어를 자주 사용하는 이유는 무엇입니까?

ASP / ADO 레코드 집합을 사용하고 gridview에 대한 데이터 또는 ADO.NET 데이터 소스와 함께로드한다고 가정 해보십시오.

왜 사람들이 Lazy Loading이라는 용어를 사용하는지 물어 보았어야했는데 어떤 "다른"유형이 있습니까?

답변:


225

게으른 사람처럼 원하지 않는 일을 미루기 때문에 지연 로딩이라고합니다. 반대는 Eager Loading으로, 필요하기 훨씬 전에 즉시로드합니다.

왜 사람들이 지연 로딩을 사용하는지 궁금하다면 시작하는 데 시간이 오래 걸리는 애플리케이션을 고려해보세요. 이 응용 프로그램은 아마도 디스크에서 작업을로드하고 계산을 수행하는 등 많은 노력을 기울이고있을 것입니다.

이를 지연로드와 비교하면 애플리케이션이 훨씬 더 빠르게 시작되지만 장기 실행로드가 필요한 작업을 처음 수행해야하는 경우 처음로드되는 동안 약간의 일시 중지가있을 수 있습니다. 따라서 지연로드를 사용하면 애플리케이션을 실행하는 동안로드 시간을 분할 할 수 있습니다. 그리고 실제로 사용자가 사용하지 않으려는 항목을로드하지 않아도됩니다.


@Mike Stone, 안녕하세요, 게으른 로딩을 언제 사용해야하는지 설명해 주시겠습니까? 아시다시피 파일 관리자를 실행하면 지연 로딩 디자인을 활용합니다.
Alston

40

지연 로딩은 처음 필요할 때만 객체를로드하거나 초기화하는 프로그래밍 방식입니다. 이는 특히 애플리케이션에 많은 구성 요소가있는 경우 잠재적으로 성능을 크게 향상시킬 수 있습니다.

평소와 같이 Wikipedia 에 자세한 내용이 있습니다.


14

지연 로딩은 우리가 그것을 필요로하는 지점까지 오브젝트 유닛의 로딩을 지연시키는 개념입니다. 불필요하게 개체를로드하지 않고 요청시 개체로드시 간단한 단어를 입력합니다. 예를 들어 "Orders"개체가 집계 된 "Customer"클래스가있는 경우입니다. 따라서 고객 데이터를로드하고 싶지만 애플리케이션에 필요할 때까지 지연하려는 주문 개체가 있습니다.

아래는 lazy loading 사용 방법, lazy loading 구현 방법 및 장점과 단점을 보여주는 YouTube 동영상입니다.

http://www.youtube.com/watch?v=2SrfdAkwmFo



7

지연 로딩이라는 용어는 일반적으로 객체 관계형 매퍼에 대해 이야기 할 때 사용됩니다. ADO.NET을 직접 사용하는 경우 항상 즉시로드됩니다 (즉, 항상 지정한대로로드됩니다).

nHibernate와 같은 OR- 매퍼는 데이터에 액세스 할 때만 올바른 데이터로 "채워진"프록시 객체를 반환하는 것을 지원합니다. 그렇게하면 실제로 사용하는 데이터 만로드 할 수 있습니다. 이것은 데이터베이스에서로드 할 수있는 개체간에 많은 관계를 지정하고 OR 매퍼가 모든 관련 개체 및 관련 개체와 관련된 개체를로드하지 않도록 할 때 유용한 기능입니다. 이로 인해 전체 데이터베이스가로드 될 수 있습니다.

이 문제는 개체 모델을 신중하게 설계하여 방지 할 수도 있습니다. (도메인 기반 설계와 같이 집계를 사용하고 집계 루트 만로드하는 것은 지연로드를 사용하지 않고이 문제를 해결할 수있는 방법입니다).

지연로드는 또는 매퍼가 필요한 모든 데이터를 한 번 검색하는 대신 많은 소규모 데이터베이스 액세스를 수행 할 수 있습니다. 이로 인해 성능 문제도 발생할 수 있습니다.


5

다음은 내가 작성한 실제 Python 코드의 예입니다.

class Item(Model):
    ...
    @property
    def total(self):
        if not hasattr(self, "_total"):
            self._total = self.quantity \
                  + sum(bi.quantity for bi in self.borroweditem_set.all())
        return self._total

기본적으로 인벤토리의 항목을 나타내는 Item 클래스가 있습니다. 우리가 가지고있는 총 아이템 수는 우리가 소유 한 수와 다양한 출처에서 빌린 모든 아이템의 합계입니다. 이 숫자는 모두 데이터베이스에 저장되며 총계가 실제로 요청 될 때까지이를 계산하는 것은 의미가 없습니다 (총계를 요청하지 않고 항목이 자주 사용되기 때문에).

따라서 total 속성은 _total 필드가 있는지 여부를 확인합니다. 그렇지 않은 경우 속성 코드는 데이터베이스를 쿼리하고 계산 한 다음 _total 필드에 값을 저장하므로 다음에 요청할 때 다시 계산할 필요가 없습니다.


4

지연로드 : 필요하지 않을 수도있는 항목에 시간 (또는 기억)을 낭비하지 않습니다. 그런 다음 필요할 때 더 오래 걸리지 만 괜찮습니다.

삶의 예 : 실제로 프랑스어 관용구를 배우는 대신 필요에 따라 한 번에 하나씩 구를 배웁니다. 이것이 언제 말이 되는가? 짧은 시간 동안 만 프랑스에있을 예정이거나 (즉, 많은 문구가 필요하지 않음) 곧 떠나야하는 경우. 2 년 동안 거기에 있거나 공부할 시간이 긴 경우, 전체 관용구를 미리 배우는 것이 훨씬 더 효율적일 수 있습니다 (간단한 로딩).

[ WKRP에서 Venus가 갱단 용어로 가르친 Atom에서 영감을 얻었 습니다 .]


일이 오래 걸리는 것이 항상 옳은 것은 아닙니다. 가장 최적의 방식으로 구현되지 않은 경우 지연로드가 실제로 응용 프로그램 속도를 크게 저하시킬 수 있음을 경험했습니다.
Captain Sensible

1
@SeventhElement 나는 그것이 괜찮다고 주장하지 않습니다. 지연 로딩을 이해하기위한 기초입니다. 괜찮지 않은 경우 (예 : UI가 느려지거나 다른 이유로 인해) 즉시로드를 선택할 수 있습니다.
Dan Rosenstark

4

지연로드는 필요한 경우에만 필요한 정보의 일부를로드하는 개념을 나타 내기 위해 데이터베이스에서 자주 사용되는 용어입니다.

즉, 여러 테이블의 조인이있는 레코드가 필요하다고 가정합니다. 한 번에 모두 가져 오면 기본 테이블 만 가져 오는 것보다 시간이 더 오래 걸립니다. 지연 로딩을 사용하면 필요한 경우에만 나머지 정보를 가져옵니다. 따라서 특정 시나리오에서는 실제로 '효율적인 로딩'입니다.

다른 유형의 '로딩'은 다음과 같습니다.

  1. Eager Loading-연결된 모든 테이블을 한 번에로드합니다.

3

디자인 패턴입니다.

지연로드 : 코드에서 특정 개체에 의해 수행되는 작업이 필요할 때까지 개체는 초기화되지 않으며 초기화 된 후에는 개체를 다시 초기화하지 않지만 이전에 초기화 된 개체를 사용합니다.

이렇게하면 코드가 훨씬 더 효율적이고 메모리 사용량을 관리하는 데 도움이됩니다.

지연 로딩의 예제 애플리케이션 :

Ghost Lazy 초기화 값 홀더


3

지연로드의 몇 가지 장점 :

  1. 응용 프로그램의 시작 시간을 최소화합니다.
  2. 응용 프로그램은 주문형로드로 인해 메모리를 덜 사용합니다.
  3. 서버에 대한 불필요한 요청을 피합니다.

2

Lazy Loading의 예로는 웹 페이지에 많은 데이터가있는 그리드 또는 테이블을 사용하여 응용 프로그램이 당시 사용자 브라우저 관점 크기 만로드하는 위치를 볼 수 있습니다. 더 많은 콘텐츠 나 데이터를보기 위해 아래로 스크롤하면 그 순간 더 많은 데이터가 뷰에로드됩니다.

이것은 ajax 또는 jQuery를 통해서도 일반적인 시각적 / 인터랙션 디자인 패턴이되고 있습니다.

그리고 위에서 언급했듯이 클라이언트를 고려하지 않아 잠재적으로 성능 저하가 발생할 수있는 Eager Loading이 반대입니다.



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.