@Builder With Class / Constructor | JeongKeepsCalm

@Builder With Class / Constructor

클래스 단위의 @Builder

  • 특징
    • 클래스 레벨에 @Builder를 선언하면 모든 필드를 포함하는 빌더를 생성한다.
    • 별도의 생성자 정의가 필요하지 않는다. (Lombok이 기본 생성자를 자동으로 생성하기 때문이다.)
    • 모든 필드가 선택적으로 초기화될 수 있다.
  • 장점
    • 객체 생성 시 필요한 필드를 유연하게 선택할 수 있다.
  • 단점
    • 필수 필드와 선택적 필드 구분이 명확하지 않아 실수로 일부 필드를 설정하지 않을 가능성이 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import lombok.Builder;
import lombok.ToString;

@Builder
@ToString
public class User {
    private String name;
    private String email;
    private int age;
}

// 객체 생성 예시
User user = User.builder()
    .name("John Doe")
    .email("john.doe@example.com")
    .age(30)
    .build();

모든 필드가 선택적으로 포함



생성자 단위의 @Builder

  • 특징
    • 특정 생성자에 @Builder를 선언하면 해당 생성자에 필요한 필드만 포함된 빌더를 생성한다.
    • 필수 필드와 선택적 필드를 명확히 구분할 수 있다.
    • 별도의 생성자 정의가 필요하다. 예를 들어, @AllArgsConstructor, @NoArgsConstructor 또는 사용자 정의 생성자를 선언해야 한다.
  • 장점
    • 객체 생성 시 필수 필드가 누락되지 않도록 강제할 수 있다.
    • 유연한 객체 생성 방식을 제공한다.
  • 단점
    • 개발자가 명시적으로 생성자를 정의해야 하므로 관리가 약간 복잡할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import lombok.Builder;
import lombok.RequiredArgsConstructor;
import lombok.ToString;

@ToString
public class User {
    private String name;
    private String email;
    private int age;

    @Builder
    public User(String name, String email) {
        this.name = name;
        this.email = email;
        // age는 선택적 필드로 남김
    }
}

// 객체 생성 예시
User user = User.builder()
    .name("John Doe")
    .email("john.doe@example.com")
    .build();

name과 email은 필수, age는 선택적 필드로 설정 가능