Lombok 이란?
Lombok이란 Annotation(@) 기반으로 코드를 자동으로 완성해주는 라이브러리이다.
Lombok을 사용하면 평소 작성하기 귀찮고 생산성을 떨어트리는 생성자, Getter / Setter, ToSring 등 다양한 코드를 Annotation으로 지정해주는 것만으로 코드를 자동으로 생성할 수 있다.
Lombok을 사용하면 생산성도 높이고 코드 가독성, 유지보수성을 높일 수 있다.
Lombok의 간단한 동작 원리
Java는 컴파일 과정에서 소스코드 / AST / Binary 코드로 번역되면서 컴파일이 진행되는데 Lombok은 이중 AST에 작성된다.
컴파일 시점에 미리 컴파일된 바이트코드를 Annotation Processor를 사용하여 AST(Abstract Syntax Tree)에 코드를 작성한다.
❖ AST(Abstract Syntax Tree)란?
프로그래밍 언어로 작성된 코드를 분석하여 추삭적인 노드 형태의 트리로 구성한 것을 말한다.
Lombok 사용 예제
- @AllArgsConstructor : 해당 객체의 생성자 생성 (모든 인자)
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
↓↓↓
@AllArgsConstructor
class Person {
private String name;
private int age;
}
// 여기 있던 생성자를 작성하지 않아도 된다.
- @Getter / @Setter : 해당 필드에 대한 get() / set() 메서드 생성
@AllArgsConstructor
class Person {
private String name;
private int age;
public String getName() { return this.name; }
public int getAge() { return this.age; }
public void setName(String name) { this.name = name; }
public void setAge(int age) { this.age = age;}
}
↓↓↓
// 클래스안에 있는 모든 필드에 대한 get()/set() 생성
@Getter
@Setter
@AllArgsConstructor
class Person {
private String name;
private int age;
}
// 필드 단위로 get/set() 생성
@AllArgsConstructor
class Person {
@Getter
@Setter
private String name;
@Getter
@Setter
private int age;
}
// 메서드의 접근제어자 세부 설정 가능
@Getter(AccessLevel.PUBLIC)
@Setter(AccessLevel.PRIVATE)
@AllArgsConstructor
class Person {
private String name;
private int age;
}
- @RequiredArgsConstructor : 해당 객체의 생성자 생성 (필수 인자)
class Person {
private final String name;
@Setter
private int age;
public Person(String name) {
this.name = name;
}
}
↓↓↓
@RequiredArgsConstructor
class Person {
private final String name;
@Setter
private int age;
}
Person person = new Person("ABC");
person.setAge(10);
- @NoArgsConstructor : 해당 객체의 생성자 생성 (인자없는 생성자)
@Setter
class Person {
private String name;
private int age;
public Person() {}
}
↓↓↓
@NoArgsConstructor
@Setter
class Person {
private String name;
private int age;
}
- @EqualsAndHashCode : 객체 동등성 비교를 위한 equals, hashcode 생성
Member member_a = new Member(
10, "ABC", "aaron@hello.com");
Member member_b = new Member(
10, "ABC", "aaron@hello.com");
System.out.println(member_a.equals(member_b)); // false
↓↓↓
@EqualsAndHashCode
@AllArgsConstructor
class Member {
private int id;
private String name;
private String email;
}
Member member_a = new Member(
10, "ABC", "aaron@hello.com");
Member member_b = new Member(
10, "ABC", "aaron@hello.com");
System.out.println(member_a.equals(member_b)); // true
// of / exclude 로 사용할/제외할 필드를 지정할 수 있다.
- @FieldDefaults : 필드에 대한 접근제어자 일괄 적용
@RequiredArgsConstructor
class Person {
private final String name;
private final int age;
}
↓↓↓
@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
@RequiredArgsConstructor
class Person {
String name; // String 앞에 private과 final 키워드가 사라짐
int age;
}
- @Builder : 객체 생성의 다른 방법 (생성자 사용하지 않기)
- 특정 변수만을 build하기 원한다면 생성자를 작성하고 그 위에 @Builder를 붙여주면 된다.
- Builder의 장점
- 내가 원하는 필드만 설정할 수 있음
- 생성자와 달리 필드값 주입 순서에 구애받지 않음
- 필드값 주입 역할을 분리할 수 있음
@Builder
class Player {
private String name;
private int age;
private String address;
private int winCount = 0;
private int failCount = 0;
}
Player player = Player.builder()
.name("Aaron")
.age(10)
.address("Earth")
.winCount(10)
.failCount(10)
.build(); // 객체가 생성되는 시점
@Data - 아래 5개의 어노테이션을 한번에 모아 정의해놓은 것
편리함을 극대화시킨 어노테이션이지만 객체의 안정성을 위협하기 때문에 활용을 지양한다.
- @RequiredArgsConstructor → Final 필드에 대해
- @Setter → Non-Final 필드에 대해
- @Getter
- @ToString
- @EqualsAndHashCode
@Value - 아래 3개의 어노테이션을 모아놓은 것이고, 데이터를 불러다 쓸수만 있고 조작은 불가
@Data는 사용하지 않을 함수를 노출하게 되는데 이에 대한 대안이라고 생각하면 된다.
- @Getter
- @ToString
- @EqualsAndHashCode
참고자료
- [ASAC 06 학습자료]
- https://mangkyu.tistory.com/78
'Backend > Java' 카테고리의 다른 글
Exception 예외처리 (0) | 2024.09.25 |
---|---|
JDK / JRE 는 무엇인가? (0) | 2024.09.25 |