솔솔
[Java] Lombok이란? 본문
🍀 Lombok이란?
Lombok은 자바의 라이브러리로 코드의 반복을 줄이고 개발 생산성을 높이기 위해 사용됨. 주로 Entity 클래스와 같은 데이터 중심의 클래스에서 유용하며 여러 가지 어노테이션을 통해 컴파일 타임에 자동으로 코드의 일부를 생성해 줌. 이를 통해 개발자는 자주 작성해야 하는 코드(예: getter, setter, 생성자 등)를 직접 작성할 필요 없이 더 간결하고 유지보수하기 쉬운 코드를 작성할 수 있음.
🍀 Lombok의 장단점
1. 장점
- 코드 간결화: 반복적이고 장황한 코드 작성이 줄어들어 코드가 간결해짐.
- 개발 생산성 향상: 필요한 메서드를 자동으로 생성하여 개발 시간을 단축할 수 있음.
2. 단점
- 디버깅의 어려움: 자동으로 생성된 코드가 보이지 않기 때문에 디버깅할 때 문제가 발생할 수 있음
🍀 Lombok의 주요 기능
1. @Getter @Setter
- 필드에 대해 자동으로 getter와 setter 메서드를 생성할 수 있음
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
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;
// }
}
2. @NoArgsConstructor
- 기본 생성자를 자동으로 생성
- 아무런 인자도 받지 않는 생성자를 생성하며, 모든 필드는 기본값으로 초기화됨.
import lombok.NoArgsConstructor;
@NoArgsConstructor
public class Person {
private String name;
private int age;
}
// 자동 생성된 코드
// public Person() {
// }
public class Main {
public static void main(String[] args) {
Person person = new Person();
}
}
3. @AllArgsConstructor
- 모든 필드를 초기화하는 생성자를 자동으로 생성
- 클래스에 존재하는 모든 필드를 매개변수로 받는 생성자를 생성
import lombok.AllArgsConstructor;
@AllArgsConstructor
public class Person {
private String name;
private int age;
}
// 자동 생성된 코드
// public Person(String name, int age) {
// this.name = name;
// this.age = age;
// }
public class Main {
public static void main(String[] args) {
Person person = new Person("Mark", 26);
}
}
4. @RequiredArgsConstructor
- 필수 필드(final 및 @NonNull로 주석이 달린 필드)를 초기화하는 생성자를 자동으로 생성
- final 키워드로 선언된 필드와 @NonNull 어노테이션이 달린 필드를 매개변수로 받는 생성자를 생성
import lombok.RequiredArgsConstructor;
import lombok.NonNull;
@RequiredArgsConstructor
public class Person {
@NonNull
private String name;
private final int age;
private String address; // 이 필드는 생성자에 포함되지 않습니다.
}
// 자동 생성된 코드
// public Person(String name, int age) {
// if (name == null) {
// throw new NullPointerException("name은 @NonNull 필드지만 null값이 들어옴");
// }
// this.name = name;
// this.age = age;
// }
5. @ToString
- toString 메서드를 자동으로 생성할 수 있음
import lombok.ToString;
@ToString
public class Person {
private String name;
private int age;
// 자동 생성화된 코드
// @Override
// public String toString() {
// return "Person{name='" + name + "', age=" + age + "}";
// }
}
public class Main {
public static void main(String[] args) {
Person person = new Person("Mark", 26);
// sysout하면 toString에 의해 객체의 참조값이 아닌 객체의 문자열 표현을 출력
// Person{name='Mark', age=26}
System.out.println(person);
}
}
6. @Builder
- 클래스에 대한 필드 설정 메서드와 build 메서드를 자동으로 생성
import lombok.Builder;
import lombok.Getter;
import lombok.ToString;
@Builder
public class Person {
private String name;
private int age;
// 자동 생성된 코드
// public static class Builder {
// private String name;
// private int age;
// public Builder name(String name) {
// this.name = name;
// return this;
// }
// public Builder age(int age) {
// this.age = age;
// return this;
// }
// public Person build() {
// return new Person(this);
// }
// }
}
public class Main {
public static void main(String[] args) {
Person person = Person.builder()
.name("Mark")
.age(26)
.build();
}
}
7. @EqualsAndHashCode
- equals와 hashCode 메서드를 자동으로 생성
- 객체의 동등성을 비교하고 해시 값을 계산할 때 사용됨
import lombok.EqualsAndHashCode;
@EqualsAndHashCode
public class Person {
private String name;
private int age;
// 자동 생성된 equals 메서드
// @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);
// }
// 자동 생성된 hashCode 메서드
// @Override
// public int hashCode() {
// return Objects.hash(name, age);
// }
// Constructor, getters, and setters can be added as needed
}
8. @Data
- 여러 개의 Lombok 어노테이션을 한 번에 적용
- @Getter, @Setter, @RequiredArgsConstructor, @ToString, @EqualsAndHashCode
import lombok.Data;
@Data
public class Person {
private String name;
private int age;
}
public class Main {
public static void main(String[] args) {
Person person = new Person();
person.setName("Mark");
person.setAge(26);
System.out.println(person); // Output: Person(name=Mark, age=26)
System.out.println(person.getName()); // Output: Mark
System.out.println(person.getAge()); // Output: 26
}
}
🍀 Lombok 설치 및 사용 방법
1. 의존성 추가
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>{버전입력}</version>
<scope>provided</scope>
</dependency>
2. 클래스에 롬복 사용
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.RequiredArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@NoArgsConstructor
@AllArgsConstructor
@RequiredArgsConstructor
@Getter
@Setter
@ToString
public class Person {
private String name
private int age;
}
☁️ 마이 띵킹 ☁️
JPA와 Lombok에서 제공하는 어노테이션을 구분 없이 사용해왔는데 각 어노테이션의 역할과 용도를 정확히 이해하고 적절히 활용하는 것이 중요하다는 것을 깨달았다. 최근 자동화 도구와 라이브러리의 도움으로 개발할 때 무조건 반복적으로 코드를 작성하는 경향이 있었지만 이제는 어노테이션의 정확한 구분을 통해 필요에 따라 적절히 활용할 수 있게 된 것 같다. 무작정 어노테이션을 사용하는 대신 각 어노테이션의 목적과 기능을 이해하고 적재적소에 맞게 사용하는 것이 좋다고 생각하게 된 것 같다..
'나의보물들 > Java' 카테고리의 다른 글
[Java] Scanner vs BufferedReader 차이점 (0) | 2025.02.15 |
---|---|
[Java] JDBC란? (0) | 2024.07.31 |
[Java] MVC (Model-View-Controller) 패턴에서의 예외처리 (3) | 2024.07.27 |
Java에서 Stream을 활용하여 정수 데이터를 처리할 때 왜 반환 타입이 다를까? (0) | 2024.07.15 |
[Java] ConcurrentModificationException 에러 (0) | 2024.07.13 |