<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[RightStack Engineering]]></title><description><![CDATA[RIGHTSTACK 의 기술과 개발 문화를 알립니다.]]></description><link>https://engineering.rightstack.net</link><generator>RSS for Node</generator><lastBuildDate>Sat, 25 Apr 2026 12:16:23 GMT</lastBuildDate><atom:link href="https://engineering.rightstack.net/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Advanced Lombok]]></title><description><![CDATA[Overview
Lombok 은 반복되는 작업을 줄여주는데 많은 도움을 줍니다. 여기에 더해 고급스러운 디자인 패턴에 적용하기 위한 몇 가지 사용법을 소개합니다.
Getter, Setter 에서 Get, Set 접두사 제거하기
Getter 와 Setter 를 아래 스타일로 만들고 싶을 때 Lombok 의 설정으로 쉽게 적용할 수 있습니다.
public String name();
public void name(String name);

Class...]]></description><link>https://engineering.rightstack.net/advanced-lombok</link><guid isPermaLink="true">https://engineering.rightstack.net/advanced-lombok</guid><category><![CDATA[Java]]></category><category><![CDATA[lombok]]></category><dc:creator><![CDATA[박영일]]></dc:creator><pubDate>Sun, 10 Dec 2023 14:24:45 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1702218181393/ee4abe81-a88d-49f2-a5d7-99f38d4689c9.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-overview">Overview</h2>
<p>Lombok 은 반복되는 작업을 줄여주는데 많은 도움을 줍니다. 여기에 더해 고급스러운 디자인 패턴에 적용하기 위한 몇 가지 사용법을 소개합니다.</p>
<h2 id="heading-getter-setter-get-set">Getter, Setter 에서 Get, Set 접두사 제거하기</h2>
<p>Getter 와 Setter 를 아래 스타일로 만들고 싶을 때 Lombok 의 설정으로 쉽게 적용할 수 있습니다.</p>
<pre><code class="lang-java"><span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">name</span><span class="hljs-params">()</span></span>;
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">name</span><span class="hljs-params">(String name)</span></span>;
</code></pre>
<p>Class 에 <code>@Accessors(fluent = true)</code> 를 붙여 줍니다. Fluent 는 Method Chaining 시 사용하는 기법으로 이에 대해서는 Martin Fowler 와 Eric Evans 가 정의한 Fluent Interface 를 참고하세요. 👉 <a target="_blank" href="https://en.wikipedia.org/wiki/Fluent_interface">https://en.wikipedia.org/wiki/Fluent_interface</a></p>
<h2 id="heading-singular-method-support"><strong>@Singular Method Support</strong></h2>
<p>Collection 필드에 하나씩 값을 추가하고 싶을 때 <code>@Singlular</code> 어노테이션을 <code>@Builder</code> 어노테이션고 함께 사용합니다.</p>
<p>아래 예시는 <code>tags</code> 필드에 <code>@Singular</code> 를 적용한 것입니다.</p>
<pre><code class="lang-java"><span class="hljs-meta">@Builder</span>
<span class="hljs-meta">@Getter</span>
<span class="hljs-meta">@ToString</span>
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Article</span> </span>{
  <span class="hljs-keyword">private</span> Long id;
  <span class="hljs-keyword">private</span> String title;

  <span class="hljs-meta">@Singular</span>
  <span class="hljs-keyword">private</span> List&lt;String&gt; tags;
}
</code></pre>
<p>Lombok 은 아래와 같이 Tag 를 하나씩 추가할 수 있는 코드를 생성합니다.</p>
<pre><code class="lang-java">Article a = Article.builder()
      .id(<span class="hljs-number">1L</span>)
      .title(<span class="hljs-string">"Test Article"</span>)
      .tag(<span class="hljs-string">"TestTag1"</span>)
      .tag(<span class="hljs-string">"TestTag2"</span>)
      .build();
</code></pre>
<h2 id="heading-immutable-pojo-with-builder-design-pattern">Immutable Pojo with Builder Design Pattern</h2>
<p>Immutable 한 Pojo 를 만들고 싶을 때는 아래와 같이 <code>@Value</code> 어노테이션을 사용합니다.</p>
<pre><code class="lang-java"><span class="hljs-keyword">import</span> lombok.Builder;
<span class="hljs-keyword">import</span> lombok.Value;

