JAVA

[JAVA] Lombok 성능 최적화와 메모리 관리

인생아 2024. 11. 2. 09:27
반응형

Lombok을 사용하면 코드의 간결함생산성을 크게 높일 수 있지만, Lombok의 성능적 영향메모리 관리에 대해 이해하는 것도 중요합니다. Lombok은 컴파일 시점에서 코드에 접근하여 반복되는 코드 작성을 자동화해주지만, 때로는 무분별한 사용이 메모리 사용에 영향을 줄 수 있습니다. 여기서는 Lombok의 성능 영향 분석과 메모리 최적화 방법, 그리고 객체 생성을 효율화하는 방법을 설명합니다.

Lombok의 성능적 영향 분석

Lombok은 컴파일 타임에 코드를 생성하므로 런타임 성능에 미치는 직접적인 영향은 거의 없습니다. 그러나 특정 기능 사용 시 메모리를 더 많이 사용할 수 있는데, 특히 무거운 객체가 자주 생성되는 경우가 이에 해당합니다. Lombok을 사용하면서 성능과 메모리에 미치는 영향을 최소화하려면 지연 로딩(Lazy Loading)을 적극적으로 활용하는 것이 좋습니다.

import lombok.Getter;

public class ExpensiveObjectExample {
    @Getter(lazy = true)
    private final ExpensiveObject expensiveObject = new ExpensiveObject();

    // ExpensiveObject는 필요할 때만 생성되어 메모리 사용을 최적화합니다.
}

@Getter(lazy=true)를 사용하면 객체가 호출될 때까지 초기화되지 않으므로 메모리 사용량을 절약할 수 있습니다. 이는 특히 메모리를 많이 소비하는 객체에 유용합니다.

메모리 사용량 최적화 팁과 주의사항

Lombok을 사용할 때 메모리 사용량을 줄이기 위한 몇 가지 팁이 있습니다.

1. @Builder 사용 시 주의사항: Lombok의 @Builder를 사용할 때, 특히 클래스가 많은 필드를 포함할 경우 메모리 사용량이 증가할 수 있습니다. 빌더는 각 필드를 개별 메서드로 초기화할 수 있게 하므로 메모리를 효율적으로 사용하려면 필요 없는 필드 초기화를 피해야 합니다.

2. @Value와 불변 객체 사용: 불변 객체는 한 번 생성된 객체의 상태를 바꾸지 않기 때문에 메모리 누수를 방지할 수 있습니다. Lombok의 @Value 애너테이션을 사용하면 자동으로 불변 객체를 만들 수 있으며, 이로 인해 GC(Garbage Collection) 최적화가 가능합니다.@Value 애너테이션을 사용하면 모든 필드가 final로 설정되며, 메모리 효율성이 높아집니다.

import lombok.Value;

@Value
public class ImmutableExample {
    private final String name;
    private final int age;
}

@Value 애너테이션을 사용하면 모든 필드가 final로 설정되며, 메모리 효율성이 높아집니다.

3. 필요하지 않은 @ToString, @EqualsAndHashCode 피하기: Lombok은 @ToString이나 @EqualsAndHashCode 애너테이션을 통해 자동으로 메서드를 생성해주지만, 이를 모든 객체에 적용하면 메모리를 불필요하게 사용할 수 있습니다. 특히 컬렉션 객체에 적용할 경우 깊은 참조로 인해 성능 저하를 일으킬 수 있습니다.

import lombok.EqualsAndHashCode;

@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class OptimizedExample {
    @EqualsAndHashCode.Include
    private int id;
    private String name;
}

onlyExplicitlyIncluded 옵션을 사용해 특정 필드만 해시코드와 Equals에 포함되도록 설정하면 성능을 더욱 효율적으로 관리할 수 있습니다.

Lombok을 사용한 객체 생성의 효율화 방법

1. 빌더 패턴과 @Builder.Default의 활용: Lombok의 @Builder는 객체 생성 시 유연성을 높여줍니다. 그러나 @Builder.Default를 통해 필드의 기본값을 설정하지 않으면 필드에 null이 들어가 예외가 발생할 수 있습니다.

import lombok.Builder;
import lombok.ToString;

@Builder
@ToString
public class Product {
    private final String name;
    @Builder.Default
    private final double price = 10.0;
}

이렇게 하면 객체를 생성할 때 기본값이 자동으로 설정되므로 생성자 호출로 인한 메모리 오버헤드를 줄일 수 있습니다.

2. @Singular를 활용한 리스트 초기화: 컬렉션 타입 필드에 대해 @Singular를 사용하면 빌더 패턴 내에서 컬렉션을 유연하게 다룰 수 있습니다. 이는 복잡한 객체 구성 시 유용하게 활용됩니다.

import lombok.Builder;
import lombok.Singular;
import java.util.List;

@Builder
public class Team {
    private String teamName;
    @Singular
    private List<String> members;
}

// 빌더 생성 예시
Team team = Team.builder()
                .teamName("Developers")
                .member("Alice")
                .member("Bob")
                .build();

@Singular를 통해 여러 요소를 하나의 리스트에 추가할 수 있어 코드의 간결성을 높이고 메모리 관리를 용이하게 합니다.

3. 불필요한 @Getter와 @Setter 제거: Lombok의 @Getter@Setter는 편리하지만, 모든 필드에 이를 무분별하게 사용하면 메모리와 성능에 영향을 줄 수 있습니다. 특히 외부 접근이 필요 없는 필드에 대해서는 private 또는 protected 접근제어자로 필드를 관리하여 불필요한 코드 생성을 피하는 것이 좋습니다.

참고 사이트

반응형