JAVA

[JAVA] Lombok Lazy Getter(lazy=true)

인생아 2024. 10. 31. 09:57
반응형

Lombok@Getter(lazy=true)를 사용하면 지연 로딩(lazy loading)을 구현할 수 있습니다. 지연 로딩은 객체의 속성 값을 필요할 때만 초기화하여 메모리 사용을 최적화하는 기법입니다. 이는 대용량 데이터연산이 필요한 값을 다루는 환경에서 메모리 최적화성능 개선에 도움을 줍니다. 여기서는 @Getter(lazy=true)의 동작 방식과 사용 방법, 그리고 실무에서 메모리 사용 최적화에 유용한 이유를 알아보겠습니다.

@Getter(lazy=true)를 통한 지연 로딩 구현

@Getter(lazy=true)는 특정 필드에 대해 지연 로딩을 설정할 수 있도록 Lombok에서 제공하는 기능입니다. lazy=true로 설정하면, 필드 값이 처음으로 요청될 때 해당 값을 초기화하며, 그 이전에는 초기화되지 않습니다. 이로써 불필요한 메모리 사용을 줄이고, 객체 생성 시 초기화 비용을 아낄 수 있습니다. 이는 특히 비용이 많이 드는 객체대용량 데이터를 다룰 때 유용합니다.

예제 코드

import lombok.Getter;

public class LazyExample {
    @Getter(lazy = true)
    private final String heavyData = loadHeavyData();

    private String loadHeavyData() {
        System.out.println("Initializing heavy data...");
        return "This is some heavy data";
    }
}

위 코드에서 heavyData 필드는 @Getter(lazy=true)로 설정되어, getHeavyData() 메서드가 호출될 때 loadHeavyData() 메서드가 실행되고 값이 초기화됩니다. 호출 전까지는 heavyData 필드는 초기화되지 않기 때문에 메모리 사용량이 절약됩니다. 이를 통해 초기화 비용이 큰 데이터는 필요할 때만 생성할 수 있어 효율적입니다.

동작 예시

public class Main {
    public static void main(String[] args) {
        LazyExample example = new LazyExample();
        System.out.println("Before accessing heavyData");
        
        // 최초 호출 시 초기화됨
        System.out.println(example.getHeavyData());
        
        // 이후 호출 시 초기화되지 않음
        System.out.println(example.getHeavyData());
    }
}

위 예제에서, getHeavyData()를 호출하기 전까지는 heavyData 필드가 초기화되지 않음을 확인할 수 있습니다. 이를 통해 메모리를 절약하면서도 필요한 시점에 데이터에 접근할 수 있게 됩니다.

반응형

실무에서의 메모리 사용 최적화

지연 로딩은 메모리를 최적화하는 데 중요한 역할을 합니다. 실무에서는 대용량 데이터나 외부 API 호출, 복잡한 계산 결과가 필요한 필드에서 @Getter(lazy=true)를 사용하는 것이 좋습니다. 이 기능은 데이터베이스 또는 외부 서비스와의 연결처럼 시간이 오래 걸리는 작업을 지연시켜 애플리케이션의 성능을 개선합니다.

또한, @Getter(lazy=true)스레드 안전성을 보장하므로 멀티스레드 환경에서도 안정적으로 동작합니다. 예를 들어, 동시에 여러 스레드가 같은 데이터를 요청하는 상황에서도 동기화된 방식으로 데이터를 초기화하므로, 동기화 관련 이슈를 방지할 수 있습니다.

실무 예제

import lombok.Getter;

public class UserProfile {
    @Getter(lazy = true)
    private final String profileImage = loadProfileImage();
    @Getter(lazy = true)
    private final String largeDataset = loadLargeDataset();

    private String loadProfileImage() {
        System.out.println("Loading profile image...");
        return "Profile Image Data";
    }

    private String loadLargeDataset() {
        System.out.println("Loading large dataset...");
        return "Large Dataset Content";
    }
}

위의 UserProfile 클래스는 프로필 이미지대용량 데이터를 지연 로딩합니다. 사용자가 프로필 이미지를 요청하거나 대용량 데이터를 필요로 하는 경우에만 초기화하므로 불필요한 리소스를 절약할 수 있습니다. 이러한 최적화는 특히 메모리 제약이 있는 환경 또는 다수의 사용자가 동시 접근하는 시스템에서 유리합니다.

사용 예시

public class Main {
    public static void main(String[] args) {
        UserProfile profile = new UserProfile();
        
        // profileImage와 largeDataset이 필요할 때만 로드
        System.out.println("Before accessing profile image");
        System.out.println(profile.getProfileImage());  // 이 시점에 초기화
        
        System.out.println("Before accessing large dataset");
        System.out.println(profile.getLargeDataset());  // 이 시점에 초기화
    }
}

@Getter(lazy=true)는 메모리 절약뿐만 아니라 응답 속도를 높이고 자원 관리의 효율성을 높이는 데도 효과적입니다. 예를 들어, 웹 서버에서 사용자 프로필 페이지에 필요한 이미지를 처음부터 모두 불러오는 대신, 사용자가 특정 이미지를 클릭했을 때 이미지를 불러올 수 있습니다. 이는 웹 애플리케이션의 성능을 높이고, 사용자가 필요한 리소스에만 접근하도록 유도하는 최적화된 방법입니다.

참고사이트

반응형