Lombok 사용법

leedong617·2024년 9월 18일
post-thumbnail

Lombok은 자바 애플리케이션 개발에서 보일러플레이트(boilerplate) 코드를 줄이기 위해 사용되는 라이브러리임. 보일러플레이트 코드는 주로 getter, setter, equals, hashCode, toString, 생성자와 같은 반복적으로 작성해야 하는 코드를 의미함. Lombok은 이러한 코드를 자동으로 생성해 주어 코드의 가독성을 높이고 유지보수를 용이하게 만듦.

Lombok은 어노테이션을 사용해 다양한 기능을 제공함. 컴파일 시점에 코드에 주입되기 때문에, 실제 소스 코드에는 없지만 컴파일된 바이트코드에는 필요한 메소드들이 포함됨.

Lombok의 주요 어노테이션

@Getter와 @Setter

설명: 필드에 대한 getter와 setter 메소드를 자동으로 생성함.
용도: 각 필드마다 수동으로 작성해야 하는 getter와 setter를 자동으로 생성하여 코드의 중복을 줄임.

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class User {
    private String name;
    private int age;
}

결과: 위 코드에서 @Getter와 @Setter는 getName(), setName(), getAge(), setAge() 메소드를 자동으로 생성함.

@ToString

설명: 객체의 모든 필드를 포함하는 toString() 메소드를 자동으로 생성함.
용도: 객체의 상태를 쉽게 출력하거나 로깅할 때 유용함.

import lombok.ToString;

@ToString
public class User {
    private String name;
    private int age;
}

결과: toString() 메소드가 자동으로 생성되며, User 객체의 필드 값을 문자열로 반환함.

@EqualsAndHashCode

설명: 객체의 equals()와 hashCode() 메소드를 자동으로 생성함.
용도: 객체 간의 동일성 비교와 해시 기반 컬렉션(예: HashMap, HashSet)에서 필요한 equals와 hashCode 메소드를 쉽게 구현할 수 있음.

import lombok.EqualsAndHashCode;

@EqualsAndHashCode
public class User {
    private String name;
    private int age;
}

결과: equals()와 hashCode() 메소드가 자동으로 생성되어, 객체의 필드 값을 기준으로 두 객체의 동일성을 비교할 수 있음.

@NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor

설명: 각종 생성자를 자동으로 생성함.
@NoArgsConstructor: 파라미터가 없는 기본 생성자를 생성함.
@AllArgsConstructor: 모든 필드를 매개변수로 받는 생성자를 생성함.
@RequiredArgsConstructor: final 또는 @NonNull이 붙은 필드만 매개변수로 받는 생성자를 생성함.

import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.RequiredArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
@RequiredArgsConstructor
public class User {
    private final String name;
    private int age;
}

결과:
@NoArgsConstructor: 기본 생성자 User()가 생성됨.
@AllArgsConstructor: 모든 필드를 매개변수로 받는 생성자 User(String name, int age)가 생성됨.**
@RequiredArgsConstructor: final로 선언된 name 필드만 매개변수로 받는 생성자 User(String name)이 생성됨.

@Data

설명: @Getter, @Setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructor를 모두 포함한 종합적인 어노테이션임.
용도: 엔터티 클래스나 모델 객체 등에서 자주 사용하는 여러 기능을 한 번에 적용할 수 있음.

import lombok.Data;

@Data
public class User {
    private String name;
    private int age;
}

결과: @Data 어노테이션을 사용하면 getter, setter, toString, equals, hashCode, 그리고 필수 필드에 대한 생성자가 자동으로 생성됨.

@Builder

설명: 빌더 패턴을 쉽게 구현할 수 있도록 해주는 어노테이션임.
용도: 객체의 여러 필드를 선택적으로 설정하고 싶을 때 유용함.

import lombok.Builder;

@Builder
public class User {
    private String name;
    private int age;
}

사용 예시)

