• μλ νμΈμ~ μ΄μ μ μ΄μνλ λΈλ‘κ·Έ λ° GitHub, κ³΅λΆ λ΄μ©μ μ 리νλ Study-GitHub κ° μμ΅λλ€!
• π
π Lombok(둬볡)
μλ νμΈμ! μ΄λ²μ μ 리ν λ΄μ©μ Project Lombok(둬볡) μ λλ€.
Lombokμ Java λΌμ΄λΈλ¬λ¦¬λ‘, μλ° κ°λ°μλΌλ©΄ λλΆλΆ ν λ²μ―€μ μ¬μ©ν΄λ³΄μ§ μμμκΉ νλ μ ~λ§ λ§μ΄ μ¬μ©νλ λΌμ΄λΈλ¬λ¦¬μ λλ€.
μ λν νμμ κ°λ°μ ν λ Lombok λΌμ΄λΈλ¬λ¦¬ μμ΄λ κ°λ°μ λͺ» ν μ λλ‘(?) λ§μ΄ μ¬μ©μ νλλ°μ.. γ γ
μ΄λ² μκ°μλ Lombok μ΄λ 무μμΈμ§, μ΄λ»κ² μ¬μ©νλμ§μ μ₯λ¨μ μ λν΄ μ΄ν΄λ³΄κ² μ΅λλ€ :)
κ°λ΅νκ² λͺ©μ°¨λ₯Ό λνλ΄λ©΄ λ€μκ³Ό κ°μ΅λλ€!
- Lombok μ΄λ?
- Lombok μ€μΉ
- Lombok λ€μν μ΄λ Έν μ΄μ
- Lombokμ 무쑰건 μ’μκΉμ?
π― Lombok μ΄λ?
λ¨Όμ Lombok μ΄ λ¬΄μμΈμ§ μμλ³΄κ² μ΅λλ€!
Lombokμ 곡μλ¬Έμμλ λ€μκ³Ό κ°μ΄ μ€λͺ μ νκ³ μμ΅λλ€.
Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.
Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.
=> Project Lombokμ Java κ°λ°μ μλλ₯Ό λμ΄κ³ , νΈμ§κΈ°μ λΉλ λꡬμ μλμΌλ‘ μ°κ²°λλ μλ° λΌμ΄λΈλ¬λ¦¬μ νλ¬κ·ΈμΈμ΄λ€.
getterλ equals κ°μ λ©μλλ₯Ό λ€μλ μ¬μ©νμ§ λ§μλΌ, λ¨ νλμ μ΄λ Έν μ΄μ μΌλ‘ ν΄λμ€λ μλ²½ν κΈ°λ₯μ κ°μ§ λΉλ, λ‘κΉ λ³μ μλν, κΈ°ν λ±λ±μ κΈ°λ₯μ΄ μλ€.
μ¦, getter, setter, equals λ±μ λ©μλμ λλ±νκ² μλνλ κΈ°λ₯μ μ΄λ Έν μ΄μ λ§μΌλ‘ μ μ©ν μ μλ κ°λ ₯ν κΈ°λ₯μΈλ°μ.
κ°λ¨νκ² μ½λλ‘ μ΄ν΄λ³΄λ©΄ λ€μκ³Ό κ°μ΅λλ€.
(Lombokμ μλ μ리μ λν΄ κΆκΈνμλ©΄ μλ μ¬μ΄νΈλ₯Ό μ°Έμ‘°ν΄μ£ΌμΈμ !)
https://free-strings.blogspot.com/2015/12/lombok.html
https://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/Processor.html
Lombok μμ΄ μ¬μ©νλ κΈ°μ‘΄ μλ° μ½λ
public class InflearnModel {
private Long id; // PK
private String imageUrl; // μΈλ€μΌ
private String title; // κ°μ μ λͺ©
private int price; // μ κ°
private int salePrice; // ν μΈ κ°κ²©
private float rating; // νμ
private String instructor; // κ°μμ
private String url; // κ°μ νμ΄μ§ λ§ν¬
private int viewCount; // μκ°μ μ
private String platform; // νλ«νΌ μ΄λ¦
private int sessionCount; // κ°μ μΈμ
κ°μ
private String currency; // μν
private String description; // κ°μ λΆμ°μ€λͺ
private String skills; // κ°μ μ€ν
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getImageUrl() {
return imageUrl;
}
public void setImageUrl(String imageUrl) {
this.imageUrl = imageUrl;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public int getSalePrice() {
return salePrice;
}
public void setSalePrice(int salePrice) {
this.salePrice = salePrice;
}
public float getRating() {
return rating;
}
public void setRating(float rating) {
this.rating = rating;
}
public String getInstructor() {
return instructor;
}
public void setInstructor(String instructor) {
this.instructor = instructor;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public int getViewCount() {
return viewCount;
}
public void setViewCount(int viewCount) {
this.viewCount = viewCount;
}
public String getPlatform() {
return platform;
}
public void setPlatform(String platform) {
this.platform = platform;
}
public int getSessionCount() {
return sessionCount;
}
public void setSessionCount(int sessionCount) {
this.sessionCount = sessionCount;
}
public String getCurrency() {
return currency;
}
public void setCurrency(String currency) {
this.currency = currency;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getSkills() {
return skills;
}
public void setSkills(String skills) {
this.skills = skills;
}
...
}
μ μ½λλ₯Ό μ΄ν΄λ³΄λ©΄ λ€λ₯Έ κΈ°λ₯μ μΌμ μμ΄ νλμ getter, setter λ©μλλ§ μ‘΄μ¬νλ ν΄λμ€μΈλ°μ,
νλκ° λμ΄λ¨μ λ°λΌ getter, setter λ©μλλ κ°μ΄ μμ±μ ν΄μΌνκΈ° λλ¬Έμ μ€λ³΅ μ½λκ° λ무λ λ§μμ§λ λ¨μ μ΄ μ‘΄μ¬ν©λλ€.
(λ¬Όλ‘ , μ΄λ° λ§μ νλλ₯Ό κ°μ§ ν΄λμ€λ₯Ό μμ±νλ κ²μ μ§μνλκ² μ’λ€κ³ μκ°ν©λλ€.)
μ μ½λλ§μΌλ‘λ μΆ©λΆν μ₯ν©νκΈ° λλ¬Έμ μμ±μλ equals, HashCode, toString λ±λ±μ λ©μλλ μ μΈνμ΅λλ€.
λ¬Όλ‘ InflearnModel ν΄λμ€ μ체μ νλκ° λ§κΈ°λ νμ§λ§, μ λΆ λΉμ· λΉμ·ν getter, setter λ©μλλ₯Ό μΆκ°νλ€ λ³΄λ λ°°λ³΄λ€ λ°°κΌ½μ΄ λ 컀μ§(?) μν©μ΄ λ κ² κ°μ΅λλ€.
μμ κ°μ μ₯ν©ν μ½λμ Lombokμ μ¬μ©νλ©΄ λ§λ²κ°μ(?) μΌμ΄ μΌμ΄λκ² λ©λλ€.
Lombokμ μ¬μ©ν (λ§λ²μ) μλ° μ½λ
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class InflearnModel {
private Long id; // PK
private String imageUrl; // μΈλ€μΌ
private String title; // κ°μ μ λͺ©
private int price; // μ κ°
private int salePrice; // ν μΈ κ°κ²©
private float rating; // νμ
private String instructor; // κ°μμ
private String url; // κ°μ νμ΄μ§ λ§ν¬
private int viewCount; // μκ°μ μ
private String platform; // νλ«νΌ μ΄λ¦
private int sessionCount; // κ°μ μΈμ
κ°μ
private String currency; // μν
private String description; // κ°μ λΆμ°μ€λͺ
private String skills; // κ°μ μ€ν
}
Lombokμ μ¬μ©νκ² λλ©΄ μ½λκ° μ ~~~~~~λ§ κ°κ²°ν΄μ§λλ°μ, κ°μΈμ μΌλ‘ μλ° μ½λκ° μ₯ν©νλ€κ³ λλΌλ μ΄μ μ€ νλκ° μμ κ°μ 보μΌλ¬ νλ μ΄νΈ μ½λμ±μ getter, setterμ κ°μ λ©μλ λλ¬Έμ΄λΌκ³ μκ°ν©λλ€.
μμμ μμ±ν λͺ¨λ getter, setter λ©μλλ₯Ό λ¨ 2μ€μ @Getter, @Setter μ΄λ Έν μ΄μ μ ν΅ν΄ κ°λ΅νκ² λνλΌ μ μμ΅λλ€.
(λ μ¬ννκ² νμ€λ‘ λνλ΄λ €λ©΄ @Getter @Setterλ‘ λνλΌμλ μμ΅λλ€ γ
γ
..)
κ·ΈλΌ μ΄λ° Lombokμ μ₯μ λ§ μλκ±ΈκΉμ? μλμμ μ’ λ μ΄ν΄λ³΄κ² μ΅λλ€ !
π― Lombok μ€μΉ
IntelliJ κΈ°λ°μΌλ‘ Lombokμ μ€μΉνλ λ°©λ²μ λν΄ μμλ³΄κ² μ΅λλ€!
(νΈμ₯μ Eclipseμμ Lombokμ μ€μΉνμλ λΆμ μ¬κΈ° λ₯Ό μ°Έκ³ ν΄μ£ΌμΈμ !)
λ¨Όμ λΌμ΄λΈλ¬λ¦¬λ₯Ό μΆκ°ν©λλ€.
build.gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
//lombok λΌμ΄λΈλ¬λ¦¬ μΆκ° μμ
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
//lombok λΌμ΄λΈλ¬λ¦¬ μΆκ° λ
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
pom.xml
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
<scope>provided</scope>
</dependency>
Pluginsμμ lombokμ κ²μν ν Lombok μ μ€μΉν©λλ€.
File > Settings > Plugins μμ lombok κ²μ ν μ€μΉ
Annotation Processors μ€μ
File > Settings > Annotation Processors κ²μ ν Enable annotation processing 체ν¬
μ κ³Όμ μ΄ λλλ©΄ Lombok μ μ¬μ©ν μ μλ νκ²½μ΄ κ΅¬μΆλμμ΅λλ€.
π― Lombokμ λ€μν μ΄λ Έν μ΄μ
Lombokμμ μ£Όλ‘ μ¬μ©νλ μ΄λ Έν μ΄μ μ λ€μκ³Ό κ°μ΅λλ€.
@Getter // getter() λ©μλ
@Setter // setter() λ©μλ
@Builder // Builder ν¨ν΄
@ToString // Objectμ toString() ꡬν
@EqualsAndHashCode // Objectμ equals() & hashCode() ꡬν
@NoArgsConstructor // 맀κ°λ³μ μλ μμ±μ(λν
νΈ μμ±μ)
@RequiredArgsConstructor // νμ κ°λ§ κ°μ§λ μμ±μ
@AllArgsConstructor // λͺ¨λ νλλ₯Ό κ°μ§λ μμ±μ
@Data // @ToString, @Getter, @Setter, @EqualsAndHashCode, @RequiredArgsConstructor μ΄λ
Έν
μ΄μ
μ ν¬ν¨
public class InflearnModel {
...
μ¬μ€ Lombokμ μ΄λ Έν μ΄μ μ κ²½μ° λ€μ΄λ°μ΄ μλμ΄μκΈ° λλ¬Έμ, μ΄λ¦λ§ 보λλΌλ λ¬΄μ¨ κΈ°λ₯μ νλμ§ μ μΆν μ μμ΅λλ€ π
νΉν @Data μ΄λ Έν μ΄μ μ κ²½μ°, μμ μ μν @Getter, @Setter, @ToString ... λ±λ±μ μ΄λ Έν μ΄μ μ λͺ¨λ ν¬ν¨νκ³ μλ κΈ°λ₯μ λλ€.
λ€μν Lombok μ κΈ°λ₯λ€μ μ΄ν΄λ³΄κ³ μΆμΌλ©΄ μλ 곡μλ¬Έμλ₯Ό μ°Έμ‘°ν΄μ£Όμλ©΄ λ©λλ€ :)
https://projectlombok.org/features/all
π§ κ·ΈλΌ λ€λ₯Έ μ΄λ Έν μ΄μ λ€μ ν¬ν¨νκ³ μλ @Data μ΄λ Έν μ΄μ λ§ μ¬μ©νλ©΄ λλκ² μλκ°μ?
β» μλλ μ κ°μΈμ μΈ μκ°μ λλ€ :)
μΈλ»λ³΄κΈ°μ @Dataλ λ§μ μ΄λ Έν μ΄μ μ ν¬ν¨νκ³ μκΈ° λλ¬Έμ μ΄ μ΄λ Έν μ΄μ μ΄ λ§λ₯μΈ κ² μ²λΌ 보μ΄μ§λ§, μ€μ λ‘λ κ·Έλ μ§ μμ΅λλ€.
κ·Έλ κ² μκ°νλ μ΄μ λ @Setter μ΄λ Έν μ΄μ μΌλ‘ μΈν΄ κ°μ²΄μ λΆλ³μ±μ 보μ₯νμ§ λͺ»νκΈ° λλ¬Έμ λλ€.
μ΄νν°λΈ μλ° 3/E λμμ λ€μκ³Ό κ°μ λ΄μ©μ΄ μμ΅λλ€.
μμ΄ν 15 - ν΄λμ€μ λ©€λ²μ μ κ·Ό κΆνμ μ΅μννλΌ
μμ΄ν 17- λ³κ²½ κ°λ₯μ±μ μ΅μννλΌ
μ μ£Όμ μμ μκΈ°νλ λ΄μ©μΌλ‘ ν΄λμ€λ₯Ό κ°λ₯ν immutable(λΆλ³) νκ² λ§λ€κ³ ,
λ³κ²½ κ°λ₯μ±μ μ΅μννλΌ λΌκ³ μ μλ λ§μ νκ³ μλλ°μ,
μ± μ μμ΄ν μλ λ€μκ³Ό κ°μ λ΄μ©λ€μ΄ μμ΅λλ€.
- κ°μ²΄μ μνλ₯Ό λ³κ²½νλ λ©μλλ₯Ό μ 곡νμ§ μλλ€. -> setter() λ©μλ λ±
- (κ°λ₯ν) λͺ¨λ νλλ₯Ό finalλ‘ μ μΈ
- λͺ¨λ νλλ₯Ό privateλ‘ μ μΈ
νμ§λ§ @Data μ΄λ Έν μ΄μ μ μ¬μ©νκ² λλ©΄ ν΄λΉ ν΄λμ€μλ @Setter μ΄λ Έν μ΄μ μ΄ μλμΌλ‘ μ μ©λκ³ ,
κ°μ²΄κ° λΆλ³μ 보μ₯νμ§ λͺ»νκΈ° λλ¬Έμ ν΄λΉ κ°μ²΄κ° 무λΆλ³νκ² μμ λ κ°λ₯μ±μ΄ μ‘΄μ¬ν©λλ€.
λ°λΌμ ν΄λΉ μ΄λ Έν μ΄μ (@Data)μ μ¬μ©μ μ§μνλκ² μ’λ€κ³ μκ°ν©λλ€.
λ§μ§λ§μΌλ‘ Lombokμ 무쑰건 μ¬μ©νλκ² μ’μμ§, λ€λ₯Έ μ¬μ΄λ μ΄ννΈ λ±μ μλμ§μ λν΄ κ°λ΅ν μ΄ν΄λ³΄κ² μ΅λλ€.
(JPAλ₯Ό μ¬μ©ν κ²½μ°, μλ°©ν₯ κ΄κ³μμ @ToString μ΄λ Έν μ΄μ μ μ μ©νλ©΄ μνμ°Έμ‘°λ‘ μΈν΄ Stack over flowκ° λ°μν μ μκΈ° λλ¬Έμ μ μν΄μ μ¬μ©ν΄μΌ ν©λλ€)
π― Lombokμ 무쑰건 μ’μκΉμ?
μ¬μ€ μ΄μ μ μΌλΆ κΈλ€κ³Ό λͺλͺ λΆλ€μκ² "Lombokμ μ¬μ©μ μ΅λν μ§μνλΌ" λΌλ λ΄μ©μ λ€μμ μ΄ μμ΅λλ€.
μμμ μ 리ν λ΄μ©λ§ λ΄€μλλ μ½λλ λ¨μν΄μ§κ³ , μμ°μ±λ λμκ°λ€κ³ λμμλλ° μ μ§μνλΌκ³ νμμκΉμ?
κ°μΈμ μΈ μκ°μΌλ‘λ, Lombokμ μλͺ» μ¬μ©νκ² λλ©΄ λͺλͺ μ¬μ΄λ μ΄ν©νΈκ° μκΈ° λλ¬Έμ΄λΌκ³ μκ°ν©λλ€.
λν λ€λ₯Έ λΆμ κ°μμμ "Lombokμ λ§λ²μ μΈμ κ° λκ°λ₯Ό μΉλ£¨κ² λ©λλ€." λΌλ κ°μλ₯Ό λ€μμ μ΄ μμ΅λλ€.
(μ λ μμ§ λ€νν(?) Lombok μ¬μ©μ λκ°λ₯Ό μΉλ£¨μ§λ μμμ΅λλ€..π)
- JPAμμ μ°κ΄κ΄κ³μ μν°ν°μ @ToString() μ΄λ Έν μ΄μ μ μ μ©νκ² λλ©΄ 무ν μν μ°Έμ‘° λ¬Έμ ..
- JPAμμ μν°ν°μ @Getterμ μ μ©νκ³ , boolean μλ£νμ λ³μλͺ μ΄ isλ‘ μμνλ κ²½μ°(?)
- μλ° <--> μ½νλ¦° λ³ν λ¬Έμ (?)
μ 2λ²μ§Έμ 3λ²μ§Έλ μΌν λ€μ΄λ³΄μλ λ΄μ©μΈμ§λΌ νμ€νμ§λ μμ§λ§, κΈ°ν Lombokμ κΈ°λ₯μ λν΄ μ νν μμ§ λͺ»ν 체 μ¬μ©νλ€λ©΄ μμ κ°μ΄ μ¬μ΄λ μ΄ννΈκ° λ°μν μ μμ΅λλ€.
μ λ μ½λ© κ²½λ ₯μ΄ μΌλ§ μλκΈ°μ Lombokμ μ¬μ©νλ©° λ°μνλ μ¬μ΄λ μ΄ννΈλ μ‘΄μ¬νμ§ μμ§λ§, κ°μΈμ μΌλ‘λ μ΅λν Lombokμ μ§μνμκ³ μκ°μ νμ§λ§ μ€μ νΈλ¦¬ν μ΄λ Έν μ΄μ μ΄ λ무λ λ§κΈ°μ κ°λ°μ ν λ μ’ μ’ μ¬μ©μ ν κ² κ°μ΅λλ€ π€
λ¬Όλ‘ μΆνμ κ°λ°μ νλ©΄μ LombokμΌλ‘ μΈν μμ²λ μν΄ λΉμ©μ κ²ͺκ²λλ€λ©΄,
κ·Έλλ μ΄ κΈμ΄ Lombokμ λν λΉνκ³Ό ν¨κ» μ¬μ©μ μ§μνλΌκ³ λ³κ²½λ μλ μμ΅λλ€ ... π
Lombokμ μ¬μ©μ λν λ€λ₯Έ λΆλ€μ μ견μ μ’ λ νμΈν΄λ³΄κ³ μΆμΌλ©΄ μλ λ§ν¬λ€μ νμΈν΄λ³΄μλ©΄ μ’μ κ² κ°μ΅λλ€!
(μ λ Lombokμ μ¬μ©νλκ² νΈλ¦¬νκΈ° λλ¬Έμ λ§ν¬λ€μ λλΆλΆ Lombokμ μ¬μ©μ μ§μνλΌλ ν¬μ€ν μ΄ λ§μ΅λλ€.)
- https://artofcode.wordpress.com/2018/12/18/dont-use-lombok/
- https://ppbruna.medium.com/why-you-should-not-use-lombok-f7556662e8c3
- https://medium.com/@vgonzalo/dont-use-lombok-672418daa819
- https://stackoverflow.com/questions/3852091/is-it-safe-to-use-project-lombok
- https://blogg.itverket.no/to-lombok-or-not-to-lombok/
μλ κΈμ μ¬λ¬ μ¬λ‘λ₯Ό ν΅ν΄ Lombokμ μ¬μ©μ μ§μνλΌκ³ λμμλ μ’μ κΈμΈκ² κ°μ΅λλ€.
π― References
- https://projectlombok.org/
- https://www.daleseo.com/lombok-popular-annotations/
- https://free-strings.blogspot.com/2015/12/lombok.html
λκΈ