프로젝트 Lombok은 자바 프로젝트에서 보일러플레이트 코드를 줄이기 위한 매우 유용한 도구입니다.
문제 설명
자바 대 다른 언어 논쟁에서 다른 언어 지지자로부터 받는 첫 번째 비난은 자바가 많은 보일러플레이트 코드를 필요로 한다는 것이며, 이를 극복할 수 없으며 방어할 방법이 없다는 것입니다. 동일한 문제가 여러 플랫폼 및 개발자 커뮤니티에서도 보고되었습니다. 보일러플레이트 코드가 포함된 코드 샘플을 살펴보겠습니다.
package com.askrakesh.java.manage_boilerplate;
import java.time.LocalDate;
public class Person {
String firstName;
String lastName;
LocalDate dateOfBirth;
public Person(String firstName, String lastName, LocalDate dateOfBirth) {
super();
this.firstName = firstName;
this.lastName = lastName;
this.dateOfBirth = dateOfBirth;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public LocalDate getDateOfBirth() {
return dateOfBirth;
}
public void setDateOfBirth(LocalDate dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((dateOfBirth == null) ? 0 : dateOfBirth.hashCode());
result = prime * result + ((firstName == null) ? 0 : firstName.hashCode());
result = prime * result + ((lastName == null) ? 0 : lastName.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (dateOfBirth == null) {
if (other.dateOfBirth != null)
return false;
} else if (!dateOfBirth.equals(other.dateOfBirth))
return false;
if (firstName == null) {
if (other.firstName != null)
return false;
} else if (!firstName.equals(other.firstName))
return false;
if (lastName == null) {
if (other.lastName != null)
return false;
} else if (!lastName.equals(other.lastName))
return false;
return true;
}
@Override
public String toString() {
return "Person [firstName=" + firstName + ", lastName=" + lastName + "dateOfBirth=" + dateOfBirth + "]";
}
}
A class should have getter-setters for the instance variables, equals
& hashCode
method implementation, all field constructors and an implementation of toString
method. This class so far has no business logic and even without it is 80+ lines of code. This is insane.
프로젝트 Lombok
프로젝트 Lombok은 자동으로 편집기와 빌드 도구에 플러그인되어 보일러플레이트 코드를 줄이는 자바 라이브러리입니다. 먼저 Lombok 프로젝트를 설정하는 방법을 살펴보겠습니다.
Java 프로젝트 Lombok은 어떻게 작동합니까?
롬복은 컴파일 시간에 처리되는 코드에서 사용할 수 있는 다양한 주석을 가지고 있으며, 사용한 주석에 따라 적절한 코드 확장이 이루어집니다. 롬복은 뷰 타임에만 코드를 줄여주고, 컴파일된 바이트 코드에는 모든 보일러플레이트가 주입됩니다. 이를 통해 코드베이스를 작고 깨끗하며 읽기 쉽고 유지보수하기 쉽게 유지할 수 있습니다.
Project Lombok Maven
프로젝트에 롬복을 추가하는 것은 간단합니다. Maven 프로젝트의 pom.xml 파일에 아래 종속성을 추가하면 됩니다.
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
</dependency>
IDE (Eclipse)에 롬복 플러그인 추가하기
다음은 Windows에서의 설치 단계입니다:
- https://projectlombok.org/download에서 jar 파일을 다운로드하거나 Maven 빌드로 다운로드한 jar 파일을 사용합니다.
- 터미널에서 다음 명령을 실행합니다:
java -jar lombok.jar
- 이 명령은 아래 그림과 같이 창을 열며, 설치하고 설치 프로그램을 종료한 후 이클립스를 재시작합니다.
MacOS에서 롬복을 사용하는 단계는 다음과 같습니다.
Eclipse.app/Contents/MacOS
디렉토리에 lombok.jar를 복사합니다.Eclipse.app/Contents/Eclipse/eclipse.ini
파일의 끝에-javaagent:lombok.jar
를 추가합니다.- 이미지에 표시된대로 Eclipse를 재시작하고 프로젝트 속성에서 “Annotation Processing”을 활성화합니다.
Eclipse 개요에서 Lombok의 표시
설치 이후 축소된 보일러 플레이트 코드를 어떻게 볼 수 있는지 확인해봅시다. PersonLombok
과 동일한 클래스를 다시 생성했습니다. firstName 인스턴스 변수에 설정된 Lombok의 @Getter
및 @Setter
애너테이션을 기반으로 Eclipse 개요에서 firstName의 getter와 setter가 표시됩니다. annotation
Java 바이트 코드에서 Lombok의 표시
클래스 바이트 코드에서 firstName에 대한 getter와 setter 메서드의 추가를 확인할 수 있습니다.
Project Lombok 주석
Project Lombok은 다양한 시나리오에서 보일러 플레이트 코드를 줄이는 데 도움이 되는 많은 주석을 제공합니다. 몇 가지를 살펴보겠습니다.
-
생성자 주석
@AllArgsConstructor public class PersonLombok { @NonNull String firstName; String lastName; LocalDate dateOfBirth; public static void main(String[] args) { new PersonLombok(null, "Kumar", LocalDate.now()); } }
위의 코드는 다음을 클래스에 삽입합니다:
- @AllArgsConstructor에 의해 모든 인수를 갖는 생성자
- @NonNull에 의해 생성자에 전달되는 인수에 대한 null 체크. @NonNull 주석은 메소드의 매개변수로 인수를 전달할 때도 사용할 수 있습니다.
-
Getter/Setter 주석
이러한 주석은 필드 또는 클래스 수준에서 사용할 수 있습니다. 세밀한 제어가 필요한 경우 필드 수준에서 사용하십시오. 클래스 수준에서 사용하면 모든 getter/setter가 생성됩니다. 이전에 생성한 클래스에서 작업해 보겠습니다.
@AllArgsConstructor @Getter @Setter public class PersonLombok { String firstName; String lastName; LocalDate dateOfBirth; }
-
equals, hashCode 및 toString 주석
클래스를 생성하는 동안
hashCode()
및equals()
메서드를 재정의하는 것이 좋습니다. Lombok에서는@EqualsAndHashCode
주석을 사용하여 equals() 및 hashCode() 메서드에 코드를 자동으로 삽입할 수 있습니다. 또한@ToString
주석을 통해 toString() 구현을 제공합니다. 다음을 살펴보겠습니다:@AllArgsConstructor @Getter @Setter @EqualsAndHashCode @ToString public class PersonLombok { String firstName; String lastName; LocalDate dateOfBirth; }
이제 우리는 Lombok 주석의 도움으로 모든 보일러플레이트 코드 없이 Person 클래스를 만들 수 있었습니다. 그러나 더욱 좋은 소식은 위의 클래스에서 사용된 모든 주석을
@Data
로 대체하여 동일한 기능을 얻을 수 있다는 것입니다. -
디자인 패턴 기반 주석
@Builder
는 빌더 패턴을 사용하여 클래스를 인스턴스화 할 수 있는 코드를 자동으로 생성합니다.@Builder public class Employee { String firstName; String lastName; LocalDate dateOfBirth; public static void main(String[] args) { Employee emp = new EmployeeBuilder().firstName("Rakesh") .lastName("Kumar") .dateOfBirth(LocalDate.now()) .build(); } }
@Delegate
는 이 필드로의 호출을 전달하는 대리 메서드를 생성합니다. “상속보다는 구성을 선호하세요“, 하지만 이는 어댑터 패턴과 유사한 많은 보일러플레이트 코드를 생성합니다. 롬복은 이 기능을 구현할 때 Groovy의 동일한 이름의 주석에서 힌트를 얻었습니다. 구현을 살펴보겠습니다:@RequiredArgsConstructor public class AdapterImpl implements Adapter { @Delegate private final Adaptee instance; public static void main(String[] args) { AdapterImpl impl = new AdapterImpl(new Adaptee()); impl.display(); } } interface Adapter { public void display(); } class Adaptee { public void display() { System.out.println("In Adaptee.display()"); } }
롬복은 모든 주석에서 세밀한 제어 기능을 제공합니다.
프로그램 실행 결과는 다음과 같습니다.
@RequiredArgsConstructor
는 특별한 처리가 필요한 각 필드에 대해 1개의 매개변수를 갖는 생성자를 생성합니다. 초기화되지 않은 모든 final 필드와 @NonNull
로 표시된 필드도 매개변수를 받습니다.
보일러 플레이트: 자바 아키텍트는 듣고 있나요?
네, 그렇습니다. 다른 언어와 달리 Java는 이전 버전의 기존 코드를 깨지 않게 업그레이드하는 데 신경을 많이 썼습니다. 이 자체가 큰 작업이며 경시될 수 없습니다. 이미 언어에는 더 나은 타입 추론 기능을 수정하고 구축하고 있습니다. Java 10에서 계획 중인 중요한 기능 중 하나는 지역 변수 타입 추론입니다. 이 기능은 보일러 플레이트 코드를 관리하는 데 작은 역할을 합니다.
요약
보일러 플레이트 코드를 줄이면 가독성이 높아지고 코드가 적어지므로 오류도 줄어듭니다. 프로젝트 롬복은 거의 모든 주요 조직에서 현재 많이 사용됩니다. 롬복에서 가장 유용한 기능을 제공했습니다. 한번 시도해 보시기 바랍니다. 소스 코드: 이 자습서에서 사용된 완전한 소스 코드를 다운로드하려면 깃허브 링크를 방문하십시오.
Source:
https://www.digitalocean.com/community/tutorials/java-project-lombok