본문 바로가기

Spring boot

@Builder, @AllArgsConstructor, @NoArgsConstructor의 관계

보통 Entity를 생성할 때,

@Builder, @AllArgsConstructor, @NoArgsConstructor 를 모두 사용한다. 

이유는 무엇일까?

@AllArgsConstructor

@AllArgsConstructor는 전체 필드가 들어갈 수 있도록 전체 생성자를 생성해주는 어노테이션이다.

 

@NoArgsConstructor

@NoArgsConstructor는 기본 생성자를 생성해주는 어노테이션이다. 위 사진과 같이 (access = AccessLevel.PROTECTED)를 설정해주면 필드값이 (단 하나라도) 없이 생성해줄 경우, 객체 생성을 막아주어 무분별한 또는 불완전한 객체 생성을 막을 수 있다. 

 

@Builder

@Builder는 @NoArgsConstructor에 유연함을 넣어 필요한 필드에만 값을 넣어줄 수 있도록 해준다. 위 사진과 같이 id와 createdAt, updatedAt은 자동으로 들어가는 값이니 우리는 title에만 값을 넣어주면 된다. 이 때 Builder를 사용해줄 수 있다. 

 

 

 

@Builder 와 @NoArgsConstructor만 사용하면 error가 발생한다. 이유가 무엇일까?

@Builder의 내부 설명을 살펴보자면

@Builder 내부 설명

@Builder는 다른 생성자가 존재하지 않을 때, 전체 생성자를 자동으로 생성해준다. 

따라서 이미 기본 생성자나 다른 생성자가 존재한다면, 기존의 생성자를 이용하게 되는데 Builder로 만들어준 값들이 들어갈 생성자가 없다면 에러가 발생하는 것. 



ex ) Builder로 만들어준 값들이 들어갈 생성자가 없다면 에러가 발생하는 것

@NoArgConstructor를 선언해 기본 생성자만 있는 상태에서, 아래 사진과 같이 Builder로 만들어주면 Builder는 기본 생성자를 이용한다. 하지만 Builder에서 만들어준 title 값이 들어갈 생성자가 없기 때문에 에러가 발생한다. 따라서 @AllArgConstructor를 추가로 선언해주어야 한다.

 

 

 

 

참고 )

https://velog.io/@maketheworldwise/Builder-AllNoArgsConstructor-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EC%95%8C%EA%B3%A0-%EC%82%AC%EC%9A%A9%ED%95%98%EC%9E%90

https://resilient-923.tistory.com/418