[JPA] @Builder 사용시 컴파일 에러가 나는 이슈

rockstar·2023년 6월 22일
1

Issue

목록 보기
3/7

이전에도 많이 봤던 컴파일 에러지만, 생각해보니 정리를 했던 적이 없었던 것 같아서 짧게나마 정리해보려고 한다.

@Builder

@Builder는 lombok이 지원하는 애너테이션이며, 메소드 체이닝을 통해 쉽게 인스턴스를 생성할 수 있게 해준다. 내부적으로는 @AllArgConstructor를 생성해주는 효과가 있다. 생각해보면 당연한 게 모든 변수를 Builder로 접근할 수 있어야 하기 때문이지 않을까.

Entity와 함께 사용

JPA에서의 Entity는 기본 생성자가 필요하다. 그렇기 때문에 본인의 경우에는 처럼 자주 사용을 한다.

@Entity
@NoArgsConstructor
public class Memeber{
...
}

근데 항상 @AllArgsConstructor를 붙이지 않으면 에러가 났었는데, 그 이유를 명확히 알지 못한 채로 @AllArgsConstructor를 붙인 후 그냥 넘어갔던 것 같다. 그러다가 같이 개발을 하시는 분께서 Builder에 대해서 궁금해하셨고, 같이 찾다보니 알게된 사실이 있어서 공유하고자 한다.

@Builder의 내부

JPA Entity가 아닌 일반적인 클래스에서 @Builder를 사용할 때를 보자

@Builder
public class MemberDTO{
...
}

위와 같이 작성했을 때는 어떤 컴파일 에러도 나지 않는다. 그리고 Builder의 기능을 사용할 수 있게 되는 것이고. 그런데 생각해보면 의아한 게 있다. 어떻게 전체 인자를 받는 생성자를 따로 만든 것도 아닌데 Builder의 기능을 수행할 수 있었던 것일까? 아래는 Builder 애너테이션 내부를 일부 추출해서 가져온 캡처이다.

위의 내용은 이렇다. @Builder는 @AllArgsConstructor를 붙인 효과를 준다. 그러나, @XXArgsConstructor를 붙이게 된다면 @AllArgsConstructor를 붙인 것과 같은 효과를 주지 않는다.라는 내용이다.

아래는 위의 내용들을 요약해서 정리한 내용이다.

  1. @Builder를 사용하기 위해서는 전체 인자를 받는 생성자가 필요하지만, @Builder가 내부적으로 @AllArgsConstructor를 사용한 것과 같은 효과를 주기 때문에, 전체 인자를 받는 생성자를 따로 작성하지 않아도 Builder의 기능을 사용할 수 있다.
  2. 다만, @Builder와 함께 @NoArgsConstructor을 사용해버리면 @AllArgsConstructor를 사용한 것과 같은 효과를 받을 수 없게 되어 에러가 나게 된다.
  3. 그렇기 때문에, @Builder와 @NoArgsConstructor을 같이 사용하는 경우 @AllArgsConstructor을 추가해줘야 컴파일 에러가 사라지게 되는 것이다.

잘못된 정보는 지적해주시면 감사하겠습니다.

0개의 댓글