사진찍는 개발자 블로그

💻 개발/Java

Lombok - getter/setter의 prefix 관련 설정

개발자영준 2020. 8. 23. 11:19

Lombok(https://projectlombok.org/)의 @Getter, @Setter 어노테이션을 사용하면 getter, setter 메서드를 자동으로 생성 해주기 때문에 코드 작성량을 많이 줄여주어 실무에서 많이 사용된다. 

@Getter
@Setter
public class Member {
    private String name;
    private int age;
    private boolean active;
}
public class LombokTest {
    public static void main(String[] args) {
        Member member = new Member();
        // 생성된 setter
        member.setName("jun");
        member.setAge(30);
        member.setActive(true);

        // 생성된 getter 메서드로 프로퍼티 조회
        String name = member.getName();
        int age = member.getAge();
        boolean active = member.isActive();
    }
}

위의 코드 처럼 클래스 혹은 멤버 변수에 @Getter, @Setter 어노테이션을 붙혀주면 getXXX(), setXXX() 처럼 prefix가 get, set인 메서드를 자동으로 생성해준다. 단, primitive boolean 멤버 변수의 경우는 get이 아닌 is를 prefix로 사용하여 메서드가 생성되기 때문에 위의 코드처럼 getActive()가 아닌 isActive()로 멤버 변수값을 조회할 수 있다. (Wrapper 타입인 Boolean은 다른 타입과 마찬가지로 get 메서드가 생성됨)

그런데 boolean 타입에 대해 isXXX() 형식으로 메서드가 생성되는게 적절하지 않을때가 있다. 예를 들어 특정 회원의 은행 계좌 소유 여부를 표현하기 위해 hasBankAccount 멤버를 추가한다고 가정 해보자.

@Getter
@Setter
public class Member {
    private String name;
    private int age;
    private boolean active;
    // 은행 계좌 소유 여부
    private boolean hasBankAccount;
}
public class LombokTest {
    public static void main(String[] args) {
        Member member = new Member();
        
        member.setHasBankAccount(true);

        boolean hasBankAccount = member.isHasBankAccount(); // ??
    }
}

위의 코드에서 볼 수 있듯이 boolean 필드이기 때문에 is prefix가 붙어서 isHasBankAccount() 라는 다소 어색한 네이밍의 메서드가 생성된다. hasBankAccount() 메서드 처럼 그냥 prefix가 붙지 않는다면 읽기가 훨씬 좋을 것 같은데 그냥 이렇게 써야하는 걸까? 다행이도 롬복은 prefix를 붙히지 않고 메서드를 생성할 수 있는 방법을 제공한다.

@Accessors 어노테이션

롬복의 lombok.experimental 패키지에 있는 @Accessors 어노테이션을 사용하면 get, set 같은 기본 prefix의 사용 여부를 설정해줄 수 있다. 아래의 코드 처럼 @Accessors 어노테이션의 fluent 값을 true로 설정해주면 get이나 set 같은 prefix가 붙지 않은 getter, setter 메서드를 생성해준다.

@Getter
@Setter
public class Member {
    private String name;
    private int age;
    private boolean active;
    @Accessors(fluent = true)
    private boolean hasBankAccount;
}
public class LombokTest {
    public static void main(String[] args) {
        Member member = new Member();

        member.hasBankAccount(true);

        boolean hasBankAccount = member.hasBankAccount();
    }
}

위의 코드처럼  getter 메서드가 get prefix 없이 hasBankAccount() 로 생성이 되기 때문에 훨씬 자연스럽고 읽기 좋은 코딩을 할 수 있게 된다. 다만 setter 메서드에도 set prefix가 붙지 않기 때문에 setHasBankAccount()로 사용하고 싶은 경우에는 이 부분이 마음에 들지 않을 수 있다는게 함정이다 (...)

다른 방법?

이러한 특이 케이스를 위해 @Accessors 어노테이션을 달기가 조금 껄끄럽다면 is prefix를 그대로 활용할 수 있도록 표현을 조금 바꿔보는 것도 방법이 될 수 있다. 

  • havingBankAccount - isHavingBankAccount()
  • bankAccountRegistered - isBankAccountRegisterd()
  • ...

물론 무조건 lombok을 사용해서 문제를 해결해야만 하는 것은 아니다. lombok이 생성해주는 네이밍이 마음에 들지 않거나 적절하지 않다면 직접 메서드를 정의해서 사용하는 방법이 가장 단순하고 명확한 해결책이 될 수 있다.