본문 바로가기
Spring

[Spring] @NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor

by diaryDev 2024. 9. 20.
728x90

@NoArgsConstructor

파라미터가 없는 기본(디폴트) 생성자를 생성

@NoArgsConstructor
public class Member {
    private String name;
    private int age;

//    public Member() {
//    }
}

 

항상 초기화가 필요한 final이 붙은 필드가 있으면 다음과 같이 IDE에서 알려주거나 compile error 발생

 

 

@AllArgsConstructor

모든 필드 값을 파라미터로 받는 생성자를 생성

 

@AllArgsConstructor
public class Member {
    private String name;
    private int age;

//    public Member(String name, int age) {
//        this.name = name;
//        this.age = age;
//    }
}

 

생성자의 Parameter의 순서는 클래스 내부에 선언된 field 순서대로 매칭된다.

 

@RequiredArgsConstructor

final이나 @NonNull으로 선언된 필드만을 파라미터로 받는 생성자를 생성

 

@RequiredArgsConstructor
public class Member {
    private final String name;
    private final int age;
    private String address;

//    public Member(String name, int age) {
//        this.name = name;
//        this.age = age;
//    }
}

 

생성자의 Parameter의 순서는 클래스 내부에 선언된 field 순서대로 매칭된다.

 

staticName

모든 생성자 어노테이션에 사용 가능

 

다음과 같이 staticName 옵션을 사용하면 Member.of()로 생성자를 호출할 수 있다.

@AllArgsConstructor(staticName = "of")
public class Member {
    private String name;
    private int count;
    private int age;

//    public static Member of(String name, int count, int age) {
//        return new Member(name, count, age);
//    }
}

 

Member.of("test", 3, 20);

 

access

 

• PUBLIC: 기본값이며, 모든 클래스에서 생성자에 접근 가능
• PROTECTED: 같은 패키지의 클래스와 상속받은 클래스에서 생성자에 접근 가능
• PACKAGE: 같은 패키지의 클래스에서 생성자에 접근 가능
• PRIVATE: 해당 클래스 내부에서만 생성자에 접근 가능

NONE과 MODULE 접근 제어자가 있지만, 일반적으로 사용하지 않는다.

 

force

@NoArgsConstructor 에서만 사용이 가능하다.

@NoArgsConstructor(force = true) 옵션을 주면, 모든 final 필드는 0 / false / null 로 초기화된다.

final이 아닌 @NonNull에 경우force = true 옵션을 주어도 생성자에 들어가지 않아 개발자가 할당 해주어야 한다.

 

주의 사항

@AllArgsConstructor, @RequiredArgsConstructor 를 사용할 때 버그 발생에 주의해야 한다.

다음과 같은 객체가 있을 때, @AllArgsConstructor는 name, count, age 순으로 생성자 파라미터를 생성한다.

@AllArgsConstructor
public class Member {
    private String name;
    private int count;
    private int age;
}

 

Member member = new Member("name",3, 20);

 

 그런데 count와 age 순서를 바꾸게 된다면 어떻게 될까?

@AllArgsConstructor
public class Member {
    private String name;
    private int age;
    private int count;
}

 

IDE와 lombok도 변화를 알라차리지 못하며 동일한 type 이라 더욱 버그를 잡기 어렵다.

즉, 필드의 순서가 변경되는 경우 치명적일 수 있다.

 

그래서 @AllArgsConstructor, @RequiredArgsConstructor 의 사용를 금지하는 것이 좋다는 주장도 있다.

 

아니면 다음과 같이 @Builder를 사용하는 것도 하나의 방법이다.

public class Member {
    private String name;
    private int count;
    private int age;
    
    @Builder
    public Member(String name, int age, int count) {
        this.name = name;
        this.age = age;
        this.count = count;
    }
}

 

Member member = Member.builder().name("name").age(20).count(3).build();

 

 


 

 

참고

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

https://siahn95.tistory.com/170

728x90

'Spring' 카테고리의 다른 글

[JPA] @Column  (0) 2024.12.02
[Spring] @PathVariable  (0) 2024.09.23
[Spring] @RequestMapping  (0) 2024.09.18
[Spring] @Controller, @RestController  (0) 2024.09.16
[Spring] @Transactional 안 되는 경우  (0) 2024.09.13