[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을 상황에 맞게 사용하는 것이 중요하다고 생각합니다.
'🌈Programming > Spring' 카테고리의 다른 글
[Spring] @RequestMapping 간단 정리 (0) | 2021.07.27 |
---|---|
DTO와 VO 그리고 Entity 차이점 알아보기 (0) | 2021.07.26 |
[Spring] @Controller와 @RestController의 차이점 알아보기 (0) | 2021.07.22 |
[Spring] PSA(Portable Service Abstraction)란? (0) | 2021.07.16 |
[Spring] POJO(Plain Old Java Object)란? (1) | 2021.07.15 |
블로그의 정보
슬기로운 개발생활
coco3o