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)는 메모리 절약뿐만 아니라 응답 속도를 높이고 자원 관리의 효율성을 높이는 데도 효과적입니다. 예를 들어, 웹 서버에서 사용자 프로필 페이지에 필요한 이미지를 처음부터 모두 불러오는 대신, 사용자가 특정 이미지를 클릭했을 때 이미지를 불러올 수 있습니다. 이는 웹 애플리케이션의 성능을 높이고, 사용자가 필요한 리소스에만 접근하도록 유도하는 최적화된 방법입니다.
참고사이트
- Lombok 공식 사이트: https://projectlombok.org
'JAVA' 카테고리의 다른 글
[JAVA] Lombok 커스텀 애너테이션(어노테이션) 생성 및 활용 (0) | 2024.10.31 |
---|---|
[JAVA] Lombok 조건부 애너테이션, 어노테이션 (0) | 2024.10.31 |
[JAVA] Lombok 로깅 처리 (@Slf4j, @Log 등) (0) | 2024.10.31 |
[JAVA] Lombok 애너테이션, 어노테이션 (@Value, @Singular, @SuperBuilder) (0) | 2024.10.31 |
[JAVA] Lombok @Data 애너테이션(어노테이션 Annotation) (1) | 2024.10.30 |
[JAVA] Lombok Builder 패턴과 활용 (1) | 2024.10.30 |
[JAVA] Lombok 어노테이션, 애너테이션(Annotation)의 기본 사용법 (0) | 2024.10.30 |
[JAVA] Lombok 환경 설정 (1) | 2024.10.30 |