JAVA

[JAVA] Lombok 애너테이션, 어노테이션 (@Value, @Singular, @SuperBuilder)

인생아 2024. 10. 31. 11:05
반응형

Lombok의 고급 애너테이션인 @Value, @Singular, @SuperBuilder에 대해 알아보겠습니다. 이 애너테이션들은 불변 객체 생성, 리스트와 맵 지원, 상속 구조에서 빌더 패턴을 지원하는 기능을 제공하며, 코드 간소화유지 보수성 향상에 큰 도움을 줍니다. 각각의 애너테이션을 사용하는 방법과 실무 예제를 통해 더욱 쉽게 이해할 수 있도록 상세히 설명하겠습니다.

@Value: 불변 객체 생성

@Value 애너테이션은 불변 객체를 생성하기 위해 사용됩니다. 불변 객체는 객체 생성 이후 내부 상태가 변하지 않는 객체로, 데이터 무결성을 유지하고 스레드 안전성을 보장할 수 있어 멀티스레드 환경에서 특히 유리합니다. @Value@Getter, @AllArgsConstructor, @ToString, @EqualsAndHashCodefinal 필드를 자동으로 적용하여 변경 불가능한 클래스를 만들어 줍니다.

예제 코드

import lombok.Value;

@Value
public class ImmutablePerson {
    String name;
    int age;
}

위 예제의 ImmutablePerson 클래스는 @Value를 통해 불변 객체로 정의되었습니다. 생성된 객체는 nameage 필드를 가질 수 있으며, 객체가 한 번 생성된 이후에는 필드 값을 변경할 수 없습니다.

사용 예시

public class Main {
    public static void main(String[] args) {
        ImmutablePerson person = new ImmutablePerson("John Doe", 30);
        System.out.println(person);
        
        // person.setName("Jane Doe"); // 컴파일 오류 발생
    }
}

이 예제에서 ImmutablePerson 인스턴스는 생성 후 setName 메서드를 제공하지 않아 값을 변경할 수 없습니다. 불변 객체를 통해 안전한 데이터 관리가 가능하며, 특히 상태 변화가 없어야 하는 도메인 객체에 유용하게 활용할 수 있습니다.

반응형

@Singular: 빌더 패턴에서 리스트와 맵 지원

@Singular 애너테이션은 빌더 패턴에서 리스트나 맵 필드를 사용할 때 유용합니다. Lombok의 @Builder와 함께 사용하여 리스트나 맵 필드를 편리하게 추가할 수 있으며, 빌더 패턴을 통해 생성한 객체에서 여러 개의 값을 쉽게 추가할 수 있도록 도와줍니다.

예제 코드

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

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

위 예제에서 @Singularmembers 필드에 적용되어 Team 클래스 빌더에서 members 리스트에 요소를 하나씩 추가할 수 있습니다. @Singular는 복수형 필드 이름을 단수형으로 변환하여 빌더에서의 사용을 더 자연스럽게 합니다.

사용 예시

public class Main {
    public static void main(String[] args) {
        Team team = Team.builder()
                        .teamName("Development Team")
                        .member("Alice")
                        .member("Bob")
                        .member("Charlie")
                        .build();
        
        System.out.println(team);
    }
}

위 코드에서는 Team 객체의 members 필드에 Alice, Bob, Charlie를 추가하여 빌더 패턴으로 쉽게 리스트를 구성합니다. 실무에서는 팀 구성, 사용자 목록, 설정 데이터 등 다양한 리스트 데이터를 쉽게 관리할 수 있는 장점이 있습니다.

@SuperBuilder: 상속 구조에서 빌더 패턴 지원

@SuperBuilder는 Lombok의 상속 구조에서 빌더 패턴을 지원하기 위해 사용됩니다. @Builder와 달리 @SuperBuilder는 부모 클래스의 필드까지 빌더로 설정할 수 있어, 상속 구조가 있는 클래스에서 부모와 자식 클래스의 필드를 모두 초기화하는 빌더를 만들 수 있습니다. 이를 통해 상속 관계에서 코드 재사용성유연한 객체 생성이 가능합니다.

예제 코드

import lombok.Getter;
import lombok.experimental.SuperBuilder;

@Getter
@SuperBuilder
class Vehicle {
    private final String brand;
    private final String model;
}

@Getter
@SuperBuilder
class Car extends Vehicle {
    private final int doors;
    private final boolean electric;
}

위 코드에서 Vehicle 클래스는 @SuperBuilder를 사용하여 빌더 패턴을 지원하며, 이를 상속한 Car 클래스 역시 @SuperBuilder를 통해 빌더 패턴을 사용할 수 있습니다. 이를 통해 Vehicle 클래스의 필드와 Car 클래스의 필드를 모두 포함한 빌더를 쉽게 생성할 수 있습니다.

사용 예시

public class Main {
    public static void main(String[] args) {
        Car car = Car.builder()
                     .brand("Tesla")
                     .model("Model S")
                     .doors(4)
                     .electric(true)
                     .build();
        
        System.out.println(car);
    }
}

위 예제에서 Car 객체는 부모 클래스인 Vehicle의 필드와 Car 클래스 고유의 필드를 빌더로 초기화할 수 있습니다. 상속 관계에서 빌더 패턴을 사용할 때 @SuperBuilder는 코드의 일관성유지 보수성을 높이며, 특히 부모 클래스의 필드와 자식 클래스의 필드를 동시에 초기화해야 하는 상황에서 유용합니다.

참고사이트

반응형