본문 바로가기

Spring

[Lombok] @Builder와 @NoArgsConstructor 동시 사용시 주의사항

@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) { ... }

 

 

참고

https://stackoverflow.com/questions/34241718/lombok-builder-and-jpa-default-constructor/35602246#35602246

https://blog.leocat.kr/notes/2018/09/02/lombok-using-builder-and-noargsconstructor-together

@NoArgsConstructor, @AllArgsConstructor - lombok

https://projectlombok.org/features/constructor