소프트웨어 개발을 하다 보면, 특히 자바와 같은 언어에서, 많은 보일러플레이트 코드가 발생하곤 합니다.
이러한 코드는 반복적이고 지루하며, 개발자의 생산성을 떨어뜨리는 주요 요인 중 하나입니다.
이런 상황에서 Lombok을 사용하면 코드의 가독성과 유지보수성을 크게 향상할 수 있습니다.
보일러플레이트 코드(boilerplate code)란, 소프트웨어 개발에서 자주 "반복적으로 사용하는 기본적인 코드 블록"을 말합니다.
lombok(롬복)이란❓
lombok(이하 롬복)은 자바 프로젝트를 진행하는데 거의 필수적으로 필요한 메서드/생성자 등을 자동 생성해 줌으로써 반복적인 보일러플레이트 코드를 줄이는 데 도움을 줘서 코드를 절약할 수 있도록 도와주는 라이브러리입니다.
Lombok은 주로 클래스의 어노테이션(annotations)을 이용하여 getter, setter, toString, equals, hashCode 메서드를 자동으로 생성하거나, builder 패턴을 지원하는 기능을 제공합니다. 이 라이브러리를 사용하면 코드의 간결함과 가독성을 높일 수 있습니다.
lombok 라이브러리 추가
1. build.gradle 파일을 열고, Lombok 의존성을 추가합니다.
2. lombok Plugin 추가 (Intellij)
3. lombok 지원 활성화
lombok 클래스 vs 일반적인 클래스
@Getter & @Setter
lombok 사용 전
public class Person {
private String name;
private int age;
// Getter for name
public String getName() {
return name;
}
// Setter for name
public void setName(String name) {
this.name = name;
}
// Getter for age
public int getAge() {
return age;
}
// Setter for age
public void setAge(int age) {
this.age = age;
}
}
위 코드와 같이 lombok을 사용하지 않는 경우, getter와 setter 메서드를 직접 작성해야 합니다.
lombok 사용 후
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class Person {
private String name;
private int age;
}
Lombok의 @Getter와 @Setter 어노테이션을 사용하면, 위와 같이 getter와 setter 메서드를 자동으로 생성하여 클래스 코드를 간결하게 작성할 수 있습니다.
Lombok의 어노테이션을 사용하면 생성자 관련 코드를 다음과 같이 간소화할 수 있습니다
- @NoArgsConstructor
- 기본 생성자를 자동으로 생성합니다.
- @AllArgsConstructor
- 모든 필드를 매개변수로 가지는 생성자를 자동으로 생성합니다.
- @RequiredArgsConstructor
- final 필드와 @NonNull 어노테이션이 붙은 필드를 매개변수로 가지는 생성자를 자동으로 생성합니다.
@NoArgsConstructor
lombok 사용 전
public class Person {
private String name;
private int age;
// 기본 생성자
public Person() {
// 기본 생성자
}
}
lombok 사용 후
import lombok.NoArgsConstructor;
@NoArgsConstructor
public class Person {
private String name;
private int age;
}
@NoArgsConstructor 어노테이션을 사용하면 기본 생성자가 자동으로 생성됩니다.
@AllArgsConstructor
lombok 사용 전
public class Person {
private String name;
private int age;
// 모든 필드를 매개변수로 가지는 생성자
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
@AllArgsConstructor 어노테이션을 사용하지 않으면 "모든 필드를 매개변수로 가지는 생성자"를 직접 작성해야 합니다.
lombok 사용 후
import lombok.AllArgsConstructor;
@AllArgsConstructor
public class Person {
private String name;
private int age;
}
@AllArgsConstructor 어노테이션을 사용하면 "모든 필드를 초기화하는 생성자"가 자동으로 생성됩니다.
@RequiredArgsConstructor
lombok 사용 전
public class Person {
private final String name;
private int age;
// final 필드만을 매개변수로 가지는 생성자
public Person(String name) {
this.name = name;
// age는 기본값으로 초기화됨
}
}
@RequiredArgsConstructor 어노테이션을 사용하지 않으면 "final 필드"와 @NonNull 어노테이션이 붙은 필드에 대한 생성자를 직접 작성해야 합니다.
lombok 사용 후
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
public class Person {
private final String name;
private int age;
}
@RequiredArgsConstructor 어노테이션을 사용하면 "final 필드"와 @NonNull 필드에 대한 생성자가 자동으로 생성됩니다.
@EqualsAndHashCode
Lombok의 @EqualsAndHashCode 어노테이션은 클래스의 equals() 및 hashCode() 메서드를 자동으로 생성해 줍니다.
lombok 사용 전
import java.util.Objects;
public class Person {
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;
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
위와 같이 equals()와 hashCode() 메서드를 직접 작성 해야 합니다.
lombok 사용 후
import lombok.EqualsAndHashCode;
@EqualsAndHashCode
public class Person {
private String name;
private int age;
}
Lombok의 @EqualsAndHashCode 어노테이션을 사용하면 equals()와 hashCode() 메서드를 자동으로 생성할 수 있습니다.
@EqualsAndHashCode
Lombok의 @ToString 어노테이션은 클래스의 toString() 메서드를 자동으로 생성해 주는 기능을 제공합니다.
toString() 메서드는 객체의 문자열 표현을 제공하며, 주로 객체의 상태를 문자열로 쉽게 확인하고 디버깅할 때 유용합니다.
lombok 사용 전
public class Person {
private String name;
private int age;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
@ToString 어노테이션을 사용하지 않으면 toString() 메서드를 직접 작성해야 합니다.
toString() 메서드를 직접 구현해야 하며, 객체의 모든 필드를 문자열로 표현하는 작업을 수동으로 처리해야 합니다.
필드가 많아지면 toString() 메서드의 구현이 번거로워질 수 있습니다.
@Data
lombok 사용 전
public class User {
private String name;
private int age;
private String email;
// Constructor
public User(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
// Getters and Setters
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;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
// toString method
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", email='" + email + '\'' +
'}';
}
// hashCode and equals methods
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return age == user.age &&
Objects.equals(name, user.name) &&
Objects.equals(email, user.email);
}
@Override
public int hashCode() {
return Objects.hash(name, age, email);
}
}
lombok 사용 후
import lombok.Data;
@Data
public class User {
private String name;
private int age;
private String email;
}
Lombok을 사용하면 @Data 어노테이션 하나로 @Getter, @Setter, @ToString, @EqualsAndHashCode, 그리고 기본 생성자를 자동으로 생성합니다.
@Data어노테이션은 클래스의 모든 필드에 대한 getter, setter, toString, equals, hashCode 메서드를 자동으로 구현해 주어, 반복적인 코드를 줄일 수 있습니다.
정말 간단하고 강력한 어노테이션이지만 주의❗️해야 할 점이 있습니다.
- 모든 필드에 대해 getter와 setter가 생성됨
- 민감한 데이터나 불변 객체에는
적합하지 않음.
- 민감한 데이터나 불변 객체에는
- equals와 hashCode의 자동 생성
- 성능 문제나 비교 기준에 주의가 필요함.
- toString 메서드의 자동 생성
- 민감한 정보가 포함될 수 있어 주의가 필요함.
- 불변 객체에 적합하지 않음
- 불변 객체는 @Value를 사용해야 함.
- 상속과 인터페이스
- 상속 구조에서 equals, hashCode, toString의 영향을 고려해야 함.
- 직렬화 문제
- 직렬화 과정에서 필드 처리를 신경 써야 함.
따라서 무분별하게 Setter가 남용될 수 있기 때문에, 변경하면 안 되는 값이 변경될 수 있는 가능성이 생겨 객체의 안전성을 보장할 수 없기 때문입니다.
이러한 주의사항을 고려하여 @Data를 적절히 사용하는 것이 중요합니다.
Lombok은 자바 개발에서 보일러플레이트 코드를 줄여주는 강력한 도구입니다.
특히 VO 클래스와 같이 반복적인 코드 작성이 많은 경우에 Lombok을 사용하면 개발자의 생산성을 높이고, 코드의 가독성과 유지보수성을 크게 향상시킬 수 있습니다.
'Language > Java' 카테고리의 다른 글
[JAVA] Exception vs RuntimeException: 커스텀 예외에서 RuntimeException을 선택하는 이유 (0) | 2024.09.23 |
---|---|
[JAVA] 람다 표현식을 활용한 정렬 기법: 오름차순과 내림차순 (1차원, 2차원) (0) | 2024.07.10 |
[JAVA] 좌표와 2차원 배열 매핑의 이해 (좌표 ➡️ 배열) (0) | 2024.07.01 |
[Java] copyOf(), arraycopy(), copyOfRange() 메서드 알아보기 ✔ (배열 복사 메서드) (0) | 2024.06.16 |
[Java] toBinaryString(), toHexString(), toOctalString() , parseInt() 알아보기 (n진법 변환) (1) | 2024.06.09 |