User user = User.builder()
                .name("John")
                .age(30)
                .build();

결과: 빌더 패턴을 사용하여 User 객체를 생성할 수 있음. 필요한 필드만 선택적으로 설정할 수 있으며, 빌더 패턴 특유의 가독성을 제공함.

@Value

설명: 불변 객체를 만들 때 사용되는 어노테이션. 모든 필드는 final, getter만 제공하고, 생성자는 모든 필드를 매개변수로 받는 생성자를 만듦.
용도: 값 객체나 불변 객체를 정의할 때 유용함.

import lombok.Value;

@Value
public class User {
    String name;
    int age;
}

결과: @Value는 모든 필드를 final로 선언하고, setter를 생성하지 않으며 getter만 제공함. 또한, 모든 필드를 매개변수로 받는 생성자를 자동으로 생성함.

@SneakyThrows

설명: 예외를 명시적으로 처리하지 않고도 예외를 던질 수 있게 해주는 어노테이션. 주로 체크드 예외(Checked Exception)를 간편하게 처리할 때 사용됨.
용도: 예외 처리를 줄이고 코드를 간결하게 유지하고자 할 때 사용됨.

import lombok.SneakyThrows;

public class UserService {
    @SneakyThrows
    public void perform() {
        throw new Exception("Checked exception without try-catch");
    }
}

결과: @SneakyThrows를 사용하면 try-catch 블록 없이 체크드 예외를 던질 수 있음.

2. Lombok의 장점

보일러플레이트 코드 감소: getter, setter, toString, equals, hashCode 같은 반복적인 코드를 줄여주어, 가독성이 향상되고 유지보수가 쉬워짐.

간결한 코드: 어노테이션으로 쉽게 코드를 처리할 수 있어 간결하고 명확한 코드 작성이 가능해짐.

생산성 향상: 특히 엔터티 클래스나 DTO 같은 곳에서 자주 쓰이는 코드가 자동으로 생성되므로, 개발 생산성이 향상됨.

빌더 패턴 제공: @Builder 어노테이션을 통해 빌더 패턴을 쉽게 구현할 수 있어, 객체 생성 시의 유연성을 제공함.

불변 객체 지원: @Value 어노테이션을 사용하면 불변 객체를 쉽게 만들 수 있어, 값 객체나 불변성을 보장해야 하는 곳에서 유용하게 사용됨.

3. Lombok의 단점

코드 가독성 저하 가능성: 코드를 읽는 개발자가 Lombok의 어노테이션을 이해하지 못하면, 코드가 숨겨진 메소드를 가지고 있어 가독성이 떨어질 수 있음.

IDE 지원 필수: Lombok은 IDE 플러그인이 필요함. IntelliJ IDEA나 Eclipse 같은 IDE에서는 별도의 플러그인 설치가 요구되며, 그렇지 않으면 컴파일러가 자동으로 생성된 메소드를 인식하지 못할 수 있음.

디버깅 어려움: Lombok은 컴파일 시점에 메소드를 생성하므로, 디버깅할 때 코드에서 보이지 않는 메소드가 동작하는 경우가 있어, 문제 발생 시 디버깅이 다소 까다로울 수 있음.

종속성: 프로젝트가 Lombok에 의존하게 되면, Lombok을 지원하지 않는 환경에서는 사용하기 어려울 수 있음.

결론

Lombok은 자바 개발에서 반복적인 보일러플레이트 코드를 줄여줌으로써 생산성을 높이고 코드의 가독성을 향상시키는 유용한 라이브러리임. 특히 getter, setter, toString, equals와 같은 메소드를 반복해서 작성하지 않아도 된다는 점에서 많은 개발자에게 사랑받고 있음. 단, IDE에서 Lombok을 지원해야 하고, 프로젝트 내에서 이를 사용할 때는 코드의 가독성 저하 및 디버깅의 어려움에 주의해야 함.

profile
웹개발자 취업 준비생

0개의 댓글