Lombok에서 제공하는 Builder 어노테이션 - hou27/spring-boot-jwt-example GitHub Wiki

@Builder

@Builder는 생성자, 메서드 그리고 클래스에서 사용할 수 있다.
클래스에서 사용될 경우, 기본적으로 전체 멤버를 대상으로 private 생성자를 만들어 준다.
단, 어떠한 생성자도 선언되지 않았을 경우에 그러하다.

JPA를 사용할 경우 클래스에 반드시 기본 생성자가 필요하다.
그래서 @NoArgsConstructor를 사용하게 되는데, 이 경우 @Builder를 사용할 수 없게 된다.

때문에 생성자를 직접 선언하고 @Builder를 사용하던가
@NoArgsConstructor@AllArgsConstructor를 모두 클래스에 달아주면 된다.

@Builder.Default

@Entity
@Getter @Setter
@NoArgsConstructor
@ToString
@Builder
public class Users extends CoreEntity {
  ...
  @Enumerated(EnumType.STRING)
  @Column(nullable = false)
  @Builder.Default
  private UserRole role = UserRole.ROLE_CLIENT;


  public Users(String email, String password, String name, UserRole role) {
    this.email = email;
    this.password = password;
    this.name = name;
    this.role = role;
  }

  ...
}

위 예시에서 사용된 @Builder.Default는 Builder 사용 시에
기본값을 지정해줄 수 있도록 해준다.

Users.builder()
          .email(this.getEmail())
          .password(this.getPassword())
          .name(this.getName())
          .role(this.getRole())
          .build();

위와 같이 사용된 경우 지정된 role의 값이 적용되고,

Users.builder()
          .email(this.getEmail())
          .password(this.getPassword())
          .name(this.getName())
          .build();

위와 같이 builder 사용 중 role을 따로 지정해주지 않는 경우엔
기본값이 적용되는 것이다.