본문 바로가기
개발

[Lombok] @RequiredArgsConstructor

by angeloper 2023. 7. 18.
반응형

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에 대해서도 다시 복습해 보는 시간이 되었으면 좋겠습니다.

반응형