Lombok에서 제공하는 새로운 실험적인 기능들을 알아보자

겔로그·2023년 9월 8일
1

Lombok은 Spring 내에서 @Getter, @Setter와 같은 코드 라인수를 줄여주는 개발자 친화적인 어노테이션의 집합 라이브러리입니다. 지금까지 Lombok과 Spring annotation을 사용해왔지만, 구체적으로 어떤 기능들이 있는지 궁금해 Lombok 홈페이지에 들어갔고 그곳에서 처음보는 다양한 어노테이션들을 알게 되었습니다.

오늘은 Lombok에서 제공하는 새로운 실험적인 기능들 중 한 번쯤은 써볼법한 기능들에 대해 알아보는 시간을 가져보겠습니다.

@Accessors

getter와 setter를 좀 더 유연하게 사용할 수 있도록 도움을 주는 메서드입니다. v0.11.0에 처음 도입되었으며 lombok.config 옵션으로 lombok.accessors.capitalization [ basic| beanspec] 기능을 v1.18.24 버전부터 추가로 제공합니다.

accessors에는 다음과 같은 어노테이션이 존재합니다.

    1. chain: 하나의 줄로 이어서 사용할 수 있는 기능(메서드 등)
    1. fluent: 기본적으로 제공하는 접두사 사용 여부
    1. prefix: 해당 어노테이션의 접두사에 어떤것을 붙일지 설정하는 부분입니다. (필드 명칭 접두어 기준으로 정의 가능)

코드 작성

@Accessors(prefix = {"s", "bd"})
@Getter
@Setter
public class TestClass {
    private String sTest1;
    private int bdTest2;
}

컴파일 후

public class TestClass {
    private String sTest1;
    private int bdTest2;

    public TestClass() {
    }

    public String getTest1() {
        return this.sTest1;
    }

    public int getTest2() {
        return this.bdTest2;
    }

    public void setTest1(final String sTest1) {
        this.sTest1 = sTest1;
    }

    public void setTest2(final int bdTest2) {
        this.bdTest2 = bdTest2;
    }
}

@FieldNameConstants

@FieldNameConstants는 각 필드를 이너 타입으의 상수 값으로 변경해주는 기능입니다. v1.16.22.에 실험적 기능으로 처음 도입되었으며 v1.18.4.버전에서 재디자인 돼 제공되는 기능입니다.

해당 기능을 통해 정의한 변수명을 상수로 생성할 수 있습니다.

코드 작성

import lombok.experimental.FieldNameConstants;
import lombok.AccessLevel;

@FieldNameConstants
public class FieldNameConstantsExample {
  private final String iAmAField;
  private final int andSoAmI;
  @FieldNameConstants.Exclude private final int asAmI;
}

컴파일 후

public class FieldNameConstantsExample {
  private final String iAmAField;
  private final int andSoAmI;
  private final int asAmI;
  
  public static final class Fields {
    public static final String iAmAField = "iAmAField";
    public static final String andSoAmI = "andSoAmI";
  }
}

해당 어노테이션을 사용할시 얻을 수 있는 가장 큰 예시로는 mapstruct 변환간 작업이 존재할 것 같습니다.

@Mappings({
    @Mapping(target = Entity.Fields.propertyWithoutCounterpart, ignore = true),
    @Mapping(target = Entity.Fields.entityProperty, source = "dtoProperty")
})

다음과 같이 사용하면 어느 객체에 어떤 변수값을 매핑하는지 좀 더 쉽게 알 수 있습니다.


음.. 추가로 확인해보니 문제가 하나 존재합니다.
https://github.com/mapstruct/mapstruct/issues/1816

lombok과 mapstruct간의 생성 시점의 차이로 오류가 발생할 수 있다는 이슈인데 만약 두 개를 함께 사용하고 싶을 경우, 약간의 고민이 추가로 필요하지 않을까 싶은 생각이 드네요 ㅎㅎ..

사용 가능한 추가설정

  • lombok.fieldNameConstants.flagUsage = [warning | error] (default: not set)
    • @FieldDefaults 구성간 경고 또는 에러를 표시합니다.
  • lombok.fieldNameConstants.innerTypeName = a string (default: 'Fields')
    • 생성간 내부 field Type 명칭을 설정할 수 있습니다. (기본값 Fields)
  • lombok.fieldNameConstants.uppercase = [true | false] (default: false)
    • uppercase 설정시 생성간 대문자로 변환하여 생성합니다.

@StandardException

v1.18.21에서 새로 생긴 어노테이션입니다. Exception에서 주로 생성되는 기본 생성자들에 대한 코드를 어노테이션으로 제공합니다.

기본생성자, Throwable, message, (Throwable, message) 로 구성되어 있습니다.

코드 작성


import lombok.experimental.StandardException;

@StandardException
public class ExampleException extends Exception {
}

컴파일 후


public class ExampleException extends Exception {
    public ExampleException() {
        this(null, null);
    }

    public ExampleException(String message) {
        this(message, null);
    }

    public ExampleException(Throwable cause) {
        this(cause != null ? cause.getMessage() : null, cause);
    }

    public ExampleException(String message, Throwable cause) {
        super(message);
        if (cause != null) super.initCause(cause);
    }
}

결론

오늘은 lombok에서 제공하는 새로운 기능들 중 몇가지를 알아보았습니다. 또 다른 실험적 기능들을 알고 싶으신 분들은 lombok을 통해 확인해보시면 좋을 것 같습니다.

제가 봤을때 소개드린 세 가지 기능은 실무에서도 적용해볼만한 어노테이션이라 판단되어 한 번 사용해보고자 합니다 ㅎㅎ.

사용한 뒤에 어떻게 사용했는지도 나중에 글로 작성해보는 시간을 가져보겠습니다.

읽어주셔서 감사합니다~

profile
Gelog 나쁜 것만 드려요~

0개의 댓글