이 포스팅은 어플리케이션 아키텍쳐 패턴 11장을 요약한 내용입니다.
필요한 데이터를 모두 포함하지는 않지만 데이터가 필요할 때 가져오는 방법을 아는 객체
데이터베이스에서 메모리로 데이터를 로드하는 기능을 만들 때 원하는 객체를 로드하면서 연관된 객체를 함께 로드하도록 설계하는 것이 좋다. 이렇게 하면 객체를 사용하는 개발자가 직접 필요한 객체를 모두 로드할 필요 없이 로드 기능을 더 편리하게 사용할 수 있다.
그런데 한 객체를 로드 할 때 연관된 객체가 지나치게 많이 로드되고, 실제로는 소수의 객체만 필요한 상황에서 오히려 성능이 저하되는 경우가 발생할 수 있다.
지연 로드(Lazy Load)는 이 로딩 프로세스를 일시적으로 중단하고 객체 구조에 표시를 남겨서 나중에 데이터가 필요할 때 로드할 수 있게 한다.
작동 원리
지연 로드를 구현하는 주요 방법으로는 지연 초기화, 가상 프록시, 값 홀더, 고스트의 네 가지가 있다.
지연 초기화(Lazy Initialization)
- 필드에 접근할 때 먼저 필드가 null인지 확인하는 것이다.
- 필드가 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 |