간단용어

@NoArgsConstructor(AccessLevel.PROTECTED) 와 @Builder

WOOKTAE 2021. 3. 11. 23:27

cobbybb.tistory.com/14

 

@NoargsConstructor(AccessLevel.PROTECTED) 와 @Builder

@NoargsConstructor(AccessLevel.PROTECTED) 와 @Builder를 함께 사용할때 주의할 점에 대해서 서술합니다. "왜" 안되는지와 "왜" 이렇게 해결 할 수 있는지에 대해 집중하여 서술합니다. 1. 왜 NoargsConstructor..

cobbybb.tistory.com

 

@NoArgsConstructor  

파라미터가 없는 생성자를 생성해주는 어노테이션.

 

주의점

 

  • 필드들이 FINAL 로 생성되어 있는 경우에는 필드를 초기화 할 수 없기 때문에 생성자를 만들 수 없고 에러가 발생하게 된다. 이때는 @NoArgsConstructor(force = true ) 옵션을 이용해서 FINAL 필드를 0, false, null 등으로 초기화를 강제로 시켜서 생성자를 만들 수 있다.

  • @NonNull 같이 필드에 제약조건이 설정되어 있는 경우, 생성자내 null-check 로직이 생성되지 않습니다. 후에 초기화를 진행하기 전까지 null-check 로직이 발생하지 않는 점을 염두하고 코드를 개발해야 한다.

왜 @NoArgsConstructor(AccessLevel.PROTECTED) 를 사용하는가 ?

Entity 나 DTO 를 사용할때 @NoArgsConstructor(AccessLevel.PROTECTED) 를 많이 사용하는 편이다.

기본 생성자의 접근 제어를 PROCTECTED 로 설정해놓게 되면 무분별한 객체 생성에 대해 한번 더 체크할 수 있는 수단이 되기 때문이다.

 

 

@NoArgsConstructor(AccessLevel.PROTECTED) 와 @Builder 를 함께 사용하면 좀 더 간단하지 않을까 ?

 

보통 @Builder 를 사용하게 되면 조금 더 자유롭게 객체를 생성할 수 있게 된다.

하지만 두 어노테이션을 동시에 사용하면 Compile 오류 발생 !!!

 

@Builder 는 Class(Type)이 Target 일 경우에 생성자 유무에 따라 아래와 같이 동작한다.

  • 생성자가 없는 경우 : 모든 멤버변수를 파라미터로 받는 기본생성자 생성
  • 생성자가 있을 경우 : 따로 생성자 생성을 하지 않는다 !

출처 : https://cobbybb.tistory.com/14

User에는 기본 protected 생성자가 이미 존재해서 따로 생성자를 만들지 않았지만 build() 를 보면 모든 파라미터를 받는 생성자로 객체로 Build 하려하는 과정에서 알맞는 생성자를 찾을 수 없게 되었습니다.

 

@NoArgsConstructor(AccessLevel.PROTECTED) 와 @Builder 를 함께 사용할 수 없을까 ?

@NoArgsConstructor(AccessLevel.PROTECTED) 와 @Builder 는 의미있는 객체를 생성하기 위한 좋은 방법이자 제약조건이다.

 

해결방법

 

@AllArgsConstructor

모든 멤버변수를 받는 생성자가 없는것이 이유이기 때문에 모든 멤버변수를 받는 생성자를 만들어주면 됩니다.

 

생성자에 설정하는 @Builder

 

생성자별로 설정되는 멤버변수 내용을 정의하고 생성자에 @Builder 를 설정하게 되면 해당 생성자를 사용하는 Builder 가 생성되어 의미있는 객체만 생성할 수 있게 됩니다.

'간단용어' 카테고리의 다른 글

CI/CD( 지속적 통합 / 지속적 제공 )  (0) 2021.03.17
SimpleDateFormat , Calendar  (0) 2021.03.14
Lombok  (0) 2021.03.11
String, String Builder, String Buffer  (0) 2021.03.07
Java 8 , Spring Framework 5.0  (0) 2021.03.04