spring/study

[Spring] @Data 에 대해서 알아보자

얼킴 2023. 2. 25. 09:58

Java에서 클래스를 정의할 때, 보통 필드(field)와 그에 상응하는 접근자 메소드(getter, setter)를 함께 정의합니다. 이때, 자바 빈(JavaBean) 규약을 따르는 클래스라면, 필드와 메소드를 정의하는 작업이 번거로울 수 있습니다. 이러한 문제를 해결하기 위해 롬복(Lombok) 라이브러리에서는 @Data 어노테이션을 제공합니다.

 

@Data 어노테이션이란?

@Data 어노테이션은 롬복 라이브러리에서 제공하는 어노테이션 중 하나로, 클래스 내부에 정의된 필드에 대해 getter, setter, equals, hashCode, toString 메소드를 자동으로 생성해줍니다. 이렇게 생성된 메소드들은 모두 자바 빈 규약을 따르므로, 자바 빈 규약을 따르는 클래스를 간단하게 정의할 수 있습니다.

예제

먼저 이름과 나이를 가지고 있는 Person 클래스를 만들어보겠습니다.

기존 코드

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age && Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

위 예제에서 Person클래스는 name과 age에 대해서 getter, setter, equals, hashCode, toString 메서드를 생성하여 여러가지 기능을 수행할 수 있습니다. 하지만 필드가 늘어날수록 그에대한 메서드들을 추가해줘야 하기 때문에 코드 가독성도 떨어지고 유지보수도 힘들어 집니다. 이럴 때 @Data 어노테이션을 활용하면 위 코드를 간결하게 바꿀 수 있습니다.

 

바뀐 코드

import lombok.Data;

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

위 예제에서는 @Data 어노테이션을 사용하여 Persone 클래스를 정의합니다. 이렇게 정의된 클래스는 필드와 메서드를 생성하므로 기존 코드와 같이 코드를 작성할 필요가 없습니다.

 

@Data 어노테이션 사용

이제 위에서 정의한 Person클래스를 사용하는 예제를 보도록 하겠습니다.

public class DataTest {
    public static void main(String[] args) {
        Person person = new Person();
        person.setName("홍길동");
        person.setAge(30);
        System.out.println(person.toString());
    }
}

DataTest 클래스에서는 Person 객체를 생성한 후, setter를 사용하여 필드 값을 설정하고, toString() 메소드를 사용하여 객체의 내용을 출력합니다.

위 코드를 실행하면 "Person{name='홍길동', age=30}"와 같이 출력되는 것을 확인할 수 있습니다. @Data 어노테이션으로 생성된 toString() 메소드는 객체의 필드를 포함한 문자열을 반환하므로, 개발자가 별도로 toString() 메소드를 정의하지 않아도 간단하게 객체의 내용을 확인할 수 있습니다.

결론

@Data 어노테이션은 롬복 라이브러리에서 제공하는 어노테이션 중 하나로, 클래스 내부에 정의된 필드에 대해 getter, setter, equals, hashCode, toString 메소드를 자동으로 생성해줍니다. 이렇게 생성된 메소드들은 모두 자바 빈 규약을 따르므로, 자바 빈 규약을 따르는 클래스를 간단하게 정의할 수 있습니다. 따라서, @Data 어노테이션을 사용하면 클래스 정의 작업을 간단하게 할 수 있으며, 필드와 메소드가 자동으로 생성되므로, 생산성을 높일 수 있습니다.