자바는 14버전부터 record라는 새로운 기능을 도입하여 데이터 객체(Data Object)를 보다 간결하고 명확하게 정의할 수 있게 되었다. 이번 포스팅에서는 record의 기본 사용법과 특징을 살펴보고, 기존의 DTO(Data Transfer Object)와의 차이점도 함께 알아보겠다.

record란 무엇인가?

record는 불변 객체(immutable object)를 쉽게 생성할 수 있도록 도와주는 자바의 새로운 타입이다. 주로 데이터 전달 객체(Data Transfer Object, DTO)나 값을 담는 컨테이너로 사용된다. record를 사용하면 클래스 작성 시 필수적인 반복 작업들을 자동으로 처리할 수 있다.

기본 사용법

다음은 record를 사용한 간단한 예제이다

public record Person(String name, int age) {}

위의 예제는 Person이라는 레코드를 정의한 것이다. Person 레코드는 두 개의 필드 name과 age를 가진다. 이렇게 정의된 레코드는 다음과 같은 작업들을 자동으로 처리한다.

  1. 필드 정의: String name, int age 필드가 자동으로 정의된다.
  2. 생성자: 모든 필드를 인수로 받는 생성자가 자동으로 생성된다.
  3. 접근자 메서드: name()과 age() 메서드가 자동으로 생성된다.
  4. equals() 및 hashCode(): 필드를 기반으로 한 equals() 및 hashCode() 메서드가 자동으로 생성된다.
  5. toString(): 필드 값을 포함하는 toString() 메서드가 자동으로 생성된다.

사용 예제

public class Main {
    public static void main(String[] args) {
        Person person = new Person("Alice", 30);

        // 자동 생성된 메서드 사용
        System.out.println(person.name()); // 출력: Taeho
        System.out.println(person.age());  // 출력: 32
        System.out.println(person);        // 출력: Person[name=Taeho, age=32]
    }
}

커스터마이징

레코드 클래스는 커스터마이징할 수 있다. 예를 들어, 추가 메서드를 정의하거나 생성자를 커스터마이징할 수 있다.

public record Person(String name, int age) {
    // 추가 메서드
    public String greet() {
        return "Hello, " + name;
    }

    // 커스텀 생성자
    public Person {
        if (age < 0) {
            throw new IllegalArgumentException("Age cannot be negative");
        }
    }
}

위 예제에서는 greet()라는 추가 메서드와 나이가 음수일 경우 예외를 던지는 커스텀 생성자를 정의하였다.

DTO와 record의 차이점

DTO(Data Transfer Object)와 record는 데이터 객체를 정의하는 데 사용되지만, 두 가지 방식에는 몇 가지 차이점이 있다.

  • 보일러플레이트 코드: DTO는 필드 정의, 생성자, getter/setter 메서드, equals(), hashCode(), toString() 메서드를 수동으로 작성해야 한다. 반면 record는 이러한 메서드들을 자동으로 생성하여 보일러플레이트 코드를 크게 줄여준다.
  • 불변성: DTO는 기본적으로 가변 객체(mutable object)로 설계되는 경우가 많다. 그러나 record는 불변 객체로 설계되어, 한 번 생성된 후 변경할 수 없다. 이는 멀티스레드 환경에서 안전성을 보장해준다.
  • 의도 표현: record는 데이터 객체의 의도를 명확하게 표현할 수 있으며, 데이터만 담고 있는 객체임을 쉽게 알 수 있다. 반면, DTO는 일반 클래스와 구별하기 어려울 수 있다.

 

결론

자바의 record는 데이터 중심의 클래스를 쉽게 정의하고 관리할 수 있게 해주는 강력한 도구이다. 이를 통해 코드의 가독성과 유지보수성을 높일 수 있다. DTO와 비교했을 때, record는 보일러플레이트 코드를 줄이고 불변성을 보장하는 등 여러 가지 장점을 제공한다. 앞으로 자바로 데이터 객체를 정의할 때 record를 적극적으로 활용해보자.

+ Recent posts