Spring

[Spring]@No/All/RequiredArgsConstructor

retto9522 2024. 9. 12. 09:47

Spring의 Lombok 라이브러리는 불필요한 코드와 작업을 줄여주는 좋은 라이브러리이지만, 무턱대고 사용할 경우 코드를 이해하는데 어려울 수 있습니다.

 

Lombok 라이브러리에는 생성자를 자동으로 생성해주는 어노테이션이 3가지 있습니다.

  • @NoArgsConstructor: Default 생성자를 생성합니다.
  • @AllArgsConstructor: 모든 필드 값을 파라미터로 받는 생성자를 생성합니다.
  • @RequiredArgsConstructor: final이나 @NonNull로 선언된 필드만을 파라미터로 받는 생성자를 생성합니다.

 

@NoArgsConstructor

@NoArgsConstructor 어노테이션을 사용하면 클래스에 명시적으로 선언된 생성자가 없더라도 인스턴스를 생성할 수 있습니다.

public class Person{
	private String name;
	private int age;
	
	public Person(){
		...
	}
}

위 코드를 @NoArgsConstructor 어노테이션을 사용하여 다음과 같이 바꿀 수 있습니다.

@NoArgsConstructor
public class Person{
	private String name;
	private int age;
}

@AllArgsConstructor

@AllArgsConstructor 어노테이션은 클래스의 모든 필드 값을 파라미터로 받는 생성자를 자동으로 생성합니다.

해당 어노테이션 사용 시 클래스의 모든 필드를 한번에 초기화할 수 있습니다.

public class Person{
	private String name,
	private int age;
	
	public Person(String name, int age){
		this.name = name;
		this.age = age;
	}
}

위 코드를 @AllArgsConstructor 어노테이션을 사용하여 다음과 같이 바꿀 수 있습니다.

@AllArgsConstructor
public class Person{
	private String name,
	private int age;
}

@RequiredArgsConstructor

@RequiredArgsConstructor 어노테이션은 final이나 @NonNull으로 선언된 필드만 파라미터로 받는 생성자를 자동 생성합니다.

해당 어노테이션을 사용하면, 클래스가 의존하는 필드를 간단하게 초기화 할 수 있습니다.

public class Person {
    private final String name;
    private final int age;
    private String address;

	public Person(final String name, final int age) {
    	this.name = name;
        this.age = age;
    }
}

위 코드를 @RequiredArgsConstructor 어노테이션을 사용하여 다음과 같이 바꿀 수 있습니다.

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

 


어노테이션의 세부 옵션

  • staticName: 정적 팩토리 메서드를 생성합니다.
  • access: 접근 제한자를 지정합니다.
  • onConstructor: 생성자의 접근 제어자를 설정합니다.(Default: public)
  • force: final 필드가 선언된 경우 컴파일 타임에 기본 값을 0, null, false로 설정합니다.

 

staticName

모든 생성자 어노테이션에 사용될 수 있습니다. 아래는 AllArgsConstructor에 옵션을 설정한 예시입니다.

@AllArgsConstructor(staticName = "of")
public class Person {
    private String name;
    private int age;
    private String address;
}

@AllArgsConstuctor에 staticName 옵션을 사용하면 다음과 같습니다.

public class Person {
    private String name;
    private int age;
    private String address;
	
    public static Person of(String name, int age, String address) {
    	new Person(name, age, address);
    }
}

 

access

access 옵션에는 다음과 같은 접근제어자가 있습니다.

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

 

force

@NoArgsConstructor 어노테이션에만 사용이 가능하고 해당 옵션을 지정할 경우 primitive type에 맞는 기본 값이 설정됩니다.

@NoArgsConstructor(force = true)
public class Person {
    private final String name;
    private final int age;
    private String address;
}

@NoArgsConstructor에 force 옵션을 사용하면 다음과 같습니다.

public class Person {
    private final String name = null;
    private final int age = 0;
    private String address;
}