@All/NoArgsConstructor
이런것들은 스프링으로 개발을 하다보면 자주 사용 하는 어노테이션인데, 정확히 무엇인지 알고 사용한다는 느낌이 들지 않았다.
lombok은 불필요한 코드나 작업을 간소화 시켜주지만 잘못 사용하면 더 헷갈릴 수 있기에 명확히 알고 사용하고자 글을 작성하게 되었다.
생성자를 자동 생성해주는 어노테이션은 아래 세가지가 있다.
@NoArgsConstructor
: 파라미터가 없는 디폴트 생성자를 생성@AllArgsConstructor
: 모든 필드 값을 파라미터로 받는 생성자를 생성@RequiredArgsConstructor
: final이나 @NotNull으로 선언된 필드만을 파라미터로 받는 생성자를 생성예를 들어 User라는 엔티티가 있고 , 우리가 이 생성자를 만드는 경우라고 가정을 해보자.
public class User {
public String name;
public int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
}
위와 같이 생성자를 직접 작성해준다. 하지만 위의 3개의 어노테이션은 이 과정을 손쉽게 만들어준다.
@NoArgsConstructor
어노테이션은 파라미터가 없는 디폴트 생성자를 자동으로 생성한다. 이 어노테이션을 사용하면, 클래스에 명시적으로 선언된 생성자가 없더라도 인스턴스를 생성할 수 있다.
이 경우 초기값 세팅이 필요한 fianl 변수가 있을 경우 컴파일 에러가 발생할 수 있다.
@NoArgsConstructor(force=true)
를 사용하면 모든 final field는 null,0 등 기본값으로 초기화 된다. 하지만 @NotNull
같은 제약이 있다면 force=true 옵션을 주어도 들어가지 않기에 개발자가 나중에 따로 할당해야 한다.
주로 @Data
나 어노테이션을 생성하는 생성자 등과 함꼐 사용한다.
@NoArgsConstructor
public class User {
public String name;
public int age;
/*
아래 생성자를 자동으로 생성
public User() {
}
*/
}
@RequiredArgsConstructor
어노테이션은 final 변수 또는 @NotNull
으로 선언된 필드만을 파라미터로 받는 생성자를 자동으로 생성한다. 클래스가 의존하는 필드를 간단히 초기화할 수 있다.
특히 @NotNull
이 달려있는 field의 경우, 생성되는 생성자 내부에 명시적인 Null 체크 로직이 생성된다. 그래서 하나라도 Null값이 포함되게 된다면 NullPointerException
이 발생하게 된다.
생성자의 Parameter 순서는 클래스 내부에서 선언된 field의 순서로 매칭된다.
@RequiredArgsConstructor
public class User {
public static String name;
public int age;
/*
NotNull 또는 static
아래 생성자를 자동으로 생성
public User(String name) {
this.name = name;
}
*/
}
@AllArgsConstructor
어노테이션은 클래스의 모든 필드 값을 파라미터로 받는 생성자를 자동으로 생성해준다. 클래스 의 모든 필드를 한 번에 초기화가 가능하다.
@RequiredArgsConstructor
와 마찬가지로 파라미터의 순서는 클래스 내부에서 선언된 필드의 순서대로 생성되며, @NotNull
이 붙은 필드의 경우도 Null check 로직이 들어간다.
@AllArgsConstructor
public class User {
public String name;
public int age;
/*
아래 생성자를 자동으로 생성
public User(String name, int age) {
this.name = name;
this.age = age;
}
*/
}
모든 어노테이션에 사용될 수 있다. 아래처럼 생성자에 of가 붙게되고 바로 User타입을 반환한다.
@AllArgsConstructor(staticName = "of")
public class User {
public String name;
public int age;
/*
아래 생성자를 자동으로 생성
public static User of(String name, int age) {
return new User(name, age);
}
*/
}
이 옵션에는 아래와 같은 접근 제어자가 존재한다.
@NoArgsConstructor(access = AccessLevel.PROTECTED)
와 같이 사용한다.
위에서 언급하였듯이 @NoArgsConstructor
어노테이션에서만 사용이 가능하고 해당 옵션 지정시 primitive type에 맞는 기본 값이 설정된다.
@AllArgsConstructor
이나 @RequiredArgsConstructor
는 파라미터의 순서를 잘못 넣었을 경우 큰 장애를 초래할 위험이 있다.
따라서 필요한 경우에는 직접 만든 생성자에 @Builder
어노테이션을 붙이는 것을 권장한다. 빌더 패턴은 순서가 중요하지 않고 가독성 측면에서 더 낫다고 생각한다. 또한 이름으로 값을 설정하기에 리팩토리에 유연한 대응이 가능하다.
참고자료