Java

Lombok

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://gardeny.tistory.com/4

https://ksshlee.github.io/spring/java/lombok/

https://velog.io/@rosa/Lombok-지양해야-할-annotation

https://cheese10yun.github.io/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