[Java] Lombok 의존성 추가, 유명 Annotation (@Getter @Setter @ToString, 생성자, @Data)
1. Lombok이란?
Lombok은 Java 언어를 위한 프로덕션 라이브러리로, 반복적이고 지루한 작업을 줄이고 코드를 더 간결하게 작성할 수 있도록 돕는 도구라고 할 수 있다. Lombok의 주요 기능은 자동 생성자, Getter 및 Setter 메서드, equals 및 hashCode 메서드, toString 메서드 등을 자동으로 생성하여 개발자의 작업을 간소화하고 코드를 간소화한다. 2. Lombok을 활용하기 위한 Dependencies 추가
compileOnly 'org.projectlombok:lombok'annotationProcessor 'org.projectlombok:lombok'
build.gradle 파일에서 dependencies 부분에 위 코드를 추가해주면 된다.위 코드에서 compileOnly 란 컴파일 시에만 Lombok 라이브러리가 필요하고, 런타임에는 필요하지 않음을 나타낸다. 두 번째 코드인 annotationProcessor 구성은 컴파일 시에 Lombok이 처리되도록 하는 것이다. 3. 자주 사용되는 Lombok annotation
1) @Getter, @Setter
import lombok.Getter;import lombok.Setter;@Getter@Setterpublic class Person {private String name;private int age;}
Lombok의 @Getter와 @Setter가 없이는 Java 코드로 항상setName(), getName(), setAge(), getAge() 등 각 field 마다 getter와 setter를 코드에 명시해주어야 했다.특정 필드에 @Getter와 @Setter의 annotation을 붙여주면 해당 필드에 대한 getter와 setter 메소드를 명시하지 않아도 Getter와 Setter 기능을 사용할 수 있다. 또한 클래스 자체에 @Getter와 @Setter를 붙이면 해당 클래스의 모든 필드에 대한 Getter와 Setter 기능을 사용할 수 있다. 모든 필드에 대해 Getter와 Setter 코드를 다 작성하던 기존의 코드에 비하여 코드 길이를 상당히 단축시킬 수 있다. 2) 생성자 자동 생성
Java에서 해당 class를 만들기 위해서는 반드시 생성자가 있어야 하는데 Lombok을 사용하면 이러한 생성자도 단 하나의 annotation을 사용하여 생성할 수 있어 매우 편리하다.생성자를 자동으로 생성해주는 annotation에는 세 가지 종류가 있다. -@NoArgsConstructor: 매개변수가 없는 기본 생성자를 생성해줌.-@RequiredArgsConstructor: 필드가 final 또는 @NonNull로 표시된 경우 해당 필드를 매개변수로 하는 생성자를 생성해줌.-@AllArgsConstructor: 모든 필드를 매개변수로 하는 생성자를 생성해줌. import lombok.NoArgsConstructor;import lombok.RequiredArgsConstructor;import lombok.AllArgsConstructor; @NoArgsConstructor // 매개변수가 없는 기본 생성자를 생성@RequiredArgsConstructor // 필수 필드를 매개변수로 하는 생성자를 생성@AllArgsConstructor // 모든 필드를 매개변수로 하는 생성자를 생성public class Example {private final String field1; private boolean field2;private String field3; }
위 코드에서 private final String으로 되어 있는 field1은 @RequiredArgsConstructor에 의해 필수 field로 여겨진다. 3) @ToString
Lombok의 @ToString annotation은 클래스의 toString() 메서드를 자동으로 생성해준다. 예를 들어import lombok.ToString;@ToStringpublic class Person {private String name;private int age;}
위와 같이 Lombok @ToString annotation을 사용한 Java code가 있다고 가정해보면 Lombok의 @ToString은 아래와 같은 method를 자동으로 생성해준다. @Overridepublic String toString() {return "Person(name=" + this.name + ", age=" + this.age + ")";}
이렇게 생성된 toString() 메서드는 클래스의 모든 필드를 포함하며, 필드 이름과 해당 필드의 값이 포함된 문자열을 반환해준다. 하지만 만약 여기서 특정 필드만을 제외하고 싶다면 어떻게 하면 될까? Lombok의 exclude 옵션을 줄 수 있다.(exclude = "name")이런 식으로 특정 필드를 제외하여 toString() 메소드를 생성할 수 있다. 4) @EqualsAndHashCode annotation
클래스의 equals()와 hashCode() 메서드를 자동으로 생성해주는 Lombok의 기능이다.import lombok.EqualsAndHashCode;@EqualsAndHashCodepublic class Person {private String name;private int age;}
위와 같이 name와 age라는 필드에 대해 @EqualsAndHashCode annotation을 사용함으로써 equals()와 hashCode() 메서드를 생성해줄 수 있다. 마찬가지로 exclude 옵션을 사용하여 제외하고 싶은 필드를 제외시킬 수 있다.@EqualsAndHashCode(exclude = "name")public class Person {private String name;private int age;}
name field를 제외하고 싶다면 위와 같은 코드로 사용할 수 있다. 5) @Data
위에서 다른 4개의 annotation 모두 우리가 Java에서 코드를 작성할 때 매우 유용하고 자주 사용되는 annotation들이다. 따라서 4개의 annotation을 모두 다 직접 나열할 필요 없이 하나의 annotation으로 @Data 라는 annotation을 만들었다.하나의 annotation만 사용하면 다섯개의 다른 annotation들(@Getter, @Setter, @EqualsAndHashCode, @ToString, @RequiredArgsConstructor)을 나열할 필요가 없이 위 기능들을 모두 사용할 수 있어서 매우 편리한 기능이다.
1. Lombok이란?
Lombok은 Java 언어를 위한 프로덕션 라이브러리로, 반복적이고 지루한 작업을 줄이고 코드를 더 간결하게 작성할 수 있도록 돕는 도구라고 할 수 있다. Lombok의 주요 기능은 자동 생성자, Getter 및 Setter 메서드, equals 및 hashCode 메서드, toString 메서드 등을 자동으로 생성하여 개발자의 작업을 간소화하고 코드를 간소화한다.
2. Lombok을 활용하기 위한 Dependencies 추가
compileOnly 'org.projectlombok:lombok'annotationProcessor 'org.projectlombok:lombok'
build.gradle 파일에서 dependencies 부분에 위 코드를 추가해주면 된다.
위 코드에서 compileOnly 란 컴파일 시에만 Lombok 라이브러리가 필요하고, 런타임에는 필요하지 않음을 나타낸다. 두 번째 코드인 annotationProcessor 구성은 컴파일 시에 Lombok이 처리되도록 하는 것이다.
3. 자주 사용되는 Lombok annotation
1) @Getter, @Setter
import lombok.Getter;import lombok.Setter;@Getter@Setterpublic class Person {private String name;private int age;}
Lombok의 @Getter와 @Setter가 없이는 Java 코드로 항상
setName(), getName(), setAge(), getAge() 등 각 field 마다 getter와 setter를 코드에 명시해주어야 했다.
특정 필드에 @Getter와 @Setter의 annotation을 붙여주면 해당 필드에 대한 getter와 setter 메소드를 명시하지 않아도 Getter와 Setter 기능을 사용할 수 있다.
또한 클래스 자체에 @Getter와 @Setter를 붙이면 해당 클래스의 모든 필드에 대한 Getter와 Setter 기능을 사용할 수 있다. 모든 필드에 대해 Getter와 Setter 코드를 다 작성하던 기존의 코드에 비하여 코드 길이를 상당히 단축시킬 수 있다.
2) 생성자 자동 생성
Java에서 해당 class를 만들기 위해서는 반드시 생성자가 있어야 하는데 Lombok을 사용하면 이러한 생성자도 단 하나의 annotation을 사용하여 생성할 수 있어 매우 편리하다.
생성자를 자동으로 생성해주는 annotation에는 세 가지 종류가 있다.
-@NoArgsConstructor: 매개변수가 없는 기본 생성자를 생성해줌.
-@RequiredArgsConstructor: 필드가 final 또는 @NonNull로 표시된 경우 해당 필드를 매개변수로 하는 생성자를 생성해줌.
-@AllArgsConstructor: 모든 필드를 매개변수로 하는 생성자를 생성해줌.
import lombok.NoArgsConstructor;import lombok.RequiredArgsConstructor;import lombok.AllArgsConstructor;@NoArgsConstructor // 매개변수가 없는 기본 생성자를 생성@RequiredArgsConstructor // 필수 필드를 매개변수로 하는 생성자를 생성@AllArgsConstructor // 모든 필드를 매개변수로 하는 생성자를 생성public class Example {private final String field1;private boolean field2;private String field3;}
위 코드에서 private final String으로 되어 있는 field1은 @RequiredArgsConstructor에 의해 필수 field로 여겨진다.
3) @ToString
Lombok의 @ToString annotation은 클래스의 toString() 메서드를 자동으로 생성해준다.
예를 들어
import lombok.ToString;@ToStringpublic class Person {private String name;private int age;}
위와 같이 Lombok @ToString annotation을 사용한 Java code가 있다고 가정해보면 Lombok의 @ToString은 아래와 같은 method를 자동으로 생성해준다.
@Overridepublic String toString() {return "Person(name=" + this.name + ", age=" + this.age + ")";}
이렇게 생성된 toString() 메서드는 클래스의 모든 필드를 포함하며, 필드 이름과 해당 필드의 값이 포함된 문자열을 반환해준다.
하지만 만약 여기서 특정 필드만을 제외하고 싶다면 어떻게 하면 될까? Lombok의 exclude 옵션을 줄 수 있다.
(exclude = "name")
이런 식으로 특정 필드를 제외하여 toString() 메소드를 생성할 수 있다.
4) @EqualsAndHashCode annotation
클래스의 equals()와 hashCode() 메서드를 자동으로 생성해주는 Lombok의 기능이다.
import lombok.EqualsAndHashCode;@EqualsAndHashCodepublic class Person {private String name;private int age;}
위와 같이 name와 age라는 필드에 대해 @EqualsAndHashCode annotation을 사용함으로써 equals()와 hashCode() 메서드를 생성해줄 수 있다.
마찬가지로 exclude 옵션을 사용하여 제외하고 싶은 필드를 제외시킬 수 있다.
@EqualsAndHashCode(exclude = "name")public class Person {private String name;private int age;}
name field를 제외하고 싶다면 위와 같은 코드로 사용할 수 있다.
5) @Data
위에서 다른 4개의 annotation 모두 우리가 Java에서 코드를 작성할 때 매우 유용하고 자주 사용되는 annotation들이다. 따라서 4개의 annotation을 모두 다 직접 나열할 필요 없이 하나의 annotation으로 @Data 라는 annotation을 만들었다.
하나의 annotation만 사용하면 다섯개의 다른 annotation들(@Getter, @Setter, @EqualsAndHashCode, @ToString, @RequiredArgsConstructor)을 나열할 필요가 없이 위 기능들을 모두 사용할 수 있어서 매우 편리한 기능이다.