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/ 에서 조금 더 상세한 예시를 확인할 수 있습니다.