본문 바로가기

Spring

[Lombok] @Builder 사용 시 @NoArgsConstructor 관련 에러 해결

728x90
반응형

Spring Boot로 개발 시 Lombok의 @Builder를 사용할 때 자주 마주치는 에러가 있다.

바로.. 아래와 같은 에러 !

에러

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

원인

원인은 @Builder를 사용 시 @NoArgsConstructor 어노테이션을 함께 사용해서 에러가 발생한다.

모든 멤버변수를 받는 생성자가 없는 것이 이유이다.

일부 멤버변수만 갖는 생성자 함수만 존재할 경우에도 같은 에러가 나타난다.

(예시의 Board 엔티티 클래스에서도 두 어노테이션을 함께 사용했더니 에러가 발생함 ㅠ_ㅠ)

 

해결

@AllArgsConstructor 를 어노테이션에 추가해주거나, 전체 멤버변수를 갖는 생성자를 만든다.

 

 

Q. 왜 전체 멤버변수를 갖는 생성자가 필요한걸까?

일단, 의미 상 빌더 패턴을 생각해 보았을 때, 아무것도 없는 생성자는 필요가 없다.

빌더는 필드의 초기화 작업을 도와주는 역할이기 때문에.

 

Lombok 공식사이트 - @Builder 설명 中

Finally, applying @Builder to a class is as if you added @AllArgsConstructor(access = AccessLevel.PACKAGE) to the class and applied the @Builder annotation to this all-args-constructor. This only works if you haven't written any explicit constructors yourself.

 

또한, 위 내용으로 보았을 때

@Builder 사용 시, 생성한 생성자가 없다면 @AllArgsConstructor(access = AccessLevel.PACKAGE) 가 암묵적으로 적용된다고 한다. 반대로 생성한 생성자가 있다면 @AllArgsConstructor 적용이 반드시 필요한게 아닐까?.. (이건 추측)

 

공식사이트 내 'Vanilla Java' 부분의 실제 코드를 보면 (아래 코드)

builder()에서 BuilderExampleBuilder() 생성자를 반환하고,

BuilderExampleBuilder() 내부에서는 모든 매개변수에 대해 셋터용 메서드를 만들고 있다. (name, age)

이에 @Builder 내에서는 모든 파라미터를 갖는 생성자를 필요로 한다.

  public static BuilderExampleBuilder builder() {
    return new BuilderExampleBuilder();
  }
  
  public static class BuilderExampleBuilder {
    private long created;
    private boolean created$set;
    private String name;
    private int age;
    private java.util.ArrayList<String> occupations;
    
    BuilderExampleBuilder() {
    }
    
    public BuilderExampleBuilder created(long created) {
      this.created = created;
      this.created$set = true;
      return this;
    }
    ...
    
       public BuilderExampleBuilder name(String name) {
      this.name = name;
      return this;
    }
    
    public BuilderExampleBuilder age(int age) {
      this.age = age;
      return this;
    }
    ...

 

 

참고

빌더 에러 설명 참고 blog.leocat.kr/notes/2018/09/02/lombok-using-builder-and-noargsconstructor-together

 

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

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

blog.leocat.kr

Lombok 공식사이트 - @Builder 설명 projectlombok.org/features/Builder

 

@Builder

 

projectlombok.org

빌터패턴 장점 zorba91.tistory.com/298

 

[Spring] Lombok을 이용해 Builder 패턴을 만들어보자.

Builder 패턴이란? Effective Java 규칙 2 - 조슈아 블로크 생성자에 인자가 많을 때는 빌더 패턴을 고려하라 빌더 패턴(Builder pattern) 이란 복합 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 ��

zorba91.tistory.com

 

728x90
반응형