Lombok
Java에서 자주 반복되는 코드(Getter, Setter, 생성자 등.. )들을 어노테이션을 통해 자동으로 생성해 주는 라이브러리이다.
코드를 깔끔하게 작성하여 가독성이 좋은 장점이 있지만, Annotation의 무분별한 사용은 오히려 문제가 될 수 있다.
@, Annotations
@Getter,@Setter
클래스의 맴버 변수들에 대한 getter, setter 메소드를 생성한다.
- 생성된 메소드들은 기본적으로 public
- AccessLevel를 통해 접근제한자를 설정해 줄 수 있다. (PRIVATE, PROTECTED...)
- 원하는 변수에만 Getter 혹은 Setter를 설정해줄 수 있다.
@Getter
public class Member {
private String name;
@Setter(AccessLevel.PRIVATE)
private int age;
}
- age의 setter는 private로 생성된다.
@ToString
toString() 메소드를 생성하여 클래스의 멤버 변수들을 출력 가능하게 한다.
- exclude를 통하여 제외할 필드를 지정할 수 있다.
- callSuper 값을 true로 할 경우 상속받은 클래스의 정보까지 출력된다. (Default = false)
@ToString(exclude = "age")
public class Member {
private String name;
private age;
}
주의!
@ToString 사용시 멤버 변수 중 객체 타입이 있고, 순환 참조가 있다면 무한루프가 발생한다.
해결: exclude키워드를 이용해 명시적으로 해당 필드를 제외시켜야 한다.
- ex) @ToString(exclude=”classA”)
@Builder
빌더 패턴을 적용 시킨 방법으로 객체를 생성 할 수 있다.
@Builder
public class Member {
private String name;
private int age;
}
Member member = Member.builder()
.name(name)
.age(age)
.build();
권장 사용
- @Builder도 private로 만들긴 하지만 @AllArgsConstructor를 내포한다. @Builder를 Class 보다는 직접 만든 생성자 또는 static 객체 생성 메소드에 붙이는 것을 권장
@NonNull
변수에 선언을 하면, 해당 변수는 반드시 값이 있어야한다.
- Setter에 null 값이 들어오면 NullPointerException 예외를 일으킨다.
public class Memeber {
@NonNull
private String name;
private int age;
}
권장 사용
- @NonNULL은 불필요하게 branch coverage를 증가시킨다. Guava, Preconditions로 null을 검증후 오류 처리하는것을 권장
@NoArgsConstructor
파라미터가 없는 기본 생성자를 만들어준다.
- AccessLevel을 통해 접근제한자를 지정할 수 있다.
@NoArgsConstructor
public class Member {
//public Member() {}
}
권장 사용
- @NoArgsConstructor(acess = AccessLevel.PROTECTED)를 사용하여 객체 생성시 안정성을 보장해주는것을 권장한다. 기본 생성자를 public로 열어두면 안정성이 심각하게 저하된다.
@RequireArgsConstructor
final 혹은 @NonNull인 변수만 parameter로 받는 생성자를 생성한다.
- AccessLevel을 통해 접근제한자를 지정할 수 있다.
@AllArgsConstuctor (사용 지양 권장)
클래스의 모든 멤버변수를 parameter로 받는 생성자를 생성한다.
- AccessLevel을 통해 접근제한자를 지정할 수 있다.
문제
@AllArgsConstrucotr
public class Memeber {
private String id;
private String pwd;
}
Member member = new Member("id", "passwrd");
@AllArgsConstrucotr
public class Memeber {
private String pwd;
private String id;
}
Member member = new Member("id", "passwrd");
- 변수의 위치를 바꾸면 생성자의 파리미터 위치도 바뀐다. 개발자가 인지 하지 않으면 치명적인 문제가 발생할 수 도 있다. (두 필드가 동일한 타입일때 문제가 발생하지 않는다.)
권장 사용
public class Member {
private String id;
private String pwd;
@Builder
public Member(String id, String pwd) {
this.id = id;
this.pwd = pwd;
}
}
Member member = Member.builder().id("id).pwd.("pwd").build();
- Builder는 순서가 아닌 이름으로 입력 받는다.
- 직접 생성한 생성자 위에 @Builder 어노테이션을 사용함으로써 개발자가 실수 하는 것을 방지할 수 있다.
@Slf4j
로그를 남기기 위한 어노테이션
@Slf4j
public class Member { }
//어노테이션 사용하지 않았을때
public class Member {
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
}
@EqualsAndHashCode
equals, hashCode 메소드를 생성한다.
- exclude를 통하여 제외할 수 있다.
- callSuper 속성을 통해 equals와 hashCode 메소드 자동 생성 시 부모 클래스의 필드까지 동일한지 안 할지에 대해서 설정할 수 있다. (default : false)
equals : 두 객체의 내용이 같은지 비교하는 연산자
hashCode : 두 객체가 같은 객체인지 비교하는 연산자
@Syncronized
메소드에서 동기화를 설정한다.
@Data (사용 금지 권장)
@Getter, @Setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructor Lombok 어노테이션을 포함한다.
권장 사용
@Data 어노테이션의 사용을 금지하고 필요한 어노테이션을 각각 선언 하는 것을 권장
@Value (사용 지양 권장)
불변의 객체를 선언한다.
- 해당 어노테이션을 사용할 경우 setter 메소드 사용이 불가능하다.
@Value
@Setter //무시된다.
public class Member {
public String name;
public int age;
}
- @Setter 어노테이션이 있어도 사용이 불가능
권장 사용
- @Value 에는 @EqualsAndHashCode, @AllArgsConstructor이 포함된다. @Getter, @ToString 만 사용하는 것을 권장
reference
https://ksshlee.github.io/spring/java/lombok/
'Java' 카테고리의 다른 글
Gradle Wrapper (0) | 2021.06.07 |
---|---|
Gradle (0) | 2021.06.07 |
JAR & WAR (0) | 2021.06.02 |
String Method (0) | 2021.01.13 |
Enum (0) | 2020.12.18 |