Java

Lombok의 기능과 사용시 주의할점


1. Lombok이 왜 필요한가?

Lombok

/*
 lobok을 사용하지 않았을 때
*/
public class Member {

    private long id;

    private String username;

    private String email;

    private LocalDateTime localDateTime;

    private String address;


    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public LocalDateTime getLocalDateTime() {
        return localDateTime;
    }

    public void setLocalDateTime(LocalDateTime localDateTime) {
        this.localDateTime = localDateTime;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }



    }
}

Lombok이란 자바 컴파일 시점에서 특정 어노테이션으로 해당 코드를 자동완성해주는 라이브러리입니다. Lombok을 이용하면 코드의 가독성 및 유지보수에 많은 도움을 줄 수 있습니다. 하지만 Lombok을 사용할 때는 여러 주의를 기울이셔야 합니다.

위와 아래의 코드를 비교해보면 확실히 코드가 짧아지고 가독성이 좋아졌다는게 보입니다.

/*
Lombok 사용
*/
@Getter
@Setter
public class Member {
    private long id;
    private String username;
    private String email;
    private LocalDateTime localDateTime;
    private String address;
    }
}

2. Lombok 기능 및 주의점

@Data

@Data는 @ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor을 한 번에 가져오는 어노테이션입니다. 하지만 많은 부작용이 있기 때문에 사용을 지양하는 게 좋습니다.

@Data
public class Member {
    private long id;
    private String username;
    private String email;
    private LocalDateTime localDateTime;
    private String address;
    }
}

@Getter, Setter

getter, setter은 위에서 봤듯이 Lombok이 해당필드에 대한 getter/setter를 생성해줍니다. getter는 단순히 필드를 리턴하며, setter는 필드에 값을 저장해주는 역할을 합니다. 만약 특정 필드에서 getter, setter의 생성을 막고 싶다면 AccessLevel.None을 사용하여 막을 수 있습니다.

setter를 사용하면 객체가 언제든지 값을 변경할 수 있는 상태가 되기 때문에 객체의 안정성을 위하여 무분별한 @Data나 @setter의 사용을 지양하여야 합니다.

@Getter
@Setter
public class Member {
    private long id;
    @Getter(AccessLevel.NONE) //lombok이 메서드를 생성하지 않는다.
    private String username;
    private String email;
    private LocalDateTime localDateTime;
    private String address;
    }
}

@NonNull

@NonNull는 Lombok에서 null-check 로직을 자동으로 생성해주는 어노테이션이다. 생성자, 메소드에 @NoNull이 존재하면 Lombok에서 해당 파라미터에 대한 null-check 코드를 생성한다.

@NoArgsConstructor

@NoArgsConstructor는 매개변수가 없는 생성자를 생성합니다. 파라미터가 없는 생성자를 자동으로 생성하여 줍니다. 필드들이 final로 생성되어 있는 경우에는 필드를 초기화할 수 없기 때문에 @NoArgsConstructor(force = true) 옵션을 사용하여 초기화를 강제로 시켜서 사용하여야 합니다. 생성자를 그냥 열어두면 객체의 생성 시 안정성이 떨어질 수 있습니다, 그래서 기본 생성자 접근권한을 Protected로 변경하면 외부에서는 생성자에 접근을 할 수 없습니다.

@Entity
@Getter
@Table(name = "member")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Member {
    private long id;
    private String username;
    private String email;
    private LocalDateTime localDateTime;
    private String address;

    @Builder
    public Member(String username, String email) {
        this.username = username;
        this.email = email;
    }
    }
}

@AllArgsConstructor

@AllArgsConstructor는 클래스내에 존재하는 모든 필드에 대하여 생성자를 자동으로 생성해주는 어노테이션입니다. 초기화되지 않은 final필드, NonNull로 마크되어 있는 모든 필드에 대한 생성자를 자동으로 생성해줍니다.

@RequiredArgsConstructor

@RequiredArgsConstructor는 특정 변수만을 생성자를 자동으로 생성해주는 어노테이션입니다. 초기화 되지않은 final필드, NonNull로 마크되어 있는 모든 필드에 대한 생성자를 자동으로 생성해줍니다. 만약 null값이 파라미터로 들어온다면 NullPointerException이 발생합니다.

@Builder

@Builder는 해당 클래스의 객체생성에 Builder패턴을 적용시켜줍니다. 모든 변수에 Builder를 원하면 클래스 위에 어노테이션에 Builder를 추가하면 되지만 그렇게 하게 되면 모든 멤버 필드에 대한 매개변수를 허용하기 때문에 객체 생성 시 받지 않아야 할 데이터까지 받게 됩니다. 그렇기 때문에 아래 코드와 같이 생성자를 지정하고 그위에 Builder를 지정하는 게 바람직합니다.

@Entity
@Getter
@Table(name = "member")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Member {
    private long id;
    private String username;
    private String email;
    private LocalDateTime localDateTime;
    private String address;

    @Builder
    public Member(String username, String email) {
        this.username = username;
        this.email = email;
    }
  }
}

Lombok의 코드의 가독성이나 코드의 양을 줄여주는것은 좋은 라이브러리라고 생각합니다. 하지만 사용 시에는 주의해야 할 점이나 여러 생각을 해보고 쓰지 않으면 양날의 검이 될 수 있다고 생각이 됩니다.

참고한 사이트

Project Lombok

실무에서 Lombok 사용법 - Yun Blog | 기술 블로그