자주 사용되는 Lombok annotation

code_able·2024년 5월 14일
0
post-custom-banner

@AllArgsContructor

모든 필드를 인자로 받는 생성자를 자동으로 생성하는 어노테이션입니다.

코드예시

import lombok.AllArgsConstructor;

@AllArgsConstructor
public class MyClass {
    private String field1;
    private int field2;
}
public class MyClass {
    private String field1;
    private int field2;

    public MyClass(String field1, int field2) {
        this.field1 = field1;
        this.field2 = field2;
    }
}

주의사항

  1. 상속 관계에서의 사용: 상속 관계에서 @AllArgsConstructor을 사용할 때는 조심해야 합니다. 부모 클래스에 있는 필드들도 자동으로 생성자에 포함되므로, 서브클래스에서 불필요한 생성자가 만들어질 수 있습니다. 이 경우에는 @AllArgsConstructor 대신 @NoArgsConstructor를 사용하고, 필요한 경우에는 @Setter나 @Builder와 같은 Lombok 어노테이션을 사용하여 필드를 초기화하는 것이 좋습니다.
  1. 불변 클래스에서의 사용: 불변(immutable) 클래스에서 @AllArgsConstructor을 사용할 때는 주의해야 합니다. 불변 클래스의 경우에는 생성자를 통해 한 번 값을 설정하면 변경할 수 없으므로, 외부에서 생성자를 통해 주입되는 값의 무결성을 보장해야 합니다. 따라서 불변 클래스에서는 생성자를 통해 받은 값이 유효한지 검증하는 로직을 추가하는 것이 좋습니다.

  2. 생성자 오버로딩과 충돌 : @AllArgsConstructor을 사용할 때 기존에 직접 정의한 생성자와 충돌할 수 있습니다. 이 경우에는 Lombok 어노테이션의 exclude 옵션을 사용하여 충돌하는 필드를 제외하거나, @NoArgsConstructor와 @AllArgsConstructor을 함께 사용하여 기본 생성자와 모든 필드를 인자로 받는 생성자를 함께 생성하는 것이 좋습니다.

  3. 순서와 가독성: 생성자에 포함되는 필드들의 순서가 중요합니다. 생성자의 인자 순서와 필드의 순서가 일치해야 합니다. 이러한 순서의 일치를 유지하면 가독성을 높일 수 있습니다.

@NoArgsConstructor

매개변수가 없는 기본 생성자를 자동으로 생성할 수 있습니다.

코드예시

import lombok.NoArgsConstructor;

@NoArgsConstructor
public class MyClass {
    private String field1;
    private int field2;
}
public MyClass() {
    
}

주의사항

  1. JPA 엔티티 클래스에서의 사용: JPA 엔티티 클래스에서는 매개변수가 없는 기본 생성자가 필수적입니다. 그렇지 않으면 JPA가 올바르게 엔티티를 생성하지 못할 수 있습니다. 따라서 JPA 엔티티 클래스에서는 @NoArgsConstructor를 사용하여 기본 생성자를 명시적으로 추가하는 것이 좋습니다.

  2. 다른 생성자와의 충돌: @NoArgsConstructor를 사용할 때 기존에 직접 정의한 생성자와 충돌할 수 있습니다. 이 경우에는 exclude 옵션을 사용하여 제외하거나, @AllArgsConstructor과 함께 사용하여 모든 필드를 인자로 받는 생성자를 함께 생성할 수 있습니다.

  3. 불변 클래스에서의 사용: 불변(immutable) 클래스에서는 기본 생성자를 사용하여 객체를 생성할 경우 객체의 상태가 변경되지 않기 때문에 유효한 상태인지를 검증할 수 없습니다. 따라서 불변 클래스에서는 생성자를 통해 초기화하는 것이 좋습니다.

import lombok.NoArgsConstructor;

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class ImmutableClass {
    private final String field1;
    private final int field2;

    public ImmutableClass(String field1, int field2) {
        this.field1 = field1;
        this.field2 = field2;
    }

    // Getter 메서드 생략
}
  1. 직렬화와의 호환성: 직렬화(serialization)에 사용되는 클래스에서는 기본 생성자를 반드시 제공해야 합니다. 그렇지 않으면 직렬화 과정에서 오류가 발생할 수 있습니다. 따라서 직렬화를 고려하는 클래스에서는 @NoArgsConstructor를 사용하여 기본 생성자를 명시적으로 추가하는 것이 좋습니다.

@Getter

클래스의 필드에 대한 getter 메서드가 자동으로 생성됩니다. 이를 통해 외부에서 필드에 접근할 때에는 getter 메서드를 통하여 안전하게 접근할 수 있습니다.

코드예시

import lombok.Getter;

@Getter
public class MyClass {
    private String field1;
    private int field2;
}
public String getField1() {
    return field1;
}

public int getField2() {
    return field2;
}

