Skip to main content

Command Palette

Search for a command to run...

Advanced Lombok

Updated
3 min read
Advanced Lombok

Overview

Lombok 은 반복되는 작업을 줄여주는데 많은 도움을 줍니다. 여기에 더해 고급스러운 디자인 패턴에 적용하기 위한 몇 가지 사용법을 소개합니다.

Getter, Setter 에서 Get, Set 접두사 제거하기

Getter 와 Setter 를 아래 스타일로 만들고 싶을 때 Lombok 의 설정으로 쉽게 적용할 수 있습니다.

public String name();
public void name(String name);

Class 에 @Accessors(fluent = true) 를 붙여 줍니다. Fluent 는 Method Chaining 시 사용하는 기법으로 이에 대해서는 Martin Fowler 와 Eric Evans 가 정의한 Fluent Interface 를 참고하세요. 👉 https://en.wikipedia.org/wiki/Fluent_interface

@Singular Method Support

Collection 필드에 하나씩 값을 추가하고 싶을 때 @Singlular 어노테이션을 @Builder 어노테이션고 함께 사용합니다.

아래 예시는 tags 필드에 @Singular 를 적용한 것입니다.

@Builder
@Getter
@ToString
public class Article {
  private Long id;
  private String title;

  @Singular
  private List<String> tags;
}

Lombok 은 아래와 같이 Tag 를 하나씩 추가할 수 있는 코드를 생성합니다.

Article a = Article.builder()
      .id(1L)
      .title("Test Article")
      .tag("TestTag1")
      .tag("TestTag2")
      .build();

Immutable Pojo with Builder Design Pattern

Immutable 한 Pojo 를 만들고 싶을 때는 아래와 같이 @Value 어노테이션을 사용합니다.

import lombok.Builder;
import lombok.Value;

@Value
@Builder
public class SimpleJsonObject {

    String name;

}

@Value 어노테이션을 적용하면 Lombok 이 생성하는 코드에서는 아래와 같이 final 키워드를 해당 필드에 추가합니다.

package io.springcloud.krs.cdk.protocol.json;

public final class SimpleJsonObject {
    private final String name;

    SimpleJsonObject(String name) {
        this.name = name;
    }

    public static SimpleJsonObjectBuilder builder() {
        return new SimpleJsonObjectBuilder();
    }

    public String getName() {
        return this.name;
    }

    ...
}

Update Field with Builder

Builder 패턴을 적용한 경우, Object 를 빌드한 후에 다시 특정 필드를 업데이트할 수 없습니다. 또한 만약 Immutable 한 속성을 가졌다면 이미 적용한 필드를 고칠 방법이 필요할 수도 있습니다. 이 경우 아래와 같이 @Builder(toBuilder = true) 방식으로 어노테이션을 설정합니다.

import lombok.Builder;
import lombok.Value;

@Value
@Builder(toBuilder = true)
public class SampleUser {

    String name;

    String email;
}

위와 같이 설정하면 아래와 같이 생성된 Object 를 다시 Builder 로 전환 후에 값을 설정할 수 있습니다.

SampleUser sampleUser = SampleUser.builder()
    .name("chiang")
    .email("pero@acme.com")
    .build();

SampleUser copiedUser
    = sampleUser.toBuilder().email("chiang@acme.com").build();

Lombok 이 생성하는 코드의 일부는 아래와 같습니다. Immutable 한 클래스의 값을 변경하기 위해서 Lombok 의 Builder 는 Mutable 한 상태를 유지하고 마지막으로 Build 한 Object 만 Immutable 하게 만듭니다.

public final class SampleUser {
    private final String name;
    private final String email;

    SampleUser(final String name, final String email) {
        this.name = name;
        this.email = email;
    }

    public static SampleUserBuilder builder() {
        return new SampleUserBuilder();
    }

    public SampleUserBuilder toBuilder() {
        return (new SampleUserBuilder()).name(this.name).email(this.email);
    }
    ...
}

toBuilder 가 없다면 Immutable 속성을 만족하기 어려워 더 복잡한 코드를 만들어야 할 수 있고 혹은 생성한 Object 를 업데이트하기 위해 Builder 에서 setXxx() 와 같은 Setter 를 만들어 코드가 일관성이 없어질 수도 있습니다.

Summary

고급 Lombok 사용법을 통해서 조금 더 다양한 상황이나 패턴을 지원할 수 있습니다. https://projectlombok.org/features/ 에서 조금 더 상세한 예시를 확인할 수 있습니다.