[Lombok] @Builder와 @NoArgsConstructor 함께 사용하기

by 스뎅(thDeng) on

TL;DR: @Builder@NoArgsConstructor를 함께 사용하려면, @AllArgsConstructor도 함께 사용하거나 모든 필드를 가지는 생성자를 직접 만들어 줘야 한다. @Builder를 사용할 때 @NoArgsConstructor뿐만 아니라 손수 만든 다른 생성자가 있다면, 그 때도 모든 필드를 가지는 생성자가 필요하다.

문제

아래처럼 @Builder@NoArgsConstructor를 함께 사용하면, 컴파일 시 에러가 발생한다.

// @Getter @Setter @EqualsAndHashCode 등등
@Builder
@NoArgsConstructor
public class MyName {
    private String first;
    private String last;
}
Error:(7, 1) java: constructor MyName in class kr.leocat.test.MyName cannot be applied to given types;
  required: no arguments
  found: java.lang.String,java.lang.String
  reason: actual and formal argument lists differ in length

그리고 @NoArgsConstructor가 아니더라도, 아래처럼 일부 필드만을 가지는 생성자를 가지는 경우에도 컴파일이 되지 않는다.

// @Getter @Setter @EqualsAndHashCode 등등
@Builder
public class MyName {
    private String first;
    private String last;

    public MyName() { ... }
}

  .. 또는 ..

// @Getter @Setter @EqualsAndHashCode 등등
@Builder
public class MyName {
    private String first;
    private String last;

    public MyName(String last) { ... }
}

해결방법

@AllArgsConstructor도 함께 달아주거나 모든 필드를 가지는 생성자를 손수 만들어 주면 된다.

// @Getter @Setter 등등
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MyName {
    private String first;
    private String last;
}

  .. 또는 ..

// @Getter @Setter 등등
@Builder
@NoArgsConstructor
public class MyName {
    private String first;
    private String last;

    MyName(String first, String last) { ... }
}

참고

별도로 명시하지 않을 경우, 이 블로그의 포스트는 다음 라이선스에 따라 사용할 수 있습니다: Creative Commons License CC Attribution-NonCommercial-ShareAlike 4.0 International License