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)
메서드명에서 get과 set 접두사를 제거하여 필드명과 동일한 메서드명을 사용합니다. 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이 사라져 일부 개발자에게는 직관적이지 않게 다가올 수 있습니다. 팀의 코딩 컨벤션과 프로젝트의 특성에 맞게 절충하여 적용하는 것이 좋습니다.