Lombok @Accessors를 활용한 Getter와 Setter 메서드 커스터마이징

Lombok 라이브러리의 @Accessors는 클래스의 Getter와 Setter 메서드 생성 방식을 세밀하게 제어할 수 있게 해주는 어노테이션입니다. 주로 @Getter, @Setter와 결합하여 보일러플레이트 코드를 줄이고 도메인 객체의 API 가독성을 높이는 데 활용됩니다.

주요 설정 매개변수

@Accessors는 다음과 같은 매개변수를 통해 메서드의 명명 규칙과 동작 방식을 지정할 수 있습니다.

매개변수 설명
chain 메서드 체이닝(Method Chaining)을 지원할지 여부입니다. Setter가 객체 자신의 참조를 반환하도록 만들며, 기본값은 false입니다.
fluent get/set 접두사를 제거한 플루언트(Fluent) 스타일 메서드명을 사용할지 여부입니다. 기본값은 false입니다.
prefix 필드명에서 제외할 접두사를 지정합니다. 지정된 접두사는 Getter/Setter 메서드명 생성 시 자동으로 생략됩니다.

활용 시나리오 및 코드 예제

1. 기본 동작

별도의 옵션을 지정하지 않으면 Lombok의 기본 Getter/Setter 생성 규칙을 따릅니다.

import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

@Getter
@Setter
@Accessors
public class Product {
    private String skuCode;
    private int inventoryLevel;
}

컴파일 시 생성되는 코드:

public class Product {
    private String skuCode;
    private int inventoryLevel;

    public String getSkuCode() {
        return skuCode;
    }

    public void setSkuCode(String skuCode) {
        this.skuCode = skuCode;
    }

    public int getInventoryLevel() {
        return inventoryLevel;
    }

    public void setInventoryLevel(int inventoryLevel) {
        this.inventoryLevel = inventoryLevel;
    }
}

2. 메서드 체이닝 활성화 (chain = true)

Setter 메서드가 void 대신 현재 객체(this)를 반환하도록 설정하여, 단일 표현식에서 여러 필드를 연속으로 초기화할 수 있게 합니다.

@Getter
@Setter
@Accessors(chain = true)
public class Product {
    private String skuCode;
    private int inventoryLevel;
}

컴파일 시 생성되는 코드:

public class Product {
    private String skuCode;
    private int inventoryLevel;

    public String getSkuCode() {
        return skuCode;
    }

    public Product setSkuCode(String skuCode) {
        this.skuCode = skuCode;
        return this;
    }

    public int getInventoryLevel() {
        return inventoryLevel;
    }

    public Product setInventoryLevel(int inventoryLevel) {
        this.inventoryLevel = inventoryLevel;
        return this;
    }
}

사용 예시:

Product item = new Product()
    .setSkuCode("ELEC-001")
    .setInventoryLevel(150);

3. 플루언트(Fluent) 스타일 적용 (fluent = true)

메서드명에서 getset 접두사를 제거하여 필드명과 동일한 메서드명을 사용합니다. fluent = true로 설정하면 기본적으로 chain = true 속성도 함께 적용됩니다.

@Getter
@Setter
@Accessors(fluent = true)
public class Product {
    private String skuCode;
    private int inventoryLevel;
}

컴파일 시 생성되는 코드:

public class Product {
    private String skuCode;
    private int inventoryLevel;

    public String skuCode() {
        return skuCode;
    }

    public Product skuCode(String skuCode) {
        this.skuCode = skuCode;
        return this;
    }

    public int inventoryLevel() {
        return inventoryLevel;
    }

    public Product inventoryLevel(int inventoryLevel) {
        this.inventoryLevel = inventoryLevel;
        return this;
    }
}

사용 예시:

Product item = new Product()
    .skuCode("ELEC-001")
    .inventoryLevel(150);

4. 필드 접두사 무시 (prefix)

특정 네이밍 컨벤션에 따라 필드명에 접두사가 포함된 경우, 이를 Getter/Setter 메서드명에서 자동으로 제거합니다.

@Getter
@Setter
@Accessors(prefix = "item_")
public class Product {
    private String item_skuCode;
    private int item_inventoryLevel;
}

컴파일 시 생성되는 코드:

public class Product {
    private String item_skuCode;
    private int item_inventoryLevel;

    public String getSkuCode() {
        return item_skuCode;
    }

    public void setSkuCode(String skuCode) {
        this.item_skuCode = skuCode;
    }

    public int getInventoryLevel() {
        return item_inventoryLevel;
    }

    public void setInventoryLevel(int inventoryLevel) {
        this.item_inventoryLevel = inventoryLevel;
    }
}

5. 매개변수 조합

여러 매개변수를 동시에 조합하여 복잡한 요구사항을 충족하는 메서드를 생성할 수 있습니다.

@Getter
@Setter
@Accessors(chain = true, fluent = true, prefix = "item_")
public class Product {
    private String item_skuCode;
    private int item_inventoryLevel;
}

컴파일 시 생성되는 코드:

public class Product {
    private String item_skuCode;
    private int item_inventoryLevel;

    public String skuCode() {
        return item_skuCode;
    }

    public Product skuCode(String skuCode) {
        this.item_skuCode = skuCode;
        return this;
    }

    public int inventoryLevel() {
        return item_inventoryLevel;
    }

    public Product inventoryLevel(int inventoryLevel) {
        this.item_inventoryLevel = inventoryLevel;
        return this;
    }
}

적용 시 고려사항

  • @Data와의 호환성: @Data 어노테이션은 내부적으로 @Getter@Setter를 포함하고 있습니다. 따라서 클래스 레벨에서 @Data@Accessors를 함께 선언하는 것만으로도 동일한 커스터마이징 효과를 얻을 수 있습니다.
  • 개발 환경 설정: IntelliJ IDEA나 Eclipse와 같은 IDE에서 Lombok 플러그인이 활성화되어 있지 않으면, 자동완성 기능이 동작하지 않거나 컴파일 오류로 인식될 수 있으므로 환경을 반드시 확인해야 합니다.
  • 가독성 및 컨벤션: fluent 옵션을 사용하면 메서드명에서 get/set이 사라져 일부 개발자에게는 직관적이지 않게 다가올 수 있습니다. 팀의 코딩 컨벤션과 프로젝트의 특성에 맞게 절충하여 적용하는 것이 좋습니다.

태그: Lombok java Accessors MethodChaining FluentAPI

7월 19일 23:56에 게시됨