Backend/Java

[Java] @SuperBuilder란?

누구세연 2024. 10. 17. 23:45

상속 구조에서 @Builder를 어떻게 사용할 수 있을지 고민하던 중, 더 유연한 방식으로 객체 생성 패턴을 지원하는 @SuperBuilder 어노테이션을 알게 되었습니다.

이 글에서는 @SuperBuilder의 개념, 사용 예시, 그리고 이를 사용함으로써 얻을 수 있는 장점에 대해 알아보도록 하겠습니다.🧐

 

@SuperBuilder란?

@SuperBuilder는 Lombok 라이브러리에서 제공하는 어노테이션으로 상속 구조에서 빌더 패턴을 간편하게 사용할 수 있도록 도와줍니다. 기본적으로 Lombok의 @Builder는 상속 구조를 지원하지 않기 때문에 상속된 클래스들에서 객체를 생성할 때는 여러 문제점이 발생할 수 있습니다. 이 문제를 해결하기 위해 등장한 것이 @SuperBuilder입니다.

@SuperBuilder는 부모 클래스와 자식 클래스 모두에서 빌더 패턴을 사용할 수 있게 해 줍니다. 이로 인해 상속 관계에 있는 클래스들 간의 빌더 체인도 쉽게 관리할 수 있으며, 코드의 가독성과 유지보수성을 높여줍니다.

 

@SuperBuilder 사용 예시

부모 클래스: Animal

import lombok.experimental.SuperBuilder;

@SuperBuilder
public class Animal {
    private String name;
    private int age;

    @Override
    public String toString() {
        return "Animal{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

 

자식 클래스: Dog

import lombok.experimental.SuperBuilder;

@SuperBuilder
public class Dog extends Animal {
    private String breed;  // Dog만의 고유 속성 (견종)

    @Override
    public String toString() {
        return "Dog{" +
                "breed='" + breed + '\'' +
                ", " + super.toString() +
                '}';
    }
}

 

사용 예시

public class Main {
    public static void main(String[] args) {
        // Dog 객체 생성
        Dog dog = Dog.builder()
                .name("Buddy")
                .age(3)
                .breed("Golden Retriever")
                .build();

        System.out.println(dog);
    }
}

 

 

Animal 클래스는 공통 속성인 name과 age를 가지고 있습니다.

그리고 Dog 클래스는 Animal을 상속받아 breed(견종)를 추가로 가지고 있습니다.

이처럼 @SuperBuilder를 사용하면 상위 클래스와 하위 클래스의 필드를 함께 설정하고 객체를 생성할 수 있습니다.

 

 

 

 

@SuperBuilder의 장점

  1. 상속 관계에서 빌더 패턴의 사용
    @SuperBuilder는 상속된 클래스에서 빌더 패턴을 안전하게 사용할 수 있게 해 줍니다.
    부모 클래스의 필드도 빌더에서 쉽게 설정할 수 있으며, 자식 클래스의 필드 역시 문제없이 처리됩니다.
  2. 코드 중복 감소
    @SuperBuilder를 사용하면 부모 클래스와 자식 클래스 모두에서 빌더 메서드를 재정의하지 않고 사용할 수 있어 코드 중복을 줄이고 관리하기 쉬워집니다.
  3. 명확한 계층 구조 유지
    상속 구조에서 객체를 생성할 때 계층 구조가 명확히 유지되며 부모 클래스의 필드도 손쉽게 초기화할 수 있습니다.

 

사용 시 주의사항

  • @SuperBuilder는 상속 구조에서만 유용하며 단일 클래스에서는 기존의 @Builder를 사용하는 것이 적합합니다.
  • @SuperBuilder를 사용하는 클래스는 반드시 public 생성자 또는 protected 생성자를 가져야 합니다.

 

💡 @SuperBuilder는 상속 관계에서 객체 생성과 초기화를 효율적으로 처리하는데 매우 유용합니다.
이를 통해 코드의 구조를 더 깔끔하게 만들 수 있습니다.