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 설명 projectlombok.org/features/Builder
빌터패턴 장점 zorba91.tistory.com/298
'Spring' 카테고리의 다른 글
[SpringBoot] h2-console 웹 접근안될 때 해결 방법 (0) | 2021.03.08 |
---|---|
[Spring/JPA] @DynamicUpdate, Validation 동시 적용 시 Validation 에러 해결 (0) | 2020.10.11 |
[Spring-Error] org.apache.maven.plugin.war.WarMojo 에러 해결 (mac) (0) | 2018.04.15 |
[Spring/Error] 500 에러 Communications link failure 해결 방법 (0) | 2018.04.12 |
[Spring/Error] DB에서 list 불러올 때 나온 400에러 해결 방법 (0) | 2018.04.12 |