@NoArgsConstructor(access = AccessLevel.PROTECTED)

young·2023년 5월 16일
0

AllArgsConstrutor

'모든 매개변수 생성자'인 것 처럼 해당 클래스 내의 모든 변수값을 가진 생성자를 자동으로 만들어 준다.

  • 모든 field를 parameter로 받는 생성자 생성
  • 디버깅 어려움 및 버그 생성을 야기하므로 해당 어노테이션 지양
  • 생성자를 직접 만들고 생성자에 @Builder 사용하는 것 권장

RequiredArgsConstructor

  • final 또는 @NonNull에 해당하는 Field만 Parameter로 생성자 생성(null이면 NullPointerException 발생)
  • 생성자 주입 시 불필요한 코드 작성을 줄여 클린 코드 작성 시 유용
  • 디버깅 어려움 및 버그 생성을 야기하므로 해당 어노테이션 지양

NoArgsConstructor

"아무런 매개변수가 없는 기본 생성자"

  • 초기 값이 final 필드인 경우 컴파일 에러 발생

    ACCESSLEVEL를 따로 걸지 않으면, 외부에서 생성자에 쉽게 접근할 수 있기 때문에,
    -> 유지보수성을 최대화하고 접근가능성을 최소화하기 위해 사용

속성 access

  • public인 경우 = 객체 생성 시 안전성 저하 유발
  • protected인 경우 = 외부에서 무분별하게 해당 Entity의 객체 생성 방지

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

Entity나 DTO를 사용할 때 @NoArgsConstructor(access = AccessLevel.PROTECTED) 어노테이션을 많이 사용하는 편

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

즉, 의도하지 않은 엔티티를 만드는 것을 막을 수 있기 때문!

/** User.java */
@Getter @Setter
@NoArgsConstructor
public class User {
    private String name;
    private Long age;
    private String email;
}
/** Main.java */
public static void main(String[] args) {
    User user = new User();
    user.setName("testname");
    user.setEmail("test@test.com");
    
    // age가 설정되지 않았으므로 user는 완전하지 않은 객체
}

⬇️

/** User.java */
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class User {
    private String name;
    private Long age;
    private String email;
    
    public User(Long age, String email) { // 파라미터가 두 개인 경우 name은 default 설정
        this.name = "blank name";
        this.age = age;
        this.email = email;
    }
}
/** Main.java */
public static void main(String[] args) {
    User user = new User(15, "test@a.com");
    
    /// 기본 생성자가 없고 객체가 지정한 생성자를 사용해야하기 때문에
    /// 무조건 완전한 상태의 객체가 생성되게 된다.
}
profile
ฅʕ•̫͡•ʔฅ

0개의 댓글