spring 스프링

The method builder() is undefined for the type 오류 (해결2)

해니01_15 2025. 4. 5. 10:30

저번에 builder() 를 쓰는데 The method builder() is undefined for the type  오류가 발생 했었다. 처음에는 롬복의 문제라고 생각해서 수동으로 설치 하였는데 더 찾다보니까 발견 한 사실이 있다. 

 

✅ 문제

Entity 클래스에 @Builder 와 @NoArgsConstructor @AllArgsConstructor 를 함께 사용 할 수 없다는 것이다. 

 

✅ 왜? 

[@NoArgsConstructor]

@NoArgsConstructor 는 매개변수가 없는 기본 생성자를 자동으로 생성하는 역할을 한다. 여기서 문제는 @NoArgsConstructor가 무분별하게 객체를 생성 할 수도 있다는 점이다. 이를 방지하고 '의미 있는 객체 생성'을 위해서 사용하는 것이 @Builder이다. 하지만 @Builder는 @NoArgsConstructor 이 의미하는 것과 충돌 하게 된다. 그렇다고 @NoArgsConstructor를 사용하지 않을 수는 없다. 왜냐하면 JPA에서는 기본 생성자가 필요 하기 때문이다. 따라서 @NoArgsConstructor(access = AccessLevel.PROTECTED)를 사용하여 외부에서 직접 객체를 생성하지 못하도록 보호 하는 것이 좋다. 

 

[@AllArgsConstructor]

무분별한 객체 생성을 막기 위해 @Builder 를 사용했다. @Builder 는 내부적으로 빌더 전용 생성자를 만들게 되는데, 자동으로 생성되는 값은 빌더를 사용 할때는 넣지 않아도 된다. 하지만  AllArgsConstructor를 같이 쓰게 되면 @Builder 가 자동으로 생성하는 빌더 전용 생성자와 충돌이 발생 할 수 있다. 즉 컴파일러가 두개로 인식하고 혼란스러워 할 수도 있다. 

 

✅ 효율적인 해결 

  • @Builder를 생성자에 붙여서 빌더 전용 생성자를 이용하게 하고 
  • @AllArgsConstructor를 제거하여 @Builder와 충돌 되는 것을 막자.
    -> 모든 필드를 채우는 생성자가 필요하다면 그때 작성하는 것이 낫다. 

 

✅결과

오류 안뜸!