@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 일 경우에 생성자 유무에 따라 아래와 같이 동작한다.
- 생성자가 없는 경우 : 모든 멤버변수를 파라미터로 받는 기본생성자 생성
- 생성자가 있을 경우 : 따로 생성자 생성을 하지 않는다 !
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 |