Lombok의 고급 애너테이션인 @Value, @Singular, @SuperBuilder에 대해 알아보겠습니다. 이 애너테이션들은 불변 객체 생성, 리스트와 맵 지원, 상속 구조에서 빌더 패턴을 지원하는 기능을 제공하며, 코드 간소화와 유지 보수성 향상에 큰 도움을 줍니다. 각각의 애너테이션을 사용하는 방법과 실무 예제를 통해 더욱 쉽게 이해할 수 있도록 상세히 설명하겠습니다.
@Value: 불변 객체 생성
@Value 애너테이션은 불변 객체를 생성하기 위해 사용됩니다. 불변 객체는 객체 생성 이후 내부 상태가 변하지 않는 객체로, 데이터 무결성을 유지하고 스레드 안전성을 보장할 수 있어 멀티스레드 환경에서 특히 유리합니다. @Value는 @Getter, @AllArgsConstructor, @ToString, @EqualsAndHashCode와 final 필드를 자동으로 적용하여 변경 불가능한 클래스를 만들어 줍니다.
예제 코드
import lombok.Value;
@Value
public class ImmutablePerson {
String name;
int age;
}
위 예제의 ImmutablePerson 클래스는 @Value를 통해 불변 객체로 정의되었습니다. 생성된 객체는 name과 age 필드를 가질 수 있으며, 객체가 한 번 생성된 이후에는 필드 값을 변경할 수 없습니다.
사용 예시
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;
}
위 예제에서 @Singular가 members 필드에 적용되어 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는 코드의 일관성과 유지 보수성을 높이며, 특히 부모 클래스의 필드와 자식 클래스의 필드를 동시에 초기화해야 하는 상황에서 유용합니다.
참고사이트
- Lombok 공식 사이트: https://projectlombok.org
'JAVA' 카테고리의 다른 글
[JAVA] Lombok 성능 최적화와 메모리 관리 (0) | 2024.11.02 |
---|---|
[JAVA] Lombok 커스텀 애너테이션(어노테이션) 생성 및 활용 (0) | 2024.10.31 |
[JAVA] Lombok 조건부 애너테이션, 어노테이션 (0) | 2024.10.31 |
[JAVA] Lombok 로깅 처리 (@Slf4j, @Log 등) (0) | 2024.10.31 |
[JAVA] Lombok Lazy Getter(lazy=true)와 Setter (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 |