<span class="hljs-meta">@Value</span>
<span class="hljs-meta">@Builder</span>
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">SimpleJsonObject</span> </span>{

    String name;

}
</code></pre>
<p><code>@Value</code> 어노테이션을 적용하면 Lombok 이 생성하는 코드에서는 아래와 같이 <code>final</code> 키워드를 해당 필드에 추가합니다.</p>
<pre><code class="lang-java"><span class="hljs-keyword">package</span> io.springcloud.krs.cdk.protocol.json;

<span class="hljs-keyword">public</span> <span class="hljs-keyword">final</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">SimpleJsonObject</span> </span>{
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">final</span> String name;

    SimpleJsonObject(String name) {
        <span class="hljs-keyword">this</span>.name = name;
    }

    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> SimpleJsonObjectBuilder <span class="hljs-title">builder</span><span class="hljs-params">()</span> </span>{
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> SimpleJsonObjectBuilder();
    }

    <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">getName</span><span class="hljs-params">()</span> </span>{
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.name;
    }

    ...
}
</code></pre>
<h2 id="heading-update-field-with-builder">Update Field with Builder</h2>
<p>Builder 패턴을 적용한 경우, Object 를 빌드한 후에 다시 특정 필드를 업데이트할 수 없습니다. 또한 만약 Immutable 한 속성을 가졌다면 이미 적용한 필드를 고칠 방법이 필요할 수도 있습니다. 이 경우 아래와 같이 <code>@Builder(toBuilder = true)</code> 방식으로 어노테이션을 설정합니다.</p>
<pre><code class="lang-java"><span class="hljs-keyword">import</span> lombok.Builder;
<span class="hljs-keyword">import</span> lombok.Value;

<span class="hljs-meta">@Value</span>
<span class="hljs-meta">@Builder(toBuilder = true)</span>
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">SampleUser</span> </span>{

    String name;

    String email;
}
</code></pre>
<p>위와 같이 설정하면 아래와 같이 생성된 Object 를 다시 Builder 로 전환 후에 값을 설정할 수 있습니다.</p>
<pre><code class="lang-java">SampleUser sampleUser = SampleUser.builder()
    .name(<span class="hljs-string">"chiang"</span>)
    .email(<span class="hljs-string">"pero@acme.com"</span>)
    .build();

SampleUser copiedUser
    = sampleUser.toBuilder().email(<span class="hljs-string">"chiang@acme.com"</span>).build();
</code></pre>
<p>Lombok 이 생성하는 코드의 일부는 아래와 같습니다. Immutable 한 클래스의 값을 변경하기 위해서 Lombok 의 Builder 는 Mutable 한 상태를 유지하고 마지막으로 Build 한 Object 만 Immutable 하게 만듭니다.</p>
<pre><code class="lang-java"><span class="hljs-keyword">public</span> <span class="hljs-keyword">final</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">SampleUser</span> </span>{
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">final</span> String name;
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">final</span> String email;

    SampleUser(<span class="hljs-keyword">final</span> String name, <span class="hljs-keyword">final</span> String email) {
        <span class="hljs-keyword">this</span>.name = name;
        <span class="hljs-keyword">this</span>.email = email;
    }

    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> SampleUserBuilder <span class="hljs-title">builder</span><span class="hljs-params">()</span> </span>{
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> SampleUserBuilder();
    }

    <span class="hljs-function"><span class="hljs-keyword">public</span> SampleUserBuilder <span class="hljs-title">toBuilder</span><span class="hljs-params">()</span> </span>{
        <span class="hljs-keyword">return</span> (<span class="hljs-keyword">new</span> SampleUserBuilder()).name(<span class="hljs-keyword">this</span>.name).email(<span class="hljs-keyword">this</span>.email);
    }
    ...
}
</code></pre>
<p><code>toBuilder</code> 가 없다면 Immutable 속성을 만족하기 어려워 더 복잡한 코드를 만들어야 할 수 있고 혹은 생성한 Object 를 업데이트하기 위해 Builder 에서 <code>setXxx()</code> 와 같은 Setter 를 만들어 코드가 일관성이 없어질 수도 있습니다.</p>
<h2 id="heading-summary">Summary</h2>
<p>고급 Lombok 사용법을 통해서 조금 더 다양한 상황이나 패턴을 지원할 수 있습니다. <a target="_blank" href="https://projectlombok.org/features/">https://projectlombok.org/features/</a> 에서 조금 더 상세한 예시를 확인할 수 있습니다.</p>
]]></content:encoded></item></channel></rss>