주의사항

  1. 불변 클래스에서의 사용: 불변(immutable) 클래스에서는 필드에 대한 getter 메서드를 제공하는 것이 일반적입니다. 그러나 setter 메서드를 제공하지 않고, 필드를 초기화한 후에는 변경되지 않도록 만들어야 합니다. 따라서 불변 클래스에서는 @Getter를 사용하여 필드에 대한 getter 메서드를 생성하는 것이 바람직합니다.

  2. 보안 문제: @Getter를 사용하여 모든 필드에 대한 getter 메서드를 생성하면 모든 필드에 대한 읽기 권한이 생깁니다. 따라서 보안에 민감한 정보를 포함하는 클래스에서는 신중하게 사용해야 합니다.

  3. 불필요한 Getter 생성 : 모든 필드에 대해 getter 메서드를 생성하면 필요하지 않은 경우에도 getter 메서드가 생성됩니다. 이는 클래스의 인터페이스를 불필요하게 노출시킬 수 있으므로 주의해야 합니다.

@Setter

클래스의 필드에 대한 setter 메서드가 자동으로 생성됩니다. 이를 통해 외부에서 필드에 값을 설정할 때에는 setter 메서드를 통하여 안전하게 값을 설정할 수 있습니다.

코드예시

import lombok.Setter;

@Setter
public class MyClass {
    private String field1;
    private int field2;
}
public void setField1(String field1) {
    this.field1 = field1;
}

public void setField2(int field2) {
    this.field2 = field2;
}

주의사항

  1. 불변 클래스에서의 사용: 불변(immutable) 클래스에서는 필드의 값을 변경할 수 없도록 만들어야 합니다. 따라서 불변 클래스에서는 @Setter를 사용하여 필드에 대한 setter 메서드를 생성하는 것은 지양해야 합니다.

  2. 보안 문제: @Setter를 사용하여 모든 필드에 대한 setter 메서드를 생성하면 모든 필드에 대한 쓰기 권한이 생깁니다. 따라서 보안에 민감한 정보를 포함하는 클래스에서는 신중하게 사용해야 합니다.

  3. 불필요한 쓰기 권한 제공: 필드에 대한 setter 메서드를 생성하면 필요하지 않은 경우에도 쓰기 권한이 제공됩니다. 이는 클래스의 상태를 불필요하게 변경할 수 있으므로 주의해야 합니다.

@ToString

래스의 toString() 메서드를 자동으로 생성해줍니다. 이를 통해 객체의 내부 상태를 문자열로 표현할 수 있습니다.

코드예시

import lombok.ToString;

@ToString
public class MyClass {
    private String field1;
    private int field2;
}
@Override
public String toString() {
    return "MyClass(field1=" + field1 + ", field2=" + field2 + ")";
}

주의사항

  1. 무분별한 사용: 모든 필드를 포함한 문자열을 생성하기 때문에 클래스의 필드 수가 많을 경우에는 생성된 문자열이 너무 길어질 수 있습니다. 필요한 경우에만 사용하는 것이 좋습니다.

  2. 필드 순서: @ToString은 기본적으로 클래스에 선언된 순서대로 필드를 문자열에 포함시킵니다. 필드의 순서를 변경하려면 @ToString 어노테이션에 includeFieldNames 옵션을 사용하여 필드의 순서를 변경할 수 있습니다.

  3. 순환 참조 문제: 순환 참조가 있는 경우 무한 루프에 빠질 수 있으므로 주의해야 합니다. 이러한 문제가 발생하는 경우 @ToString의 exclude 또는 of 옵션을 사용하여 순환 참조되는 필드를 제외시킬 수 있습니다.

@Data

클래스에 대한 모든 기본적인 메서드들을 자동으로 생성해줍니다. 이는 @Getter, @Setter, @ToString, @EqualsAndHashCode, @NoArgsConstructor 등 여러 어노테이션들을 포함하고 있습니다. 이를 통해 코드의 가독성을 높이고, 중복된 코드를 줄일 수 있습니다.
다른 블로그를 보면 대부분 @Data 사용은 지양하는 것 같다

주의사항

  1. 무분별한 사용: @Data는 모든 필드에 대해 getter와 setter를 생성하기 때문에 보안에 민감한 정보를 포함하는 클래스에서는 신중하게 사용해야 합니다.

  2. 불필요한 메서드 생성: 모든 필드에 대해 getter와 setter를 생성하기 때문에 필요하지 않은 경우에도 생성됩니다. 따라서 클래스의 용도에 따라 적절히 선택하여 사용해야 합니다.

  3. 상속 문제: @Data를 사용하면 클래스에 대한 모든 기본적인 메서드들이 자동으로 생성되기 때문에 상속을 받을 때에도 부모 클래스의 메서드들이 함께 상속됩니다. 이로 인해 의도하지 않은 동작이 발생할 수 있으므로 주의해야 합니다.

reference

profile
할수 있다! code able
post-custom-banner

0개의 댓글