[Java] Lombok
π Lombokμ΄λ?
Lombok
μ΄λ μ΄λ
Έν
μ΄μ
κΈ°λ°μΌλ‘ μλ° μ½λλ₯Ό μλμΌλ‘ μμ±ν΄μ£Όλ λΌμ΄λΈλ¬λ¦¬μ΄λ€. μ΄λ₯Ό ν΅ν΄ μ½λκ° κ°κ²°ν΄μ§λ©° κ°λ
μ±μ ν₯μμν¬ μ μλ€. λν λ°λ³΅μ μΌλ‘ μμ±λλ 보μΌλ¬νλ μ΄νΈ μ½λκ° κ°μνκ² λλ€.
μ΄λ κ°λ°μκ° ν΅μ¬ λΉμ¦λμ€ λ‘μ§μ λ μ§μ€ν μ μλλ‘ νλ ν¨κ³Όλ₯Ό κ°μ Έμ€λ©°, μ μ§λ³΄μκ° μ¬μμ§λ€.
μ€μ λ‘ Lombokμ μ¬μ©νκΈ° μ κ³Ό νμ μ°¨μ΄μ μ μ΄ν΄λ³΄μ.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Person {
private String name;
private int age;
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;
}
}
νμ¬λ νλκ° λ κ° λ°μ μμ§λ§, νλμ μκ° μ¦κ°νλ©΄ κ·Έλ§νΌ μμ±ν΄μΌ νλ getter/setter λ©μλμ μκ° μ¦κ°νκ² λλ€. λ°λ³΅μ μΈ μ½λμ μμ±μ΄ μ¦κ°νλ€λ λ»μ΄λ€.
1
2
3
4
5
6
7
8
9
10
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class Person {
private String name;
private int age;
}
Lombokμ μ¬μ©νκ² λλ©΄ μ΄λ»κ² μ½λκ° κ°κ²°ν΄μ§κΉ? @Getter
, @Setter
μ΄λ
Έν
μ΄μ
μ μΆκ°νλ©΄ μ»΄νμΌ μμ μ μλμΌλ‘ getter/setter λ©μλκ° μμ±λλ€.
π μ€μ λ°©λ²
- Gradle
1
2
3
4
5
6
dependencies {
implementation 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
}
- Maven
1
2
3
4
5
6
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
<scope>provided</scope>
</dependency>
π λμ μ리
μ½λμ μ΄λ
Έν
μ΄μ
μ λΆμ΄κ² λλ©΄ μ»΄νμΌ μμ μ ν΄λΉ μ΄λ
Έν
μ΄μ
μ κ°μ§νμ¬ νμν μ½λλ₯Ό μλμΌλ‘ μμ±νλ€. javac
(μλ° μ»΄νμΌλ¬)μλ Annotation Processing
λ¨κ³κ° μ‘΄μ¬νλ€. μ΄ λ¨κ³μμ Lombokμ Annotation Processor
κ° λμνμ¬ μ½λλ₯Ό νμ±νμ¬ λ§λ AST(Abstract Syntax Tree)
λ₯Ό λμ μΌλ‘ μμ νλ€. μμ λ ASTλ₯Ό κΈ°λ°μΌλ‘ javacκ° μ΅μ’
λ°μ΄νΈμ½λ(.class)λ₯Ό μμ±νλ€.
π μ£Όμ Lombok μ΄λ Έν μ΄μ
@Getter/Setter
ν΄λμ€μ νλμ λν getter/setter λ©μλλ₯Ό μλμΌλ‘ μμ±νλ€.
1
2
3
4
5
6
7
8
// ν΄λμ€ μ 체μ μ μ©
@Getter
@Setter
public class Member {
private String id;
private String name;
}
@AllArgsConstructor
ν΄λμ€μ λͺ¨λ νλλ₯Ό νλΌλ―Έν°λ‘ λ°λ μμ±μλ₯Ό μλμΌλ‘ μμ±νλ€.
1
2
3
4
5
6
7
8
9
10
11
12
@AllArgsConstructor
public class Employee {
private String name;
private int salary;
}
// μμ±λλ μμ±μ
public Employee(String name, int salary) {
this.name = name;
this.salary = salary;
}
@NoArgsConstructor
νλΌλ―Έν°κ° μλ κΈ°λ³Έ μμ±μλ₯Ό μλμΌλ‘ μμ±νλ€.
1
2
3
4
5
6
7
8
9
10
@NoArgsConstructor
public class Employee {
private String name;
private int salary;
}
// μμ±λλ μμ±μ
public Employee() {
}
@RequiredArgsConstuctor
ν΄λμ€ λ΄μμ μ΄κΈ°νλμ§ μμ final νλμ @NonNull
μ΄ λΆμ νλλ§μ νλΌλ―Έν°λ‘ λ°λ μμ±μλ₯Ό μλμΌλ‘ μμ±νλ€.
1
2
3
4
5
6
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
private String name;
}
μ μ½λμμ userRepository
λ§ μμ±μμ νλΌλ―Έν°λ‘ ν¬ν¨λλ€.
@ToString
ν΄λμ€μ λͺ¨λ νλλ₯Ό κΈ°λ°μΌλ‘ toString()
λ©μλλ₯Ό μλμΌλ‘ μμ±νλ€. toString()μ κ°μ²΄λ₯Ό μ½μ μ μλ λ¬Έμμ΄λ‘ λ³ννλ λ©μλμ΄λ€.
exclude
μμ±μ μ¬μ©νμ¬ νΉμ νλλ₯Ό toString() κ²°κ³Όμμ μ μΈν μ μμΌλ©°, λλ @Tostring.Exclude
μ΄λ
Έν
μ΄μ
μ μ§μ λΆμ¬ μ μΈν μ μλ€.
@ToString(callSuper = true)
λ₯Ό μ¬μ©νλ©΄ λΆλͺ¨ ν΄λμ€μ toString() κ²°κ³Όλ ν¨κ» ν¬ν¨ν μ μλ€. κ·Έλ¬λ κ°μ²΄ κ° μν μ°Έμ‘°κ° μμ κ²½μ° λ¬΄ν 루νκ° λ°μν μ μλ€.
@EqualsAndHashCode
ν΄λμ€μ equals()
μ hashCode()
λ©μλλ₯Ό μλμΌλ‘ μμ±νλ€. equals()λ λ κ°μ²΄κ° λ
Όλ¦¬μ μΌλ‘ λλ±νμ§ λΉκ΅νλ©°, hashCode()λ κ°μ²΄λ₯Ό ν΄μ κΈ°λ° μλ£κ΅¬μ‘°μμ μ¬μ©ν λ κ°μ²΄μ ν΄μκ°μ 리ν΄νλ€.
λ κ°μ²΄λ₯Ό λΉκ΅ν λ, λ¨Όμ hashcodeλ₯Ό λΉκ΅νλ€. hashcodeκ° λ€λ₯΄λ€λ©΄ λ κ°μ²΄λ λͺ λ°±νκ² λ€λ₯΄λ, κ°λ€λ©΄ equals()λ₯Ό ν΅ν΄ λ κ°μ²΄κ° κ°μμ§ λΉκ΅νλ€.
@Data
@Data
μ΄λ
Έν
μ΄μ
μ μ¬μ©νλ©΄ @Getter
, @Setter
, @ToString
, @EqualsAndHashCode
, @RequiredArgsConstructor
μ΄λ
Έν
μ΄μ
μ ν λ²μ μ μ©ν μ μλ€. κ·Έλ¬λ κ°κ°μ μ΄λ
Έν
μ΄μ
μ λν μΈλΆμ μΈ μ΅μ
μ μ μ©ν μ μμΌλ―λ‘ μ€λ¬΄μμ μ μ¬μ©νμ§ μλ νΈμ΄λ€.
@Builder
κ°μ²΄λ₯Ό μμ±νκΈ° μν λΉλ ν¨ν΄μ μλμΌλ‘ ꡬνν΄μ€λ€. λΉλλ₯Ό ν΅ν΄ κ°μ²΄λ₯Ό μμ±ν λ κ° νλμ κ°μ λ©μλ 체μ΄λ λ°©μμΌλ‘ μ§μ ν μ μλ€.
1
2
3
4
5
6
7
8
9
10
11
@Builder
public class Person {
private final String name;
private final int age;
}
Person person = Person.builder()
.name("Alice")
.age(25)
.build();
π μ£Όμμ¬ν
- 무λΆλ³ν Setter, Data, AllArgsConstructor λ±κ³Ό κ°μ μ΄λ
Έν
μ΄μ
μ¬μ©μ μ§μνμ.
@Data
λ λΆνμν setterμ λ ΈμΆ, μν μ°Έμ‘°, μμμΉ λͺ»ν λμκ³Ό κ°μ λ¬Έμ κ° λ°μν μ μλ€.@Setter
λ κ°μ²΄μ λΆλ³μ±μ ν΄μΉ μ μλ€.@AllArgsConstructor
λ νλ μμκ° λ°λκ±°λ νλκ° μΆκ° λλ μμ λ λ κ°μ²΄ μμ± μ€λ₯κ° λ°μν μ μλ€. λ°λΌμ λͺ ννκ² μμ±μλ₯Ό μμ±νλ κ²μ΄ μ’λ€.
- μν μ°Έμ‘°κ° λ°μνλ μν©μ μ‘°μ¬νμ.
@ToString
,@EqualsAndHashCode
μ κ°μ μ΄λ Έν μ΄μ μ μλ°©ν₯ μ°κ΄κ΄κ³κ° μλ μν°ν°μ μ¬μ©νλ©΄ μν μ°Έμ‘°κ° λ°μν μ μλ€. - μ¬μ©ν μ΄λ Έν μ΄μ λ§ λͺ μνκ³ , νμν λΆλΆμλ§ λͺ μνμ.
π μ°Έκ³
https://lucas-owner.tistory.com/26#google_vignette
https://mangkyu.tistory.com/78
https://jake-seo-dev.tistory.com/70