스프링에서 @Builder 어노테이션을 사용할때 생성자 어노테이션없이 사용하면 아래와 같은 에러가 발생한다.
java:17: error: constructor User in class User cannot be applied to given types;
@Builder
^
required: no arguments
found: Long,String,String,String,List<Post>
reason: actual and formal argument lists differ in length
일단 에러의 내용은 NoArgsConstructor 어노테이션이 없어서 빌더를 사용 할수 없다는 건데, 이유는 Lombok과 JPA의 관계 때문인것 같다.
JPA specification에 따르면 모든 entity클래스는 no-argument constructor가 있어야 하고 @Builder 를 @NoArgsConstructor와 사용하려면 빌더 패턴에서는 파라미터를 1개씩 가지는 각각의 생성자가 필요하기 때문에, 당연히 @AllArgusConstructor도 필요하게 된다.
결국 Spirng Data JPA 사용시 @Builder를 @Entity가 붙은 클래스에 사용하려면 @Builder, @NoArgsConstructor, @AllArgusConstructor 모두 세트로 붙여주어야 한다는 것이다.
https://prog.world/lombok-jpa-what-can-go-wrong/
https://yeon-kr.tistory.com/176
https://blog.leocat.kr/notes/2018/09/02/lombok-using-builder-and-noargsconstructor-together