[Spring] Lombok 알아보기
by coco3oLombok 이란?
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