본문 바로가기

Design Patterns

지연로드(Lazy Load) 패턴

이 포스팅은 어플리케이션 아키텍쳐 패턴 11장을 요약한 내용입니다.

 

필요한 데이터를 모두 포함하지는 않지만 데이터가 필요할 때 가져오는 방법을 아는 객체

 

데이터베이스에서 메모리로 데이터를 로드하는 기능을 만들 때 원하는 객체를 로드하면서 연관된 객체를 함께 로드하도록 설계하는 것이 좋다. 이렇게 하면 객체를 사용하는 개발자가 직접 필요한 객체를 모두 로드할 필요 없이 로드 기능을 더 편리하게 사용할 수 있다.

그런데 한 객체를 로드 할 때 연관된 객체가 지나치게 많이 로드되고, 실제로는 소수의 객체만 필요한 상황에서 오히려 성능이 저하되는 경우가 발생할 수 있다.

지연 로드(Lazy Load)는 이 로딩 프로세스를 일시적으로 중단하고 객체 구조에 표시를 남겨서 나중에 데이터가 필요할 때 로드할 수 있게 한다.

 

작동 원리

지연 로드를 구현하는 주요 방법으로는 지연 초기화, 가상 프록시, 값 홀더, 고스트의 네 가지가 있다.

지연 초기화(Lazy Initialization)

  1. 필드에 접근할 때 먼저 필드가 null인지 확인하는 것이다.
  2. 필드가 Null 이면 필드 값을 조회 후 반환한다.
class Supplier...
	
    public List getProducts(){
    	if(products == null){
        	products = Product.findForSupplier(getID());
            return products;
        }
    }

지연 초기화는 사용하기는 간단하지만 객체와 데이터베이스 간의 의존성을 강제하는 경향이 있다.

 

가상 프록시(Virtual Proxy)

원래 객체처럼 생겼지만 실제로는 데이터를 포함하지 않으며, 메서드 중 하나가 호출돼야 데이터베이스에서 객체를 로드한다.

class VirtualList...
	
    private List source;
    private VirtualListLoader loader;
    
    public VirtualList(VirtualListLoader loader){
    	this.loader = loader;
    }
    
    private List getSource(){
    	if (source == null)
        	source = lodaer.load();
        return source;
    }
    
    public int size(){
    	return getSource().size();
    }
    
    public boolean isEmpty(){
    	return getSource().isEmpty();
    }
    ...

 

값 홀더(Value Holder)

  • 객체를 래핑하는 객체
  • 기반 객체를 얻으려면 값 홀더에 값을 요구하면 된다.
  • 처음 접근할 때만 데이터베이스에서 데이터를 가져와서 전달한다.
class ValueHolder...
	
    private Object value;
    private ValueLoader loader;
    
    public ValueHolder(ValueLoader loader){
    	this.loader = loader;
    }
    
    private Object getValue(){
    	if (value == null)
        	value = lodaer.load();
        return value;
    }
    
class SupplierVH...
	
    private ValueHolder products;
    
    public List getProducts() {
    	return (List) products.getValue();
    }

단점

  • 클래스가 값 홀더가 있다는 것을 알아야 함
  • 명시적이지 않다.

고스트

  • 미완성 상태의 실제 객체
  • 데이터베이스에서 처음 로드한 객체에는 ID만 포함돼 있지만, 필드에 접근하려고 하면 전체 상태가 로드된다.

 

사용 시점

  • 지연 로드는 관점 지향 프로그래밍과 잘 어울린다.
  • 지연 로드는 필드에 접근하는 데 추가 데이터베이스 호출이 필요한 경우에만 의미가 있다.
  • 성능 관점에서 지연 로드는 데이터를 가져오는 비용을 언제 지불할지 결정하는 것이다.
  • 데이터를 가져오려면 추가 호출이 필요하지만 이 데이터가 주 객체와 함께 사용되지 않는 경우 지연로드를 사용하기에 가장 적합하다.

'Design Patterns' 카테고리의 다른 글

매퍼 패턴, 계층 상위 형식패턴  (0) 2020.10.09
게이트웨이 패턴, 서비스 스텁 패턴  (0) 2020.10.08
식별자 맵 패턴  (0) 2020.10.03
작업단위 패턴  (0) 2020.10.03
애그리거트 트랜잭션관리  (0) 2020.09.20