슬기로운 개발생활

[Spring] Lombok 알아보기

by coco3o
반응형

Lombok 이란?

Lombok은 Java 기반에서 기계적으로 작성하는 VO, DTO, Entity 관련 작업을 쉽게 할 수 있게 해주는 라이브러리 입니다.

Lombok을 이용하면 Getter, Setter, ToString, hashCode 등의 메소드들을 간편하게 사용할 수 있게 해줍니다.

Spring 프로젝트에서 사용할 경우 JPA 환경과 함께 일관화 되고 가독성이 좋은 어플리케이션을 작성할 수 있습니다.


Lombok 클래스 VS 일반적인 클래스 비교

@Getter @Setter

[ 일반 클래스 ]

public class Student {
    private int studentNum;
    private String name;
    private int age;

    public int getStudentNum() {
        return studentNum;
    }

    public void setStudentNum(int studentNum) {
        this.studentNum = studentNum;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

[ Lombok 클래스 ]

import lombok.Getter;
import lombok.Setter;

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

Lombok 라이브러리에서 가장 많이 사용되는 어노테이션이라 생각됩니다.
이 @Getter와 @Setter는 자동으로 getter 메소드와 setter 메소드를 생성해주는 어노테이션입니다.
- 물론, IDE(Eclipse나 IntelliJ)로 쉽게 만들 수도 있습니다.

@NoArgsConstructor , @AllArgsConstructor , @RequiredArgsConstructor

[ 일반 클래스 ]

public class Student {
    private int studentNum;
    private String name;
    private int age;
	
    //NoArgsConstructor
    public Student() { }
	
    //AllArgsConstructor
    public Student(int studentNum, String name, int age) {
        this.studentNum = studentNum;
        this.name = name;
        this.age = age;
    }
	
    //RequiredArgsConstructor
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

[ Lombok 클래스 ]

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

@NoArgsConstructor
@AllArgsConstructor
@RequiredArgsConstructor
public class Student {
    private int studentNum;
    private String name;
    private int age;
}
  • @NoArgsConstructor : 기본 생성자를 만들어주는 어노테이션입니다.
  • @AllArgsConstructor : 모든 필드 값을 사용하는 생성자를 만들어주는 어노테이션입니다.
  • @RequiredArgsConstructor : final 이나 @NonNull 인 필드 값만 파라미터로 받는 생성자를 만들어주는 어노테이션입니다.
    • final 선언된 필드 의존성 자동 주입(생성자 주입)시 사용 OK

@EqualsAndHashCode

[ 일반 클래스 ]

public class Student {
    private int studentNum;
    private String name;
    private int age;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return studentNum == student.studentNum &&
                age == student.age &&
                Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(studentNum, name, age);
    }

[ Lombok 클래스 ]

import lombok.EqualsAndHashCode;

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

@EqualsAndHashCode 어노테이션은 클래스에 대한 equals 함수와 hashCode 함수를 자동으로 생성해줍니다.

@ToString

[ 일반 클래스 ]

public class Student {
    private int studentNum;
    private String name;
    private int age;

    @Override
    public String toString() {
        return "Student{" +
                "studentNum=" + studentNum +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

[ Lombok 클래스 ]

import lombok.ToString;

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

@ToString 어노테이션은 클래스의 변수들을 기반으로 ToString 메소드를 자동으로 완성시켜줍니다.
출력을 원하지 않는 변수가 있다면 해당 변수에 @ToString.Exclude 을 붙여주면 제외할 수 있습니다.

import lombok.ToString;

@ToString(exclude = "age")
public class Student {
    private int studentNum;
    private String name;
    private int age;
}

@Data 하나로 간단하게 사용할 수 있다.

@Data 어노테이션을 사용하면 @Getter, @Setter, @ToString, @EqualsAndHashCode, RequiredArgsConstructor를 모두 사용할 수 있습니다.
하지만, @Data를 사용하는 것은 지양하는 것이 좋습니다. 왜냐하면 무분별하게 Setter가 남용될 수 있기 때문에,
변경하면 안되는 값이 변경될 수 있는 가능성이 생겨 객체의 안전성을 보장할 수 없기 때문입니다.

import lombok.Data;

@Data
public class Student {
    private int studentNum;
    private String name;
    private int age;
}
 * @see Getter
 * @see Setter
 * @see RequiredArgsConstructor
 * @see ToString
 * @see EqualsAndHashCode
 * @see lombok.Value
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface Data {
...
}

@Builder

@Builder 어노테이션을 사용하면 해당 클래스의 객체 생성에 Builder 패턴을 적용시켜줍니다.
모든 변수들에 대해 build를 원하면 클래스 위에, 특정 변수만을 build하기 원하면 생성자를 작성하고 그 위에 @Builder 어노테이션을 붙여줍니다.


이렇게 Lombok을 사용하면 getter, setter, constructor 등을 매번 생성할 필요가 없어
코드의 다이어트와 가독성 및 유지보수에 많은 도움이 되는 것을 알 수 있습니다.
하지만, 편리한만큼 독이 된다고 합니다.
객체를 생성하거나 메소드를 제공할 때 캡슐화나 응집도, 결합도 측면을 조금만 더 깊게 생각해보고,
Lombok을 상황에 맞게 사용하는 것이 중요하다고 생각합니다.

반응형

블로그의 정보

슬기로운 개발생활

coco3o

활동하기