개발 공부/spring

[lombok] @Data의 역할

solutionMan 2023. 7. 1. 19:37
반응형

@Data를 사용하는데  왜  사용하는지 알고싶어서 정리 한 글

 

 

@Data 를 사용하면 적용되는 lombok  어노 테이션 들

@Getter
@Setter
@ToString
@EqualsAndHashCode
@RequiredArgsConstructor
public class Person {
    private String name;
    private int age;
    private String address;
}

 

import lombok.Data;

@Data
public class Person {
    private String name;
    private int age;
    private String address;
}

@Data 적용 결과

public class Main {
    public static void main(String[] args) {
        Person person = new Person();
        person.setName("John Doe");
        person.setAge(30);
        person.setAddress("123 Main St");

        System.out.println(person.getName());    // Output: John Doe
        System.out.println(person);              // Output: Person(name=John Doe, age=30, address=123 Main St)

        Person anotherPerson = new Person();
        anotherPerson.setName("John Doe");
        anotherPerson.setAge(30);
        anotherPerson.setAddress("123 Main St");

        System.out.println(person.equals(anotherPerson));  // Output: true
    }
}

적용 되어지는 어노테이션 역할??

 

@RequiredArgsConstructor

클래스의 모든 final 및 @NonNull 필드에 대한 인수가 있는 생성자를 생성

개체 생성 시 초기화해야 하는 필드가 있을 때 유용

 

@RequiredArgsConstructor 적용 전

public class MyClass {
    private final String field1;
    private final int field2;

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

@RequiredArgsConstructor 적용 후

import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public class MyClass {
    private final String field1;
    private final int field2;

    // RequiredArgsConstructor automatically generates the constructor
}

 

@AllArgsConstructor

이 주석은 최종이 아닌 필드를 포함하여 클래스의 모든 필드에 대한 인수가 있는 생성자를 생성

모든 필드를 한 번에 초기화하는 생성자를 원할 때 유용

 

@AllArgsConstructor  적용 전

public class MyClass {
    private String field1;
    private int field2;

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

@AllArgsConstructor  적용 후

import lombok.AllArgsConstructor;

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

    // AllArgsConstructor automatically generates the constructor
}

 

 

@NonNull

이 주석은 필드를 null이 아닌 것으로 표시하는 데 사용되며, 개체 생성 중에 null이 아닌 값을 제공해야 함

코드 가독성을 향상시키는 데 도움이 되며 사용되는 생성자 또는 메서드에서 null 검사를 생성합니다

 

@NonNull 적용 전 

public class MyClass {
    private String field1;

    public MyClass(String field1) {
        if (field1 == null) {
            throw new IllegalArgumentException("Field1 cannot be null");
        }
        this.field1 = field1;
    }
}

@NonNull 적용 후

import lombok.NonNull;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public class MyClass {
    @NonNull
    private String field1;

    // @NonNull generates null check and exception handling automatically
}

@NonNull 적용 전 

 

@EqualsAndHashCode

주석이 없는 코드에서는 Person 클래스의 equals() 및 hashCode() 메서드를 수동으로 재정의

구현은 각 필드의 동등성을 개별적으로 확인하고 모든 필드를 기반으로 해시 코드를 생성합니다.

 

@EqualsAndHashCode 적용 전

public class Person {
    private String name;
    private int age;
    private String address;

    // Constructors, getters, setters, equals(), and hashCode() methods

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        Person other = (Person) obj;
        if (age != other.age) {
            return false;
        }
        if (name == null) {
            if (other.name != null) {
                return false;
            }
        } else if (!name.equals(other.name)) {
            return false;
        }
        if (address == null) {
            return other.address == null;
        } else {
            return address.equals(other.address);
        }
    }

    @Override
    public int hashCode() {
        int result = name != null ? name.hashCode() : 0;
        result = 31 * result + age;
        result = 31 * result + (address != null ? address.hashCode() : 0);
        return result;
    }
}

@EqualsAndHashCode 적용 후

import lombok.EqualsAndHashCode;

@EqualsAndHashCode
public class Person {
    private String name;
    private int age;
    private String address;
}

 

@EqualsAndHashCode 적용  결과

public class Main {
    public static void main(String[] args) {
        Person person1 = new Person();
        person1.setName("John Doe");
        person1.setAge(30);
        person1.setAddress("123 Main St");

        Person person2 = new Person();
        person2.setName("John Doe");
        person2.setAge(30);
        person2.setAddress("123 Main St");

        System.out.println(person1.equals(person2));  // Output: true

        System.out.println(person1.hashCode());       // Output: 1829164700
        System.out.println(person2.hashCode());       // Output: 1829164700
    }
}

@EqualsAndHashCode 에서 특정 필드 제외하는법

@EqualsAndHashCode(exclude = {"address"})
public class Person {
    // fields and methods
}

이 경우 address 필드는 생성된 equals()hashCode() 메서드에서 제외됩니다.

 

 

 

참고

 

Lombok @Data의 @EqualsAndHashCode이 뭐하는 애일까?

lombok 라이브러리를 애용하다보면, 자주 사용하게 되는 애노테이션들이 있다. (너무 편리하게 애용하고 있다)하지만, 그마저도 자주쓰는 애노테이션끼리 묶어 @Data라는 애노테이션이 있는데, @Get

velog.io

 

반응형