저번에 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와 충돌 되는 것을 막자.
-> 모든 필드를 채우는 생성자가 필요하다면 그때 작성하는 것이 낫다.
✅결과
오류 안뜸!
'spring 스프링' 카테고리의 다른 글
The method builder() is undefined for the type 오류 (해결1) (0) | 2025.04.04 |
---|---|
왜 setter를 지양해야 하는가 (0) | 2025.04.02 |
SpringAI 로 OpenAI 의 ChatGPT 만들기 _ 02 (스프링 코드) (0) | 2024.07.29 |
SpringAI 로 OpenAI 의 ChatGPT 만들기 _ 01 (기초세팅) (0) | 2024.07.25 |
이클립스에 스프링 설치하고 스프링부트 프로젝트 생성 (0) | 2024.07.19 |