Lombok의 @RequiredArgsConstructor에 대해서 설명을 드리려고 합니다.
Lombok의 @RequiredArgsConstructor를 사용하여 Java 코드를 단순화할 수 있습니다. 또한 추가 옵션에 대해서 알아보고, 예제코드를 확인하는 시간이 될 것 입다.
사용법
Java class 위에 @EqualsAndHashCode 주석을 붙여서 사용할 수 있습니다.
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
public class Person {
private final String name;
private final int age;
}
위와 같이 코드를 사용 시에는 하기와 같이 코드가 생성됩니다.
public class Person {
private final String name;
private final int age;
public Person(final String name, final int age) {
this.name = name;
this.age = age;
}
}
저번에 @AllArgsConstructor와 다른 점을 못 찾으시겠다고요? 중요한 부분은 final의 차이점에 있습니다. 만약, 위의 Person class에서 final을 제거하고 다시 한번 보여드리도록 하겠습니다. 아래와 같이 코드를 사용하였을 시에 어떻게 되는지 한번 확인해 보도록 하겠습니다.
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
public class Person {
private String name;
private int age;
}
그럼 다음과 같이 소스가 표기됩니다. 보이시나요? 아까와는 다른 소스가 보이게 됩니다. 그럼 왜 그럴까요? 그 부분은 Java의 final에 대해서 한번 공부를 해 보시기 바랍니다. (또는 추후에 한번 정리를 해 보도록 하겠습니다.
public class Person {
private String name;
private int age;
public Person() {
}
}
@RequiredArgsConstructor의 추가옵션
- staticName : 기본값은 빈 문자열입니다. 이 값을 어노테이션에 제공하면, 클래스에 대한 정적 팩토리 메서드가 생성됩니다. staticName 값으로 주어진 이름을 가진 메서드를 이용하여 객체를 생성할 수 있습니다.
아래 예제코드를 보시면 static으로 of메서드가 생성된 부분을 보실 수 있습니다.
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor(staticName = "of")
public class Person {
private final String name;
private final int age;
}
//------
public class Person {
private final String name;
private final int age;
private Person(final String name, final int age) {
this.name = name;
this.age = age;
}
public static Person of(final String name, final int age) {
return new Person(name, age);
}
}
- onConstructor : 생성자를 생성하는 데 사용할 어노테이션을 나열합니다. 생성자에 대한 어노테이션을 적용할 때 사용됩니다.
이 부분을 테스트하기 위해서는 build.gradle 파일에 다음 내용을 추가하셔야 합니다.
implementation group: 'javax.inject', name: 'javax.inject', version: '1'
그다음에 예세코드를 보여드리도록 하겠습니다. 하지만, 현재는 하단의 방법보다는 생성자를 만들어 사용하고 있습니다. 다만, Lombok에서 다양한 기능을 제공하고 있으며 이런 기능도 제공하고 있다는 부분으로 보시면 좋을 것 같습니다.
// [SampleController.Java.파일]
import lombok.RequiredArgsConstructor;
import javax.inject.Inject;
@RequiredArgsConstructor(onConstructor = @__(@Inject))
public class SampleController {
private final SampleService sampleService;
}
// [SampleService.Java.파일]
package com.example.lombok;
import org.springframework.stereotype.Service;
@Service
public class SampleService {
}
// [class 파일 확인]
import javax.inject.Inject;
public class SampleController {
private final SampleService sampleService;
@Inject
public SampleController(final SampleService sampleService) {
this.sampleService = sampleService;
}
}
- access : 기본값은 AccessLevel.PUBLIC입니다. 이 값은 생성자의 접근 제어자를 설정해 줍니다. 롬복이 생성하는 생성자가 패키지 내 사용 또는 비공개일 수 있습니다. (AccessLevel에는 PUBLIC, MODULE, PROTECTED, PACKAGE, PRIVATE, NONE 중에 하나를 선택할 수 있습니다.) 하단 예제에서는 AccessLevel.PROTECTED만 보여드리오니 나머지는 직접 테스트를 해 보시기 바랍니다.
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor(access = AccessLevel.PROTECTED)
public class Person {
private final String name;
private final int age;
}
//-------------
public class Person {
private final String name;
private final int age;
protected Person(final String name, final int age) {
this.name = name;
this.age = age;
}
}
@RequiredArgsConstructor 장점과 단점
롬복을 사용하므로 인하여 장점과 단점은 이전 포스트의 나온 부분과 동일하다고 생각합니다. 이에 이전 포스트 링크를 확인해 보시기 바랍니다. 더불어 이전 링크를 통하여 @EqualsAndHashCode에 대해서도 다시 복습해 보는 시간이 되었으면 좋겠습니다.